gpt4 book ai didi

vhdl - 如何在 VHDL 的端口声明中使用从通用参数计算得出的常量?

转载 作者:行者123 更新时间:2023-12-02 20:29:46 25 4
gpt4 key购买 nike

一个例子是一个通用寄存器文件,我试图像这样实现:

entity register_file is
generic(reg_width: integer := 32; reg_num: integer := 16);
constant sel_num: integer := integer(CEIL(LOG(Real(reg_num))));
port (
data_in: in std_logic_vector(reg_width - 1 downto 0);
data_out: out std_logic_vector(reg_width - 1 downto 0);
rd_sel: in std_logic_vector(sel_num - 1 downto 0);
wr_sel: in std_logic_vector(sel_num - 1 downto 0);
rd_enable: in std_logic;
wr_enable: in std_logic;
clock: in std_logic;
);
end register_file;

这不起作用,因为它看起来很通用,并且端口必须是前两个声明,然后是其他声明。如果我在端口声明之后移动类型和常量,则在处理端口声明时它们不可见。

我是 VHDL 新手,我认为这应该是一个常见问题,但我找不到解决方案。显然,我想避免复制粘贴解决方案。

最佳答案

如果reg_num没有其他用途,只需将sel_num设为通用即可。

否则,编写一个名为 sel 的函数,将 reg_num 转换为另一种自然数。问题是,该函数放在哪里?

在我的设计中,我倾向于将许多常见的数据类型、声明、函数和时钟周期 (*) 放在名为 common 的包中。

package common is
function sel(n : natural) return natural;
constant clock_period : time := 1 sec / 32000000;

constant num_regs : natural := 16;
subtype sel_word is std_logic_vector(sel(num_regs) downto 0);
end common; -- package body contains the function body

然后我的实体看起来像

use Work.common.all;

entity register_file is
generic(reg_width: integer := 32; reg_num: integer := 16);
port (
rd_sel: in std_logic_vector(sel(reg_num) downto 0); -- OK
wr_sel: in sel_word; -- better?
...

如果设计的不同部分需要不同的“regnum”值,则应首选通用方法。

否则,将这些详细信息放在“common”中可以让您使用单个文件对整个设计进行参数化,并且不会出现某些泛型的硬编码(并且可能是错误的)值的风险。

(*) 为什么是时钟频率?从一个参数缩放所有定时延迟、波特率参数、内存等待状态等是非常有用的,因为我知道当我更改时钟时它们都将保持正确......

关于vhdl - 如何在 VHDL 的端口声明中使用从通用参数计算得出的常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20072851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com