VHDL-код для номеров от 0000 до 0099 на 7-сегментном дисплее - PullRequest
0 голосов
/ 30 октября 2019

Я новичок в VHDL, пытаюсь написать код, который рассчитывает от 0000 до 0099 на моей плате (BASYS-3) в зависимости от того, на какие переключатели я нажимаю. Проблема в том, что мне нужен один переключатель для включения и выключения программы, 4 переключателя для отображения крайнего правого десятичного знака и 4 других для отображения «десятков» (например, 1 в 17). На плате больше переключателей (всего 16), но я подумал, что 4 наиболее логично из-за двоичного кодирования десятичных дробей (например, 9 = 1001 в двоичном является самым большим).

Я понятия не имею, какие ворота использовать, поэтому работа, которую я сделал, очень ограничена, извините за это.

process(bcd_display)

begin

    case bcd_display is

    when "0000" => LED <= "0000001";     

    when "0001" => LED <= "1001111"; 

    when "0010" => LED <= "0010010"; 

    when "0011" => LED <= "0000110"; 

    when "0100" => LED <= "1001100"; 

    when "0101" => LED <= "0100100"; 

    when "0110" => LED <= "0100000"; 

    when "0111" => LED <= "0001111"; 

    when "1000" => LED <= "0000000";     

    when "1001" => LED <= "0000100"; 

    end case;

end process;

PS: https://www.youtube.com/watch?v=H7a56D4rczU Последние 30секунд или около того показывает, что я пытаюсь сделать. Английский не мой родной язык, поэтому я добавлю его на тот случай, если мое описание будет трудно понять.

1 Ответ

1 голос
/ 30 октября 2019

Для дальнейшего использования вы захотите добавить полный код и используемый вами испытательный стенд. Я все еще написал, что я думаю, будет работать для вас. Для ниже. Вы хотите назначить каждому переключателю (bcd_display_0 & bcd_display_1). Для сброса программы назначьте этот переключатель на (rst), и вам нужно будет назначить часы на (clk). Затем назначьте каждому из семи отображаемых сегментов (LED_0 & LED_1). Надеюсь, это поможет вам. Я также прикрепил для вас испытательный стенд.

-- BCD Entity
library ieee;
use ieee.std_logic_1164.all;

entity Display_Test is
    port (
        clk           : in  std_logic;
        rst           : in  std_logic;
        bcd_display_0 : in  std_logic_vector(3 downto 0);-- assign to first set of switches
        bcd_display_1 : in  std_logic_vector(3 downto 0);-- assign to second set of switches
        LED_0         : out std_logic_vector(6 downto 0);-- assign to first 7-segment display
        LED_1         : out std_logic_vector(6 downto 0) -- assign to second 7-segment display
    );
end Display_Test;

architecture behav of Display_Test is
    use ieee.numeric_std.all;
begin
    p : process(clk)
    begin
        if rising_edge(clk) then
            if rst = '1' then 
                LED_0 <= (others => '0');
                LED_1 <= (others => '0');
            else
                case to_integer(unsigned(bcd_display_0)) is
                    when 0 => LED_0 <= "0000001";     
                    when 1 => LED_0 <= "1001111"; 
                    when 2 => LED_0 <= "0010010"; 
                    when 3 => LED_0 <= "0000110"; 
                    when 4 => LED_0 <= "1001100"; 
                    when 5 => LED_0 <= "0100100"; 
                    when 6 => LED_0 <= "0100000"; 
                    when 7 => LED_0 <= "0001111"; 
                    when 8 => LED_0 <= "0000000";     
                    when 9 => LED_0 <= "0000100"; 
                    when others => LED_0 <= "0000000";
                end case;

                case to_integer(unsigned(bcd_display_1)) is
                    when 0 => LED_1 <= "0000001";     
                    when 1 => LED_1 <= "1001111"; 
                    when 2 => LED_1 <= "0010010"; 
                    when 3 => LED_1 <= "0000110"; 
                    when 4 => LED_1 <= "1001100"; 
                    when 5 => LED_1 <= "0100100"; 
                    when 6 => LED_1 <= "0100000"; 
                    when 7 => LED_1 <= "0001111"; 
                    when 8 => LED_1 <= "0000000";     
                    when 9 => LED_1 <= "0000100"; 
                    when others => LED_1 <= "0000000";
                end case;
            end if;
        end if;
    end process;
end behav;

--TestBench
entity tb_bcd is
end tb_bcd;

library ieee;
use ieee.std_logic_1164.all;

architecture behav of tb_bcd is
   signal clk           : std_logic := '1';
   signal rst           : std_logic := '1';
   signal bcd_display_0 : std_logic_vector(3 downto 0);
   signal bcd_display_1 : std_logic_vector(3 downto 0);
   signal LED_0         : std_logic_vector(6 downto 0);
   signal LED_1         : std_logic_vector(6 downto 0);
begin
    clk           <= not clk after 50 ns;
    rst           <= '0' after 200 ns;
    bcd_display_0 <= "0110" after 250 ns;
    bcd_display_1 <= "0010" after 280 ns;

    Display_Test_inst : entity work.Display_Test
        port map (
            clk           => clk,
            rst           => rst,
            bcd_display_0 => bcd_display_0,
            bcd_display_1 => bcd_display_1,
            LED_0         => LED_0,
            LED_1         => LED_1
        );
end behav;
...