VHDL ALU неопределенное значение - PullRequest
0 голосов
/ 17 ноября 2011

Я изучаю VHDL для программирования FPGA, базовых (но трудных для меня) проектов.У меня есть это АЛУ.Предполагается, что это 4-битный АЛУ.Но когда я хочу выполнить операцию Add , значение result равно UUUU.Для всех остальных операций работает нормально.

Любой совет?

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

use IEEE.NUMERIC_STD.ALL;


entity ALU is
    Port (
                clk: in std_logic;
                reset: in std_logic;
                operation: in std_logic_vector (2 downto 0)
          );
end ALU;

architecture Behavioral of ALU is
    signal A : std_logic_vector (3 downto 0) := "0001";
    signal B : std_logic_vector (3 downto 0) := "1111";
    signal result : std_logic_vector (7 downto 0);
    signal flags : std_logic_vector (2 downto 0);   -- [S,OF,Z] 
begin

    process (operation) begin
        flags <= (others => '0');
        result <= (others => '0');
        case operation is
            when "000" => 
                result <= std_logic_vector((unsigned("0000"&A) + unsigned(B)));
                flags(1) <= result(4);
            when "001" =>
                if (A >= B) then
                    result <= std_logic_vector(unsigned("0000"&A) - unsigned(B));
                    flags(2) <= '0';
                else
                    result <= std_logic_vector(unsigned("0000"&B) - unsigned(A));
                    flags(2) <= '1';
                end if;
            when "010" =>
                result <= "0000"&A and "0000"&B;
            when "011" =>
                result <= "0000"&A or "0000"&B;
            when "100" =>
                result <= "0000"&A xor "0000"&B;
            when "101" =>
                result <= not ("1111"&A);
            when "110"  =>
                result <= not ("1111"&B);
            when "111" =>
                result <= std_logic_vector(unsigned(A) * unsigned(B));
            when others =>
                result <= (others => 'Z');
        end case;
    end process;

end Behavioral;

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

Единственный способ увидеть все происходящие U (с кодом как есть) - это если процесс никогда не будет выполнен.Это означает, что вы не должны иметь никаких транзакций по сигналу operation для операции добавления.

Что вызывает только больше вопросов:

Вы определенно получаете U с (не X свозможно?): что-то еще управляет сигналом?

Можете ли вы опубликовать свой код TestBench?

0 голосов
/ 17 ноября 2011

Первые две вещи, которые приходят на ум при просмотре вашего кода:

  1. Вы должны включить A и B в список чувствительности процесса (теперь он содержит только operation).

  2. Вы не можете использовать result(4) для установки flags(1), так как result(4) будет обновляться только после процесса, а сам result не будетснова в списке чувствительности, поэтому процесс не будет запущен снова, чтобы отразить измененное значение.Лучше всего, вероятно, сохранить сумму в variable, а затем присвоить ее result и биту переполнения.

...