3

我想单独设置 std_logic_vector 的位,以便为单个位或一组位轻松设置注释。这是我所拥有的:

signal DataOut : std_logic_vector(7 downto 0);
...
DataOut <= (                        5=>'1',     -- Instruction defined
                                    4=>'1',     -- Data length control bit, high=8bit bus mode selected
                                    3=>'1',     -- Display Line Number ctrl bit, high & N3 option pin to VDD=3 lines display
                                    2=>'0',     -- Double height font type control byte, not selected
                                    1 downto 0=>"01",   -- Select Instruction table1
                                    others=>'0' -- for bits 6,7
                                    );

但是,我对“downto”语句有疑问,使用 Xilinx ISE 时出现以下错误:

Type std_ulogic does not match with a string litteral

避免使用等效的任何解决方案

1=>'0',
0=>'1',

并允许我逐块设置位?

4

3 回答 3

7

X downto Y => 'A'当 A 是数组的元素时,赋值是正确的。例如,这个片段是正确的:

1 downto 0 => '1',

这个片段是错误的:

1 downto 0 => "01",

因此,您的分配是非法的。作为您的代码,您可以指定为:

DataOut <= (                        5 downto 3 =>'1',     
                                    2 downto 1 =>'0',     
                                    0 => '1',  
                                    others=>'0' 
                                    );

如果要通过数组字段访问/分配,可以使用连接:

DataOut <= Something_0 & Something_1 & "01";

虽然Something_*std_logic_vector

于 2013-03-11T15:34:56.353 回答
3

另一个答案是使用 '&' 进行连接,这会失去命名关联的清晰度,尽管您可以使用命名常量恢复一些自文档

constant Instr_Defined : std_ulogic := '1';
constant Bus_8_Bit     : std_ulogic := '1';

DataOut <= "00" & Instr_Defined
                & Bus_8_Bit
                & '1'     -- description
                & '0'     -- ditto
                & "01";

另一个答案是编写一个函数来创建指令:这可以使主要流程变得非常简单和清晰,同时将指令编码完全分开并放在一个地方,例如在你需要知道指令格式的地方使用的包中(也许在汇编器和 CPU 中)

DataOut <= Encode_Instruction(Instr_Defined, Bus_8_Bit, Font_Mode);

可以在函数体中使用上述任何技术,无论多么冗长。越明确和详细越好;它不会弄乱主要设计,因此除非更改指令格式,否则您很少会看它。

于 2013-03-11T13:43:29.210 回答
2

做这个:

DataOut(7 downto 6)<="00";
DataOut(5)<='1';
DataOut(4)<='1';
DataOut(3)<='1';
DataOut(2)<='1';
DataOut(1 downto 0)<="01";
于 2013-03-11T11:25:20.843 回答