Попытка сделать 4-битный умножитель в VHDL с вводом клавиатуры 3x4 и ЖК-дисплеем 2x16 для реализации на плате Spartan 3E.

каждый. Я пытаюсь сделать 4-битный множитель в VHDL. Это должно быть реализовано на плате Spartan 3E с использованием встроенного ЖК-дисплея 2x16 и клавиатуры 3x4 через микросхему C922.

Использование происходит следующим образом: пользователь вводит число с клавиатуры, нажимает кнопку для подтверждения, вводит второе число, снова нажимает кнопку подтверждения, и продукт отображается на ЖК-дисплее.

Пока что коды для клавиатуры + c922 и ЖК-дисплея в порядке. Код для множителя почти в порядке. Проблема в том, что кнопка подтверждения работает только при нажатии другого номера (который в итоге не используется).

Вот мой код. Ниже приведены скриншоты моделирования Xilinx.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity multi_4bit is
    Port ( CLK : in  STD_LOGIC;
        RESET : in  STD_LOGIC;
        Input : in  STD_LOGIC_VECTOR (3 downto 0);
        DAVBL : in  STD_LOGIC;
        Confirm : in STD_LOGIC;
        Output : out  STD_LOGIC_VECTOR (7 downto 0));
end multi_4bit;

architecture Behavioral of multi_4bit is

type state is (R,S0,S1,S2,S3,S4);
signal pstate, nstate: state;
signal A_sig, B_sig: STD_LOGIC_VECTOR(3 downto 0);

begin

state_transition: process(CLK,RESET)
begin
    if RESET = '1' then
        pstate <= R;
    elsif rising_edge(CLK) then
        pstate <= nstate;
    end if;
end process;

nstate_output: process(pstate,DAVBL,Input)
variable temp_var: STD_LOGIC_VECTOR(3 downto 0);
variable tempMult_var,tempProd_var: STD_LOGIC_VECTOR(7 downto 0);
begin
    case pstate is
        when R =>
            nstate <= S0;
            tempMult_var := (others => '0');
            tempProd_var := (others => '0');

            A_sig <= (others => '0');
            B_sig <= (others => '0');

            Output <= (others => '0');
        when S0 =>
            nstate <= S0;         

            if (DAVBL = '1') then
                A_sig <= Input;
                nstate <= S1;
            end if;
        when S1 =>
            nstate <= S1;

            if (Confirm = '1') then
                nstate <= S2;
            end if;
        when S2 =>
            nstate <= S2;

            if (DAVBL = '1') then
                B_sig <= Input;
                nstate <= S3;
            end if;
        when S3 =>
            nstate <= S3;

            if (Confirm = '1') then
                nstate <= S4;
            end if;

        when S4 =>
            nstate <= S0;

            for x in 0 to 3 loop
                temp_var := (A_sig AND (B_sig(x)&B_sig(x)&B_sig(x)&B_sig(x) ) );
                tempMult_var := "0000" & temp_var;
                if (x=0) then tempMult_var := tempMult_var;
                elsif (x=1) then tempMult_var := tempMult_var(6 downto 0)&"0";
                elsif (x=2) then tempMult_var := tempMult_var(5 downto 0)&"00";
                elsif (x=3) then tempMult_var := tempMult_var(4 downto 0)&"000";        
                end if;
                tempProd_var := tempProd_var + tempMult_var;
            end loop;

            Output <= tempProd_var;
            tempProd_var := (others => '0');
    end case;
end process;

end Behavioral;

Моделирование, когда никакое число не нажато с помощью кнопки подтверждения: введите здесь описание изображения

Симуляция при нажатии числа с помощью кнопки подтверждения: введите здесь описание изображения

Я просматриваю свой код уже час, но до сих пор не вижу, что не так. Заранее спасибо всем, кто может помочь.


person jlgazo    schedule 27.10.2014    source источник
comment
Возможно, вы захотите взглянуть на свой список чувствительности...   -  person fru1tbat    schedule 27.10.2014
comment
... ака, конечный автомат с двумя процессами снова кусается.   -  person user_1818839    schedule 27.10.2014
comment
Немного более лаконично по поводу комментария fru1tbat. Confirm отсутствует в списке чувствительности для процесса n_state_output. Неудивительно, что нужно ждать какого-то другого события. Единственный процесс Брайана заменяет один набор отсутствующих элементов списка чувствительности на другой (A_sig и B_sig также отсутствуют в списке чувствительности, хотя они не назначаются в том же состоянии, в котором они оцениваются).   -  person    schedule 27.10.2014


Ответы (1)


Как упоминали fru1tbat, Брайан и Дэвид, у вас есть проблема со списком чувствительности в комбинаторной части вашего конечного автомата. В частности, вам не хватает ввода Confirm. Поскольку вход Confirm отсутствует в списке чувствительности, конечный автомат не будет «просыпаться» для оценки новых выходов/переходов состояния при подтверждении изменения состояния. Вам нужно дождаться другого условия (другого нажатия кнопки), чтобы правильно оценить и обновить вывод.

Есть несколько способов решить эту проблему.

  • Вы можете убедиться, что у вас есть полный список чувствительности для вашей логики конечного автомата.
  • В VHDL-2008 вы можете использовать process(all) для автоматического перечисления всех необходимых входных данных в списке чувствительности (поддержка вашего компилятора может отличаться).
  • Вы можете использовать стиль «конечный автомат одного процесса», который позволяет избежать этой проблемы. Однако различные стили конечных автоматов имеют свои сильные стороны и недостатки, которые необходимо учитывать.
person Community    schedule 11.02.2015