我想分别设置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',
并允许我逐块设置?
答案 0 :(得分:7)
当A是数组的元素时,赋值X downto Y => '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
答案 1 :(得分:3)
另一个答案是使用'&amp;'连接,这会失去命名关联的清晰度,尽管你可以使用命名常量恢复一些自我文档
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);
可以在函数体中使用上述任何技术,无论多么详细。越明确越详细越好;它不会使主要设计混乱,所以除非改变指令格式,否则你很少会看到它。
答案 2 :(得分:2)
这样做:
DataOut(7 downto 6)<="00";
DataOut(5)<='1';
DataOut(4)<='1';
DataOut(3)<='1';
DataOut(2)<='1';
DataOut(1 downto 0)<="01";