如何编写一个代码段来评估泛型并相应地创建(或不创建)属性?
示例:
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;
答案 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;