"GENERIC constants" 在 VHDL 中
"GENERIC constants" in VHDL
是否可以根据 GENERIC 输入使用不同的常量?例如:
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 trim 一个离开(使用 generate 和 if)(如果未使用),但这看起来并不优雅。另一个是连接两个常量,因为在我的例子中,常量之间的差异只是常量的大小(即精度)取决于输入宽度,但这对我来说也不是很优雅。还有别的办法吗? (也许有包裹?)
亲切的问候,
书房
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;
所有挥舞的手都快把我逼疯了。没有由连续的“.”组成的语言结构。字符.
您可以在类型声明和函数中使用泛型来填充您的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) 与它自己的通用地图方面。
是否可以根据 GENERIC 输入使用不同的常量?例如:
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 trim 一个离开(使用 generate 和 if)(如果未使用),但这看起来并不优雅。另一个是连接两个常量,因为在我的例子中,常量之间的差异只是常量的大小(即精度)取决于输入宽度,但这对我来说也不是很优雅。还有别的办法吗? (也许有包裹?)
亲切的问候,
书房
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;
所有挥舞的手都快把我逼疯了。没有由连续的“.”组成的语言结构。字符.
您可以在类型声明和函数中使用泛型来填充您的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) 与它自己的通用地图方面。