VHDL: варианты оператора Case должны охватывать все возможные значения выражения - PullRequest
0 голосов
/ 05 августа 2020

Я работаю над проектом, который должен преобразовывать данные из аналоговых в цифровые с приближением, и у меня возникает ошибка, когда я пытаюсь скомпилировать код в Quartus II 9.1sp2 Web Edition, который показан в заголовке с Case Statement в приведенном ниже коде:

architecture behavior of adc is
type state is (reset, state1, state2, state3, state4, state5, state6, state7, state8, state9, state10);
signal nx_state : state;

begin
    process (in_clk, rst_n, start)
begin
    if(rst_n'event and rst_n='0') then
        B_hold <= "1111";
        D_out <= "0000";
        data_out <= "0000";
        hold <= '1';
        sample <= '0';
        eoc <= '0';
        
        if start = '1' then
            nx_state <= state1;
        else
            nx_state <= reset;
        end if;

    elsif(in_clk'event and in_clk='1') then
        case nx_state is
            when state1 => nx_state <= state2;
                B_hold <= "0000";
                hold <= '0';
                sample <= '1';
            
            when state2 => nx_state <= state3;
                B_hold <= "1111";
                D_out <= "0000";
            
            when state3 => nx_state <= state4;
                B_hold(3) <= '0';
                D_out(3) <= '1';
                data_out(3) <= '1';
            
            when state4 => nx_state <= state5;
                if comp_in = '1' then
                    B_hold(3) <= '0';
                    D_out(3) <= '1';
                    data_out(3) <= '1';
                else
                    B_hold(3) <= '1';
                    D_out(3) <= '0';
                    data_out(3) <= '0';
                end if;
            
            when state5 => nx_state <= state6;
                B_hold(2) <= '0';
                D_out(2) <= '1';
                data_out(2) <= '1';
            
            when state6 => nx_state <= state7;
                if comp_in = '1' then
                    B_hold(2) <= '0';
                    D_out(2) <= '1';
                    data_out(2) <= '1';
                else
                    B_hold(2) <= '1';
                    D_out(2) <= '0';
                    data_out(2) <= '0';
                end if;
            
            when state7 => nx_state <= state8;
                B_hold(1) <= '0';
                D_out(1) <= '1';
                data_out(1) <= '1';
            
            when state8 => nx_state <= state9; 
                if comp_in = '1' then
                    B_hold(1) <= '0';
                    D_out(1) <= '1';
                    data_out(1) <= '1';
                else
                    B_hold(1) <= '1';
                    D_out(1) <= '0';
                    data_out(1) <= '0';
                end if;
                
            when state9 => nx_state <= state10; 
                B_hold(0) <= '0';
                D_out(0) <= '1';
                data_out(0) <= '1';
            
            when state10 => nx_state <= reset;
                if comp_in = '1' then
                    B_hold(0) <= '0';
                    D_out(0) <= '1';
                    data_out(0) <= '1';
                else
                    B_hold(0) <= '1';
                    D_out(0) <= '0';
                    data_out(0) <= '0';
                end if;
                eoc <= '1';
        end case;
    end if;
end process;
end behavior;

Я новичок ie в vhdl, и я не знаю, что именно не так с условиями, показанными выше.

Ответы [ 2 ]

3 голосов
/ 05 августа 2020

Ваш тип включает состояние с именем reset. Вам нужно когда для этого состояния.

case nx_state is
    when reset =>
2 голосов
/ 05 августа 2020

Сброс чувствителен к уровню. Поэтому измените

if(rst_n'event and rst_n='0') then

на

if(rst_n='0') then

Также необычно иметь условие в условии сброса

    if start = '1' then
        nx_state <= state1;
    else
        nx_state <= reset;
    end if;

Следовательно, вы, вероятно, просто хотите:

    nx_state <= reset;
...