#case #vhdl #seven-segment-display
Вопрос:
Я пытаюсь сложить 2 выхода вместе и показать их результат на третьем/четвертом дисплее на 7-сегментном дисплее. Каждый вывод отображается в своем собственном сегменте соответственно. Четвертый дисплей представляет собой двузначное число (Макс-14, Мин-0). Я получаю сообщение об ошибке, в котором говорится, что мне нужно написать все экземпляры дела «добавить». Не знаю, куда отсюда идти. Любая помощь будет признательна.
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Midterm2_Q2_4369 IS PORT ( SW: IN STD_LOGIC_VECTOR(2 DOWNTO 0); SW0: IN STD_LOGIC_VECTOR(2 DOWNTO 0); ADD: IN STD_LOGIC_VECTOR(6 DOWNTO 0); Y: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); Y0: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); Y1: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); Y2: OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END Midterm2_Q2_4369; ARCHITECTURE MUX8 OF Midterm2_Q2_4369 IS BEGIN PROCESS (SW,SW0,ADD) BEGIN CASE SW IS WHEN "000" =gt; Y lt;= "0000001"; WHEN "001" =gt; Y lt;= "1001111"; WHEN "010" =gt; Y lt;= "0010010"; WHEN "011" =gt; Y lt;= "0000110"; WHEN "100" =gt; Y lt;= "1001100"; WHEN "101" =gt; Y lt;= "0100100"; WHEN "110" =gt; Y lt;= "0100000"; WHEN "111" =gt; Y lt;= "0001111"; END CASE; CASE SW0 IS WHEN "000" =gt; Y0 lt;= "0000001"; WHEN "001" =gt; Y0 lt;= "1001111"; WHEN "010" =gt; Y0 lt;= "0010010"; WHEN "011" =gt; Y0 lt;= "0000110"; WHEN "100" =gt; Y0 lt;= "1001100"; WHEN "101" =gt; Y0 lt;= "0100100"; WHEN "110" =gt; Y0 lt;= "0100000"; WHEN "111" =gt; Y0 lt;= "0001111"; END CASE; CASE ADD IS WHEN "0000000" =gt; Y1 lt;= "0000001"; --0 WHEN "0000001" =gt; Y1 lt;= "1001111"; --1 WHEN "0000010" =gt; Y1 lt;= "0010010"; --2 WHEN "0000011" =gt; Y1 lt;= "0000110"; --3 WHEN "0000100" =gt; Y1 lt;= "1001100"; --4 WHEN "0000101" =gt; Y1 lt;= "0100100"; --5 WHEN "0000110" =gt; Y1 lt;= "0100000"; --6 WHEN "0000111" =gt; Y1 lt;= "0001111"; --7 WHEN "0001111" =gt; Y1 lt;= "0000000"; --8 WHEN "0010111" =gt; Y1 lt;= "0000100"; --9 --8421421 WHEN "0011111" =gt; Y2 lt;= "1001111"; --(1)0 WHEN "0100111" =gt; Y2 lt;= "1001111"; --(1)1 WHEN "0101111" =gt; Y2 lt;= "1001111"; --(1)2 WHEN "0110111" =gt; Y2 lt;= "1001111"; --(1)3 WHEN "0111111" =gt; Y2 lt;= "1001111"; --(1)4-- WHEN "1000111" =gt; Y2 lt;= "1001111"; --(1)5 WHEN "1001111" =gt; Y2 lt;= "1001111"; --(1)6 WHEN "1010111" =gt; Y2 lt;= "1001111"; --(1)7-- WHEN "1011111" =gt; Y2 lt;= "1001111"; --(1)8 WHEN "1100111" =gt; Y2 lt;= "1001111"; --(1)9 END CASE; END PROCESS; END MUX8;
Комментарии:
1. Просто используйте
WHEN OTHERS =gt; Y2 lt;=lt;somethinggt;;
для покрытия тех, которые вас не интересуют.
Ответ №1:
При использовании case
в VHDL ДОЛЖНЫ быть охвачены все случаи. Потому SW
что , SW0
и ADD
все std_logic_vector
, вы также должны охватывать все мета-случаи, такие как «УУУУУУУУУУ» и т. Д. Самый простой способ сделать это-с others
помощью .
Например. В SW0 охвачены все «реальные» случаи, но вы также должны охватывать значения, которые могут возникать только при моделировании, поэтому предоставьте удобное сообщение:
CASE SW0 IS WHEN "000" =gt; Y0 lt;= "0000001"; WHEN "001" =gt; Y0 lt;= "1001111"; WHEN "010" =gt; Y0 lt;= "0010010"; WHEN "011" =gt; Y0 lt;= "0000110"; WHEN "100" =gt; Y0 lt;= "1001100"; WHEN "101" =gt; Y0 lt;= "0100100"; WHEN "110" =gt; Y0 lt;= "0100000"; WHEN "111" =gt; Y0 lt;= "0001111"; when others =gt; report "Meta value detected" severity warning;-- simulation only case END CASE;
Вы также должны убедиться, что все случаи покрываются SW
и ADD
тоже