2013-11-10 3 views
1

Я реализую алгоритм Бута для умножения двух чисел (в форме дополнения без знака 2) в VHDL. К сожалению, я очень плохо разбираюсь в VHDL и не могу понять, где я ошибаюсь.

Проблема: При прохождении имитации я заметил, что когда я присвоил значение «1011» на y, сигнал mult получил «0UUU». Я не понимаю, почему это происходит. Вот мой код:Назначение сигнала VHDL приводит к неинициализированному состоянию

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

-- x, y are the n bit numbers to be multiplied. 
-- The Algorithm : 
-- U = 0, prev_bit = 0; 
-- for i = 1 to n do 
-- if start of a string of 1's in Y then U = U - X 
-- if end of a string of 1's in Y then U = U + X 
-- Arithmetic right shift UV 
-- Circular right shift Y and copy Y(0) to prev_bit 

entity booth is 
    generic(N : natural := 4); 
    port(
    x, y : in std_logic_vector(N-1 downto 0); 
    result : out std_logic_vector(2*N-1 downto 0); 
    clk : in std_logic 
); 
end booth; 

architecture booth_arch of booth is 
    --temp is equivalent to UV where UV is the result. 
    signal temp : std_logic_vector(2*N-1 downto 0) := (others => '0'); 
    --prev_bit to compare for starting and ending of strings of 1's. 
    signal prev_bit : std_logic := '0'; 
    signal mult : std_logic_vector(N-1 downto 0); 

    begin 
    process(x, y) 
     begin 
     mult <= y; 
     prev_bit <= '0'; 
     for i in 0 to N-1 loop 
      if(mult(0) = '1' and prev_bit = '0') then --start of a string of 1's 
      temp(2*N-1 downto N) <= std_logic_vector(unsigned(temp(2*N-1 downto N)) + unsigned(not(x)) + 1); 
      elsif(mult(0) = '0' and prev_bit = '1') then --end of a string of 1's 
      temp(2*N-1 downto N) <= std_logic_vector(unsigned(temp(2*N-1 downto N)) + unsigned(x)); 
      end if;  
     prev_bit <= mult(0); 
     mult(N-2 downto 0) <= mult(N-1 downto 1); --circular right shift y. 
     mult(N-1) <= prev_bit; 
     temp(2*N-2 downto 0) <= temp(2*N-1 downto 1); --arithmetic right shift temp. 
     end loop; 
     result <= temp; 
    end process;  
end booth_arch; 

P.S: Сигнал clk избыточен здесь. Я еще не использовал его.

ответ

1

Если ваши порты и внутренние сигналы неподписанные, объявите их unsigned, для начала. По крайней мере, вы используете правильную библиотеку numeric_std. Используйте сильную систему, вместо того чтобы бороться с ней!

Тогда вам может понадобиться инициализировать Temp в начале каждого умножения (как вы уже делаете для Mult, Prev_Bit) вместо одного раза в начале моделирования. На данный момент представляется возможным, чтобы Temp содержал устаревшие значения из предыдущего умножения (например, UUUU * UUUU).

В-третьих вы сказать нам, что вы назначили на Y, но мы еще не знаем, что вы присваиваете X, который все еще может быть UUUU все, что я знаю.

Написание минимального тестового сайта VHDL и добавление его к вопросу было бы хорошим способом получить дополнительную помощь - или, более вероятно, открыть для себя истинную причину проблемы самостоятельно!

1

В дополнение к комментариям Брайана: вы читаете и записываете сигнал mult в том же комбинационном процессе. Если ваш действительно знает, что вы делаете, вы не должны этого делать. После синтеза вы получите вещи, которые не соответствуют тому, что делает ваш симулятор.

Кроме того, вы должны знать, что значение, которое вы назначаете mult (в первой строке вашего процесса), не будет отображаться до тех пор, пока процесс не завершится и не начнет новую итерацию. В VHDL-скажем мы говорим, что новое значение доступно после одного дельта-цикла .

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