我使用VHDL描述32位乘法器,对于在Xilinx FPGA上实现的系统,我在网上发现经验法则是如果你有N位大小的输入,输出必须是(2 * N)-bits的大小。我将它用于反馈系统,是否可以使用具有与其输入相同大小的输出的乘法器?
我发誓一旦我找到了一个fpga应用程序,其中vhdl代码的加法器和乘法器块与相同大小的信号连接。编写代码的人告诉我,你只需要将产品的结果放在64位信号上,然后输出必须得到结果的最高32位(这不是最重要的32位所必需的) 64位信号)。
当时我使用下一个代码构建一个系统(显然可行):
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity Multiplier32Bits is
port(
CLK: in std_logic;
A,B: in std_logic_vector(31 downto 0);
R: out std_logic_vector(31 downto 0)
);
end Multiplier32Bits;
architecture Behavioral of Multiplier32Bits is
signal next_state: std_logic_vector(63 downto 0);
signal state: std_logic_vector(31 downto 0);
begin
Sequential: process(CLK,state,next_state)
begin
if CLK'event and CLK = '1' then
state <= next_state(61 downto 30);
else
state <= state;
end if;
end process Sequential;
--Combinational part
next_state <= std_logic_vector(signed(A)*signed(B));
--Output assigment
R <= state;
end Behavioral;
虽然我在使用Active-HDL FPGA模拟器模拟模块时工作正常,但我知道我使用Xilinx ISE Design Suite的iSim模拟整个32位系统。我发现我的输出与A和B输入的实际产品有很大的不同,我不知道它是否只是因为跳过32位或者我的代码不好而导致的准确性不足。
答案 0 :(得分:0)
您的代码存在一些问题:
next_state
和state
不属于敏感度列表CLK'event and CLK = '1'
应替换为rising_edge(CLK)
state <= state;
没有效果,导致像ISE这样的工具误读了模式。删除它。state
和next_state
不代表状态机的状态。这只是一个注册。改进代码:
architecture Behavioral of Multiplier32Bits is
signal next_state: std_logic_vector(63 downto 0);
signal state: std_logic_vector(31 downto 0);
begin
Sequential: process(CLK)
begin
if rising_edge(CLK) then
state <= next_state(31 downto 0);
end if;
end process Sequential;
--Combinational part
next_state <= std_logic_vector(signed(A) * signed(B));
--Output assigment
R <= state;
end architecture Behavioral;
答案 1 :(得分:0)
我完全赞同Paebbels所写的一切。但是我会向你解释结果中的位数。 所以我将通过基数10中的例子来解释它。
9 * 9 = 81 (two 1 digit numbers gives maximum of 2 digits)
99 * 99 = 9801 (two 2 digit numbers gives maximum of 4 digits)
999 * 999 = 998001 (two 3 digit numbers gives maximum of 6 digits)
9999 * 9999 = 99980001 (4 digits -> 8 digits)
等等......对于二进制文件来说完全相同。这就是为什么输出是(2 * N)-bits大小的输入。
但是如果你的数字较小,那么结果将适合相同的数字位数,因为:
3 * 3 = 9
10 * 9 = 90
100 * 99 = 990
等等。因此,如果您的数字足够小,那么结果将是32位。当然,正如Paebbels已经写过的那样,结果将是信号中最重要的部分。
正如J.H.Bonarius已经指出的那样,如果您的输入不是整数,而是定点数,那么您将不得不进行后移位。如果是这种情况,请在评论中写下,我将解释该怎么做。