让我们说我们有一个测试平台的行为VHDL程序:
procedure jtag_load_data(data : in std_ulogic_vector) is
begin
jtag_clock(1, '1', '0');
jtag_clock(2, '0', '0');
for i in data'length-1 downto 1 loop
jtag_clock(1, '0', data(i));
end loop;
jtag_clock(2, '1', data(0));
jtag_clock(1, '0', data(0));
end procedure;
可以使用常量参数调用此过程,如此
jtag_load_data("100")
或参数可以像其他人一样计算
jtag_load_data(tmasrc & tdosrc & tm)
从VHDL arrays don't define the index order开始,我认为在data
循环中处理for
的位的顺序取决于调用过程时data
参数的索引。
如果不清楚,请说a
的类型为std_logic_vector(3 downto 0)
,而b
的类型为std_logic_vector(0 to 3)
,我们会执行以下操作:
a <= "100";
b <= "100";
jtag_load_data(a);
jtag_load_data(b);
为a
处理的位为1, 0, 0
,而对于b
,它们将为0, 0, 1
。
回到我最初的两个调用示例,对于参数是std_logic_vector
s的串联的情况,这是一个问题:表达式tmasrc & tdosrc & tm
(所有三个操作数都是{{1}类型})似乎评估为std_logic_vector(n downto 0)
,它反转了处理位的顺序,相对于我只用其中一个参数调用过程的情况(或一个常量,似乎默认为{{} 1}}索引排序)。
为了解决这种歧义,我们可以引入一个带有已知索引顺序 std_logic_vector(0 to m)
的变量,如下所示:
downto
但我想知道是否有更优雅的VHDL语法可以说
ordered_data
值解释为具有递减索引”或procedure jtag_load_data(data : in std_ulogic_vector) is
variable ordered_data : std_ulogic_vector(data'length-1 downto 0);
begin
ordered_data := data;
jtag_clock(1, '1', '0');
jtag_clock(2, '0', '0');
for i in ordered_data'length-1 downto 1 loop
jtag_clock(1, '0', ordered_data(i));
end loop;
jtag_clock(2, '1', ordered_data(0));
jtag_clock(1, '0', ordered_data(0));
end procedure;
”中连接时生成data
递减索引。答案 0 :(得分:2)
如果您未在std_ulogic_vector
(或std_logic_vector
)输入procedure
(或function
)上指定范围,则程序< / em>左侧位始终为0,位数从左向右增加。这是因为声明了std_ulogic_vector
:
type std_ulogic_vector is array (natural range <>) of std_ulogic;
并且因为索引类型是左手值为0的natural
,所以左手元素总是带有无约束参数的编号为0。这是完全相同的对于std_logic_vector
,它以相同的方式声明。
编号不从程序外部传入。无论左侧外部,程序(实际)的编号为 in 程序( formal ) 。
所以,在你的例子中:
如果不清楚,请说a是std_logic_vector类型(3 downto 0)和b的类型为std_logic_vector(0到3),我们执行以下操作:
a&lt; =“100”; b&lt; =“100”; jtag_load_data(一); jtag_load_data(B);
a和b将以完全相同的方式处理;没有区别; a的类型为std_logic_vector(3 downto 0),b的类型为std_logic_vector(0到3)这一事实无关紧要。
因此,要回答您的具体问题:您需要确保输入以正确的顺序传递到过程中。如果这不好,那么你需要传入一些其他参数来控制方向。