VHDL - 取决于泛型的条件属性声明

时间:2013-07-05 15:20:51

标签: vhdl

如何编写一个代码段来评估泛型并相应地创建(或不创建)属性?

示例:

if G_MY_GENERIC then
    attribute my_attribute_typ : string;
    attribute my_attribute_typ of signal_having_an_attr : signal is "value";
else
    --nothing is created
end if;

4 个答案:

答案 0 :(得分:4)

完全有可能写出类似的内容,但该属性只能在generate语句的范围内显示。

g_something: if test_condition generate
   attribute my_attribute_typ : string;
   attribute an_attribute of my_attribute_typ: signal is "value";
begin
    -- attribute is visible in this scope

    p_my_process: process(clk)
    begin
        -- attribute is also visible here
    end process;
end generate;

-- but not here

答案 1 :(得分:2)

我们在IEEE VHDL Working Group中讨论了更广义的条件编译。争论激烈了。有些人想要编译时方法(类似于'C'),有些则需要精心设计时间方法。编译时方法在C中运行良好,因为常量也是编译时对象,但是,在VHDL中,编译时方法不能理解VHDL环境中的内容,因此,使用泛型不是一种选择。 OTOH,编译时选项可能会给你供应商名称,工具类型(模拟器,综合......),......

我已将您的代码作为要求添加到提案页面。它位于:http://www.eda.org/twiki/bin/view.cgi/P1076/ConditionalCompilation

如果您愿意分享有关您的应用程序的其他见解,我还想将其添加到该提案中。

答案 2 :(得分:0)

相反,您必须使用类似以下的内容来有条件地设置属性(麻烦,但可以达到结果):

  signal asvRam : svRam_at(0 to gc_nFifoDepth-1) := (others => (others => '0'));

  type svStr_at is array(boolean) of string(0 to 10);
  constant c_svRamStyle : svStr_at := (false => "           ", true => "distributed");
  attribute ram_style : string;
  attribute ram_style of asvRam : signal is c_svRamStyle(gc_bDistributedRam);

答案 3 :(得分:-2)

基本上:这正是VHDL如何 而不是 的工作方式。在VHDL中,您声明了使用特定硬件位的意图,然后合成器尝试连接这些硬件位。任何动态创建像for ... generate循环这样的硬件的外表基本上只是一个外表:语法糖来消除痛苦。

您可以做的是有条件地分配给信号/变量:

process (sig1, sig2, enable) is
begin
  if enable = '1'
  then
    out <= sig1;
  else
    out <= sig2;
  end if;
end process;