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

问题描述

| 我正在尝试将某些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
为了使编译器满意,我需要在该行中进行哪些修改?是否可以使用像这样链接在一起的泛型?     

解决方法

这基本上说您不能使用泛型值进行计算来计算其他泛型(默认值)。 只是将
accum_inc
用作常量,而不是泛型。 同样,SLL(左移逻辑)运算符用于位模式(
ieee.numeric_std
ieee.numeric_bit
包中的
unsigned
signed
数据类型),而不是整数。您可以通过乘以2的幂来完成相同的操作。     ,在我看来,
accum_inc
是一个常数,而不是参数(因为它是根据泛型计算得出的,因此没有理由覆盖它) 因此,它不希望出现在通用部分中,只需将其移至体系结构中并使其恒定即可(正如Philippe所指出的那样,您可以乘以进行移位):
constant accum_inc : integer := (baud * (2**accum_width)) / f_clk;
您可能会发现,泛型的取舍取决于11的值,因此您可能会发现要在泛型和/或计算中使用5的向量。