VHDL std_logic_vector索引与“downto”

时间:2013-03-11 10:59:35

标签: indexing vhdl

我想分别设置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',

并允许我逐块设置?

3 个答案:

答案 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";