VHDL乘法器,其输出具有与其输入相同的一侧

时间:2017-04-23 23:26:16

标签: vhdl fpga xilinx-ise

我使用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位或者我的代码不好而导致的准确性不足。

2 个答案:

答案 0 :(得分:0)

您的代码存在一些问题:

  1. next_statestate不属于敏感度列表
  2. 撰写CLK'event and CLK = '1'应替换为rising_edge(CLK)
  3. state <= state;没有效果,导致像ISE这样的工具误读了模式。删除它。
  4. 在操作员周围放置空格并不会造成伤害,但会提高可读性。
  5. 为什么期望a * b的结果在30到61位而不是0到31?
  6. statenext_state不代表状态机的状态。这只是一个注册。
  7. 改进代码:

    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已经指出的那样,如果您的输入不是整数,而是定点数,那么您将不得不进行后移位。如果是这种情况,请在评论中写下,我将解释该怎么做。