VHDL ALU неопределенное значение

Я изучаю VHDL для программирования FPGA, базовых (но сложных для меня) проектов. У меня есть этот АЛУ. Предполагается, что это 4-битный ALU. Но когда я хочу выполнить операцию Добавить, значение 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;

person BRabbit27    schedule 17.11.2011    source источник


Ответы (2)


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

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

Вы определенно получаете Us (может быть, не Xs?): что-то еще влияет на сигнал?

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

person Martin Thompson    schedule 17.11.2011
comment
Да, совершенно уверен, что они U. Позже выложу код тестбенча. Спасибо за помощь ! - person BRabbit27; 18.11.2011

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

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

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

person Tomi Junnila    schedule 17.11.2011
comment
Как указал Мартин Томпсон, если вы получаете UUUU из result, то процесс никогда не выполняется, и, таким образом, мои пункты выше не решат вашу проблему (хотя я думаю, что это проблемы, с которыми вы столкнетесь, как только исправите поведение вашего испытательный стенд). - person Tomi Junnila; 17.11.2011