2013-10-04 2 views
1

Я новичок в языке VHDL, поэтому, возможно, это глупый вопрос, но я не нашел ссылки на эту проблему. Итак, я работаю над битовым преобразователем, который преобразует определенные комбинации из 5 бит в другие комбинации. Проблема заключается в case case, где я не знаю, как поставить пять бит в одно утверждение.Дело в конвертере Vhdl

entity CONV is 
    port (ia, ib, ic, id, ie:in Bit; oa, ob, oc, od, oe:out Bit); 
end CONV; 

architecture BEH of CONV is 
signal t: bit; 
    begin 
    case ia & ib & ic & id & ie is 
    when "00010" => t <= "00011"; 
    when "00101" => t <= "00101"; 
    when "01000" => t <= "00110"; 
    when "01011" => t <= "01001"; 
    when "01110" => t <= "01010";  
    when "10001" => t <= "01100"; 
    when "10100" => t <= "10001"; 
    when "10111" => t <= "10010"; 
    when "11010" => t <= "10100"; 
    when "11101" => t <= "11000"; 
    when others => t <= "00000"; 
    end case; 
t => oa & ob & oc & od & oe; 
    end beh; 

ответ

1
entity CONV is 
    port (
     ia, ib, ic, id, ie: in Bit; 
     oa, ob, oc, od, oe: out Bit 
    ); 
end CONV; 

architecture BEH of CONV is 
    signal t: bit_vector(0 to 4); 
    subtype fivebit is bit_vector(0 to 4); 
begin 
EVALUATE: 
    process (ia, ib, ic, id, ie) 
    begin 
     case fivebit(ia & ib & ic & id & ie) is 
      when "00010" => t <= "00011"; 
      when "00101" => t <= "00101"; 
      when "01000" => t <= "00110"; 
      when "01011" => t <= "01001"; 
      when "01110" => t <= "01010";  
      when "10001" => t <= "01100"; 
      when "10100" => t <= "10001"; 
      when "10111" => t <= "10010"; 
      when "11010" => t <= "10100"; 
      when "11101" => t <= "11000"; 
      when others => t <= "00000"; 
     end case; 
    end process; 
OUTPUT: 
    (oa , ob , oc , od , oe) <= t; 
end architecture BEH; 

Выражения оценивается в случае заявлении должна быть: имя объекта с локально статическим подтипом (vector_in Рассела), имя индекса с локально статическими индексами, имя ломтика с локально статическим диапазон, вызов функции, который возвращает локально статический подтип, или квалифицированное выражение или преобразование типа с меткой локального статического типа (показано).

Идея состоит в том, что анализатор (локально статический анализ времени анализа) может определять количество элементов в выражении и их тип для определения покрытия случаев.

Совокупная цель для назначения параллельного сигнала связывает элементы совокупности (oa, ob, oc, od, oe) с элементами (битами) t в правой части в отдельности. Каждая ассоциация элементов может возникать только один раз.

Оператор case содержится в процессе (параллельный оператор), потому что это последовательный оператор. И для предотвращения путаницы существуют как последовательные, так и параллельные заявления о назначении сигнала. VHDL использует параллельные операторы для обеспечения параллелизма.

С испытательного стендом:

entity conv_test is 
end entity; 

architecture test of conv_test is 
    signal ia, ib, ic, id, ie:  bit; 
    signal oa, ob, oc, od, oe:  bit; 
    signal t:      bit_vector (0 to 4); 
    signal input:     bit_vector (0 to 4); 
begin 
DUT: 
    entity work.CONV 
     port map (
      ia => ia, ib => ib, ic => ic, id => id, ie => ie, 
      oa => oa, ob => ob, oc => oc, od => od, oe => oe 
     ) 
    ; 
TEST: 
    process 
    begin 
     wait for 10 ns; -- bit defaults to '0', others case 
     (ia, ib, ic, id, ie) <= bit_vector'("00010"); -- first case 
     wait for 10 ns; 
     (ia, ib, ic, id, ie) <= bit_vector'("00101"); 
     wait for 10 ns; 
     (ia, ib, ic, id, ie) <= bit_vector'("01000"); 
     wait for 10 ns; 
     (ia, ib, ic, id, ie) <= bit_vector'("01011"); 
     wait for 10 ns; 
     (ia, ib, ic, id, ie) <= bit_vector'("01110"); 
     wait for 10 ns; 
     (ia, ib, ic, id, ie) <= bit_vector'("10001"); 
     wait for 10 ns; 
     (ia, ib, ic, id, ie) <= bit_vector'("10100"); 
     wait for 10 ns; 
     (ia, ib, ic, id, ie) <= bit_vector'("10111"); 
     wait for 10 ns; 
     (ia, ib, ic, id, ie) <= bit_vector'("11010"); 
     wait for 10 ns; 
     (ia, ib, ic, id, ie) <= bit_vector'("11101"); 
     wait for 10 ns; 
     (ia, ib, ic, id, ie) <= bit_vector'("11111"); -- others case 
     wait for 10 ns; 
     wait;        -- one time only 
    end process; 
SIM_INPUT: 
    input <= (ia & ib & ic & id & ie); -- for ease of viewing in waveform display 
RESULT: 
    t <= (oa & ob & oc & od & oe); 
end architecture; 

Вы можете проверить ко:

test bench waveform output

Обратите внимание, что процесс тестирования может быть переписан гораздо проще назначить для ввода вместо агрегата (ia, ib, ic, id, т.е.), используя

(ia , ib , ic , id , ie) <= input; 

в заявлении SIM_INPUT:

TEST: 
    process 
    begin 
     wait for 10 ns; -- bit defaults to '0', others case 
     input <= "00010"; -- first case 
     wait for 10 ns; 
     input <= "00101"; 
     wait for 10 ns; 
     input <= "01000"; 
     wait for 10 ns; 
     input <= "01011"; 
     wait for 10 ns; 
     input <= "01110"; 
     wait for 10 ns; 
     input <= "10001"; 
     wait for 10 ns; 
     input <= "10100"; 
     wait for 10 ns; 
     input <= "10111"; 
     wait for 10 ns; 
     input <= "11010"; 
     wait for 10 ns; 
     input <= "11101"; 
     wait for 10 ns; 
     input <= "11111"; -- others case 
     wait for 10 ns; 
     wait;        -- one time only 
    end process; 
SIM_INPUT: 
    (ia, ib, ic, id, ie) <= input; -- for ease of viewing in waveform display 

И получить тот же дисплей сигнала

1

Попробуйте это: чувство

architecture BEH of CONV is 
signal vector_in : bit_vector(4 downto 0); 
signal vector_out : bit_vector(4 downto 0); 
begin 
case vector_in is 
    when "00010" => vector_out <= "00011"; 
    when "00101" => vector_out <= "00101"; 
    when "01000" => vector_out <= "00110"; 
    when "01011" => vector_out <= "01001"; 
    when "01110" => vector_out <= "01010";  
    when "10001" => vector_out <= "01100"; 
    when "10100" => vector_out <= "10001"; 
    when "10111" => vector_out <= "10010"; 
    when "11010" => vector_out <= "10100"; 
    when "11101" => vector_out <= "11000"; 
    when others => vector_out <= "00000"; 
end case; 

vector_in <= (ia & ib & ic & id & ie); 

oa <= vector_out(4); 
ob <= vector_out(3); 
oc <= vector_out(2); 
od <= vector_out(1); 
oe <= vector_out(0); 

Make?

1

Вы можете поместить все входы в битовый вектор, как говорит @Russell. Затем каждый бит в битовом векторе представляет собой вход. Это значительно упрощает работу.

И случае заявление последовательные заявления (т.е., они должны быть помещены в процесс или процедуры или функций).

entity CONV is 
    port (inp : in Bit_Vector(4 downto 0); -- [ai, bi, ci, di, ei] 
     outp: out Bit_Vector(4 downto 0)); -- [ao, bo, co, do, eo] 
end CONV; 

architecture BEH of CONV is 
begin 
    process (inp) 
    begin   
    case inp is 
     when "00010" => outp <= "00011"; 
     when "00101" => outp <= "00101"; 
     when "01000" => outp <= "00110"; 
     when "01011" => outp <= "01001"; 
     when "01110" => outp <= "01010";  
     when "10001" => outp <= "01100"; 
     when "10100" => outp <= "10001"; 
     when "10111" => outp <= "10010"; 
     when "11010" => outp <= "10100"; 
     when "11101" => outp <= "11000"; 
     when others => outp <= "00000"; 
    end case; 
    end process; 
end beh; 

Если вы действительно хотите использовать отдельные биты для readablity или по другим причинам, просто сцепить и прерывать их вне процесса.
Для планирования контактов вам нужно только подключить ai к inp[4], bi - inp[3] и так далее.

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