vhdl - 在 VHDL 元编程中强制字符串作为集合的成员
问题描述
我正在用 VHDL 编写一个通用乘法器,它应该能够被实例化以处理有符号和无符号因子的任何组合。
我的理解是,为了从单个通用实体进行有符号和无符号乘法的所有 4 种组合,并且因为没有数据类型/端口可以同时接受有符号和无符号值(无多态性),我需要将这两个因子作为 std_logic_vectors 传递,并根据它们的符号性将它们重铸为有符号或无符号。
为了给我的 generic_multiplier 提供我的因子的符号,因为符号是静态的,我决定将字符串“signed”或“unsigned”作为通用参数传递。根据这些语句,生成语句将负责从 std_logic 到可乘因子的必要类型转换和符号扩展。
如果用户在通用模板实例化期间将“签名”或“无符号”以外的任何字符串传递给我的签名参数,我希望我的模块抛出错误。我可以想到一种使用 if 语句的特殊方法来执行此操作,但是我有什么方法可以定义一组对所有乘法器模块通用的字符串(即 {"signed", "unsigned"}),以及如果我的输入字符串未能位于该集合内,则引发编译器错误?
我知道这可以通过 SystemVerilog 容器或元编程库实现,但我认为我无法说服我的团队使用这些工具,并且想知道是否有任何此类构造可以帮助在基本 VHDL 中进行元编程。
解决方案
声明一个有符号*无符号函数可能更容易,因为数字标准中已经存在有符号*有符号和无符号*无符号。然后将类型和函数作为泛型传递给实体(使用 VHDL 2008)?这样,它强制用户定义乘法函数。如果您已经有 4 个选项可用,那么您已经涵盖了所有基础。如果用户想使用其他一些古怪的类型,他们还必须为它定义一个“*”函数。
function "*" (l : signed; r : unsigned) return signed;
function "*" (l : unsigned; r : signed) return signed;
entity mult_generic is
generic (
type op1_t;
type op2_t;
type mult_t;
function "*" (l : op1_t; r: op2_t) return mult_t is <>;
);
port (
clk : in std_logic;
op1 : op1_t;
op2 : op2_t;
mult : mult_t;
);
end entity mult_generic;
architecture rtl of mult_generic is
begin
process(clk)
begin
if rising_edge(clk) then
mult <= op1 * op2;
end if;
end process;
end architecture;
....
--example
mult_inst : entity work.mult_generic
generic map (
op1_t => unsigned;
op2_t => signed;
mult_t => signed;
)
port map (
--etc
);
推荐阅读
- c++ - C++ 在共享库中使用导出的定义作为内联
- python - 递归函数调用和/或循环不按预期重复
- ios - apple-app-site-association 正确配置
- xml - JMETER JDBCRequest 调用带有 xml 输入的存储过程
- java - 如何在openApi/springfox-swagger2中为不同的状态码定义不同的响应模型
- curl - 对 GraphQL 的 curl 查询在 Insomnia 和 Postman 中给出 403
- java - 如何在正文中发布原始类型的 JSON 数据?
- ios - 滚动时滚动视图中的视图位置出现故障
- r - 在R中使用like运算符删除列名
- php - 比较字符串在php中没有得到正确的结果