VHDL中的参数化常量

时间:2018-09-20 16:16:34

标签: generics vhdl

我正在设计一条通用数据路径,其中一部分是不同解码器使用的恒定模式。例如:

NBITS = 4->常数将为“ 1000”

NBITS = 5->常数将为“ 10000”

NBITS = 16->常量将为“ 1000_0000_0000_0000”

我发现以下方法可以解决问题: {{1}}

但是可惜没有编译并产生错误:非静态选择会排除其他选择。

如何指定作为通用参数的函数的恒定位模式?

1 个答案:

答案 0 :(得分:4)

有一个要求,就是当一个选项有多个时,聚合必须具有本地静态选项。 (用于确定表达式值的代码是在分析时构造的。)

IEEE Std 1076-2008 9.3.3.3数组汇总第6段:

  

除了具有单个选择 others 的最终元素关联之外,数组集合的其余(如果有)元素关联应全部为位置或全部命名。仅当集合包含单个元素关联且该元素关联具有单个选择时,才允许数组聚合的命名关联具有非局部静态的选择,或者同样具有null范围的选择。如果适用的索引约束是局部静态的,则 others 选择是局部静态的。

可以通过详细说明(14.4.2.5对象声明)的函数调用(表达式,9.3.4函数调用)提供常量(6.4.2.2常量声明)的值表达式或变量或信号的初始表达式。 )。该功能可能不纯正(4.子程序和软件包,4.1常规,9.4.3全局静态基数,注2)。

构造Minimal, Complete, and Verifiable example可以证明这一点:

library ieee;
use ieee.std_logic_1164.all;

ravenwater_mcve is
    generic (NBITS: natural := 42);
end entity;

architecture foo of ravenwater_mcve is
    impure function leftbit return std_logic_vector is
        variable retv:  std_logic_vector (NBITS - 1 downto 0) := 
                          (others => '0');
    begin
        retv(retv'LEFT) := '1';
        return retv;
    end function;
    constant NaR: std_logic_vector(NBITS - 1 downto 0) := leftbit;
    -- (NBITS - 1 => '1', others => '0');
begin
end architecture;

MCVe进行分析,阐述和模拟。

您可以添加一个过程来确定值表达式是否正确:

RESULT:
    process
    begin
        report "NaR = " & to_string(NaR);
        wait;
    end process;

如果使用-2008之前的VHDL标准修订版,请提供to_string函数:

    function to_string (inp: std_logic_vector) return string is
            variable image_str: string (1 to inp'length);
            alias input_str:  std_logic_vector (1 to inp'length) is inp;
    begin
        for i in input_str'range loop
            image_str(i) := character'VALUE(std_ulogic'IMAGE(input_str(i)));
        end loop;
        return image_str;
    end function;

这会产生:

  

ghdl -r ravenwater_mcve
  ravenwater_mcve.vhdl:33:9:@ 0ms :(报告注释):NaR = 100000000000000000000000000000000000000000000000

(也许我应该为通用常量使用较小的默认值。)

您还可以将泛型的值作为参数传递给纯函数。