如何以通用方式编写此代码(状态机使用的计数器可以针对每个项目递增)

时间:2019-11-03 08:27:08

标签: vhdl

我正在尝试以通用方式编写此代码。有没有一种方法可以用通用表达式替换数字。 (1,2,3..max)“最大”将在每个项目和项目期间更改。每次有一个新变量时,我都会在代码末尾再添加一行以自己更改数字。

我尝试写max,max -1,max-2 max-3 ..但是,当max是泛型时,这样做不行。

 case state_counter is
                when max-6 => block_output  <= variable_a;
                when max-5 => block_output  <= variable_b
                when max-4 => block_output  <= variable_c;
                when max-3 => block_output  <= variable_d;
                .....
                when max-1  => block_output  <= something;
                when max    => block_output  <= something_else;
 case state_counter is
                when 1 => block_output  <= variable_a;
                when 2 => block_output  <= variable_b
                when 3 => block_output  <= variable_c;
                when 4 => block_output  <= variable_d;
                .....
                when max-1  => block_output  <= something;
                when max    => block_output  <= something_else;

1 个答案:

答案 0 :(得分:0)

可以解决一些问题,但是您可以将所有变量放入数组中,然后从该数组中选择变量吗?您将必须将变量放入数组中。我没有尝试编译它,但是它应该看起来像这样。

假设输出为slv(7降至0),并且您有通用的MAX可以设置大小

.appxbundle

一种替代方法是以某种方式使用generate语句。您可以尝试使用它来查看是否可以创建一个从指定范围内列出数字和列表的过程。

architecture A1 of example is
 type t_output_array is array (INTEGER range <>) of std_logic_vector(7 downto 0);
 signal output_array : t_output_array(1 to MAX);
 signal I : integer range 0 to MAX; -- To select in the array
begin
 process( CLK )
  begin
   if Rising_edge( CLK ) then
      block_output  <= output_array(I);
    end if;
  end process;
end architecture A1;