【发布时间】:2022-01-15 18:21:12
【问题描述】:
我必须编写一个 VHDL 代码来计算 10^x 函数,用于计算 x 介于零和九之间(包括零和九)的整数值。实体应有一个 4 位无符号整数 (std_logic_vector) 类型输入和一个 32 位无符号整数 (std_logic_vector) 类型输出。 32 位宽度足以满足 10^9 的需求。我必须为解决方案使用 LUT(查找表)逻辑。为此,我应该在架构块中使用信号分配和 with-select 结构,而不使用该过程。通过使用 with-select,我将通过固定分配确定 x 的每个值的输出 (LUT)。
开始合成时出错: 分配中的宽度不匹配;目标有 32 位,源有 1 位
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity main is
Port (
input : in std_logic_vector(3 downto 0);
output: out std_logic_vector(31 downto 0)
);
end main;
architecture Behavioral of main is
begin
with input select
output <= "00000000000000000000000000000001" when "0000", --10^0
"00000000000000000000000000001010" when "0001", --10^1
"00000000000000000000000001100100" when "0010", --10^2
"00000000000000000000001111101000" when "0011", --10^3
"00000000000000000010011100010000" when "0100", --10^4
"00000000000000011000011010100000" when "0101", --10^5
"00000000000011110100001001000000" when "0110", --10^6
"00000000100110001001011010000000" when "0111", --10^7
"00000101111101011110000100000000" when "1000", --10^8
"00111011100110101100101000000000" when "1001", --10^9
"0" when others;
end Behavioral;
【问题讨论】:
-
我的 VHDL 有点生疏,但值得尝试
"00000000000000000000000000000000" when others;吗?"0"确实匹配错误消息... -
成功了,谢谢! “00000000000000000000000000000000”当其他人时;
-
或者(更简单)
(others => '0') when others; -
IEEE Std 1076-2008 14.7.3.4 Signal update "如果 S 是复合信号(包括数组的切片),则 S 的有效值隐式转换为 S 的子类型。转换检查 S 的每个元素在有效值中是否存在匹配元素,反之亦然。如果此检查失败,则会发生错误。字符串文字“0”中只有一个元素。还有
(output'range => '0') when others;,其中'range也可以是'reverse_range以及user_1818839 的(others => '0')。另请参阅 9.3.6 类型转换、9.3.3.3 数组聚合。