"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) 与它自己的通用地图方面。