" GENERIC常数"在VHDL中

时间:2016-03-13 20:20:56

标签: vhdl

是否可以根据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)如果没有使用它,但看起来并不优雅。另一个是连接两个常量,因为在我的例子中,常量之间的差异只是常量的大小,即精度,取决于输入的宽度,但对我来说这也不是很优雅。还有其他方法吗? (也许有包装的东西?)

亲切的问候,

2 个答案:

答案 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)和它自己的通用映射方面。