2015-06-16 4 views
1

Я новичок в VHDL и пытаюсь скопировать алгоритм умножения Бута. Я использую Xilinx и когда я синтезировать мой код, я в конечном итоге с большим количеством предупреждений:Алгоритм умножения бухты

  • Upper назначен, но никогда не используется,
  • Product используется, но никогда не назначен,
  • LowerPrevLSB назначается но никогда не использовал,
  • Lower назначен, но никогда не используется,
  • назначен, но никогда не используется,
  • Z га S постоянное значение 0,
  • Product имеет постоянное значение, равное 0.

Я думал, что я назначен и написал код правильно, но, видимо, я не являюсь. Любые советы и помощь будут оценены.

library IEEE; 
use IEEE.NUMERIC_STD.ALL; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_arith.ALL; 
use IEEE.STD_LOGIC_unsigned.ALL; 

-- Uncomment the following library declaration if using 
-- arithmetic functions with Signed or Unsigned values 
--use IEEE.NUMERIC_STD.ALL; 

-- Uncomment the following library declaration if instantiating 
-- any Xilinx primitives in this code. 
--library UNISIM; 
--use UNISIM.VComponents.all; 

-- X * Y = Z 
entity BoothMultiplier is 
    generic 
    (
     numBits_X : integer := 8; 
     numBits_Y : integer := 8 
    ); 
    port 
    (
     CLK : in std_logic; 
     X : in std_logic_vector((numBits_X - 1) downto 0); 
     Y : in std_logic_vector((numBits_Y - 1) downto 0); 
     Z : out std_logic_vector((numBits_X + numBits_Y - 1) downto 0) 
    ); 

end BoothMultiplier; 

architecture Behavioral of BoothMultiplier is 

    -- Two's Complement Function 
    function TwosComplement(inputNum : std_logic_vector) return std_logic_vector; 

    function TwosComplement(inputNum : std_logic_vector) return std_logic_vector is 
     variable temp : std_logic_vector(inputNum'range); 
     begin 
      temp := (not inputNum) + 1; 
      return temp; 
    end TwosComplement; 
    -- End Two's Complement Function 

    -- MIN Function 
    function MIN(Left, Right : integer) return integer; 

    function MIN(Left, Right : integer) return integer is 
    begin 
     if Left < Right then return Left; 
     else return Right; 
     end if; 
    end Min; 
    -- End MIN Function 

    -- MAX Function 
    function MAX(Left, Right : integer) return integer; 

    function MAX(Left, Right : integer) return integer is 
    begin 
     if Left > Right then return Left; 
     else return Right; 
     end if; 
    end MAX; 
    -- End MAX Function 

    -- Signals 
    signal Upper : std_logic_vector(MAX(numBits_X, numBits_Y) - 1 downto 0) 
        := (others => '0'); 
    signal Lower : std_logic_vector(MIN(numBits_X, numBits_Y) - 1 downto 0) 
        := (others => '0'); 
    signal LowerPrevLSB : std_logic := '0'; 
    signal Product : std_logic_vector(numBits_X + numBits_Y - 1 downto 0) 
         := (others => '0'); 
    signal A, A_2sComp : std_logic_vector(MAX(numBits_X, numBits_y) - 1 downto 0) 
       := (others => '0'); 
    signal counter : integer := 0; 
    -- End Signals 

begin 

    assert Z'length = (X'length + Y'length) report "Bad Product Length" severity failure; 

    Lower <= X when (numBits_X <= numBits_Y) else Y; 
    A <= X when (numBits_X > numBits_Y) else Y; 
    A_2sComp <= TwosComplement(A); 

    process(CLK) 
    begin 
     if rising_edge(CLK) then 
      if (Lower(0) = '0' and LowerPrevLSB = '1') then 
       Upper <= Upper + A; 
      elsif (Lower(0) = '1' and LowerPrevLSB = '0') then 
       Upper <= Upper + A_2sComp; 
      end if; 
      LowerPrevLSB <= Lower(0); 
      Product <= Upper & Lower; 
      for i in 0 to Product'length - 2 loop 
       Product(i) <= Product(i+1); 
      end loop; 
      Product(Product'length-1) <= Product(Product'length-1); 
      Upper <= Product(Product'length - 1 downto MIN(numBits_X, numBits_Y)); 
      Lower <= Product(MIN(numBits_X, numBits_Y) - 1 downto 0); 
      counter <= counter + 1; 
      if (counter = MIN(numBits_X, numBits_Y)) then 
       Z <= Product; 
      end if; 
     end if; 
    end process; 

end Behavioral; 
+0

Как же я мог бы достичь своей цели умножения на стенд без использования последовательных заданий? – chitown21

ответ

2

В VHDL, последовательные присвоения того же сигнала в процессе переопределяет предыдущие задания, таким образом:

if (Lower(0) = '0' and LowerPrevLSB = '1') then 
    Upper <= Upper + A; 
elsif (Lower(0) = '1' and LowerPrevLSB = '0') then 
    Upper <= Upper + A_2sComp; 
end if; 
... 
Upper <= Product(Product'length - 1 downto MIN(numBits_X, numBits_Y)); 

Первые задания, в if блоке, полностью игнорируется. Если вы посмотрите на свой код, переопределения присваиваются Product, Upper и Lower.

Предлагаю вам смоделировать свой дизайн перед синтезом вашего дизайна с помощью Xilinx. Это будет намного легче протестировать и отладить. Например, ваш сигнал counter никогда не будет сброшен и будет считаться до 2^31-1, а затем обернется до -2^31. Что будет с вашим дизайном в этих случаях? Моделирование будет легко указывать на эту ошибку, оставляя синтез позже!

Смежные вопросы