如何使用依赖于实体的其他通用参数的通用参数?

时间:2011-05-24 01:43:49

标签: syntax vhdl

我正在尝试转换一些Verilog代码,该代码从UART模块的更快时钟产生更慢的时钟。原始的verilog代码基于fpga4fun.com上的模块,这是我尝试将其翻译为基于VHDL的设计。

entity baud_generator is
generic(
    f_clk : integer := 50000000;  -- default: 50 MHz
    baud  : integer := 115200;    -- default: 115,200 baud
    accum_width : integer := 16;
    accum_inc : integer := (baud sll accum_width) / f_clk
);
port(
    clock : in std_logic;
    reset_n : in std_logic;
    enable : in std_logic;
    baud_clock : out std_logic
);  
end entity baud_generator;

但是,我的编译器Aldec-HDL不喜欢以下行:

 accum_inc : natural := (baud sll accum_width) / f_clk

以下是确切的错误消息:

 # Error: COMP96_0300: baud_generator.vhd : (20, 52): Cannot reference "f_clk" until the interface list is complete.
 # Error: COMP96_0300: baud_generator.vhd : (20, 28): Cannot reference "baud" until the interface list is complete.
 # Error: COMP96_0071: baud_generator.vhd : (20, 28): Operator "sll" is not defined for such operands.
 # Error: COMP96_0104: baud_generator.vhd : (20, 27): Undefined type of expression.
 # Error: COMP96_0077: baud_generator.vhd : (20, 27): Assignment target incompatible with right side. Expected type 'INTEGER'.

在verilog中,我有类似的东西:

module baud_generator(
  input clock,
  input reset_n,
  input enable,
  output baud_clock
);
parameter f_clock = 50000000;
parameter baud    = 115200;
parameter accum_width = 16;
parameter accum_inc = (baud << accum_width) / f_clock;
//...
endmodule

我需要在该行中修改以使编译器满意吗?是否可以像这样使用链接在一起的泛型?

2 个答案:

答案 0 :(得分:6)

这基本上说你不能用通用值来计算其他泛型的caluclate(默认值)。

只需使用accum_inc作为常量,而不是通用。

此外,SLL(左移位逻辑)运算符用于unsignedsigned包中的位模式(ieee.numeric_stdieee.numeric_bit数据类型,而不是整数。您可以通过乘以2的幂来做同样的事。

答案 1 :(得分:2)

我认为accum_inc是一个常数,而不是一个参数(因为它是从泛型中计算的,所以没有理由覆盖它)

因此,它不希望成为通用部分 - 只需将其移至架构并使其成为常量(正如Philippe所说,使用乘法进行移位):

constant accum_inc : integer := (baud * (2**accum_width)) / f_clk;

您可能会发现integer可以管理的内容溢出,具体取决于泛型的值,因此您可能会发现要在泛型和/或计算中使用unsigned向量。 / p>