是否可以根据GENERIC输入使用不同的常量? E.g:
entity smth is
generic(
constant_width : integer := 32
);
end smth;
architecture Behavioral of smth is
if(constant_width = 32) then
constant ROM_tan : rom_type := ( .....
....
);
else
constant ROM_tan : rom_type := ( ....
);
);
begin
.
.
一个解决方法是创建两个常量,让Vivado修剪掉一个(使用generate和if)如果没有使用它,但看起来并不优雅。另一个是连接两个常量,因为在我的例子中,常量之间的差异只是常量的大小,即精度,取决于输入的宽度,但对我来说这也不是很优雅。还有其他方法吗? (也许有包装的东西?)
亲切的问候,
传
答案 0 :(得分:4)
generate
语句具有声明性区域,就像体系结构一样。
label : if (condition) generate
constant myConst ....
begin
-- ...
end generate;
您甚至可以在此区域中声明新类型。对block
语句也是如此。
所以重写你的例子给出:
entity smth is
generic(
constant_width : integer := 32
);
end smth;
architecture Behavioral of smth is
begin
gen1 : if (constant_width = 32) generate
type ROM_type is ...
constant ROM_tan : ROM_type := (..);
begin
-- ...
end generate;
gen2 : if (constant_width /= 32) generate
type ROM_type is ...
constant ROM_tan : ROM_type := (..);
begin
-- ...
end generate;
end architecture;
答案 1 :(得分:3)
所有挥动的手都让我疯狂。没有包含连续'。'的语言结构。字符。击>
您可以在类型声明和函数中使用泛型来填充ROM:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity smth is
generic (
constant_width : integer := 32
);
end entity smth;
architecture foo of smth is
type rom_type is array (0 to 129) of
signed (constant_width - 1 downto 0);
function fill_rom return rom_type is -- if we're going to get all hand wavy
variable ret_val: rom_type;
begin
for i in rom_type'range loop
ret_val(i) := to_signed(i,constant_width); -- all look like 45 from here
end loop;
return ret_val;
end function;
constant ROM_tan: rom_type := fill_rom; -- to constant_width accuracy
begin
-- imagine a boat load of lines with three or more periods here.
end architecture;
这个示例实际上是分析,阐述和模拟(虽然字面上没有做任何事情)。
您也可以向后移动泛型(到包),也可以移动该函数。如果合成一直赶上你可以使用包实例化(-2008)和它自己的通用映射方面。