如何使常量二进制数适配VHDL中的Generic通用声明?
VHDL通用组件中如何根据Generic参数自动扩展比较值的宽度?
我正在编写一个VHDL通用组件,用于判断输入数值是否等于1(采用WHEN ELSE语句实现),代码如下:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; ENTITY isone IS GENERIC ( N: integer ); PORT (a : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0); equals : OUT STD_LOGIC); END isone; ARCHITECTURE rtl OF isone IS BEGIN equals <= '1' WHEN A = "0001" ELSE '0'; END rtl;
我的问题是:当Generic参数N的值为8时,如何让语句equals <= '1' WHEN A = "0001" ELSE '0';中的"0001"自动扩展为对应N位的宽度?我想到的替代方案是用a-a +'1',但该方案并不理想。
解决方案
方法1:使用聚合语法直接构造对应宽度的向量
这是最简洁直观的方式,利用VHDL的聚合语法生成N位的向量,仅最低位为'1',其余位为'0',完美匹配数值1的N位表示:
equals <= '1' WHEN A = (0 => '1', others => '0') ELSE '0';
这种写法不需要依赖任何额外的转换函数,直接适配Generic参数N的任意合法取值,可读性和维护性都很强。
方法2:利用类型转换函数生成指定宽度的数值1
如果你习惯使用标准库的转换函数,可以借助to_unsigned(来自ieee.numeric_std库)将整数1转换为N位的unsigned类型,再转为std_logic_vector进行比较:
首先需要替换原有的库引用为更规范的numeric_std:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.numeric_std.all; -- 替换原有的std_logic_unsigned
然后修改比较语句:
equals <= '1' WHEN A = std_logic_vector(to_unsigned(1, N)) ELSE '0';
如果坚持使用std_logic_unsigned库,也可以用该库提供的conv_std_logic_vector函数:
equals <= '1' WHEN A = conv_std_logic_vector(1, N) ELSE '0';
这两种方法都比你提到的a-a +'1'方案更清晰,逻辑意图明确,避免了不必要的运算操作。
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

