我们可以限制过程的数组参数的索引顺序吗?

时间:2016-11-23 00:51:53

标签: arrays indexing vhdl

让我们说我们有一个测试平台的行为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递减索引。

1 个答案:

答案 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)这一事实无关紧要。

因此,要回答您的具体问题:您需要确保输入以正确的顺序传递到过程中。如果这不好,那么你需要传入一些其他参数来控制方向。