Задача заключается в том, чтобы вывести на светодиодную панель 16-тирозрядное число. Светодиодная панель реализована на 16-тирозрядном сдвиговом регистре. Регистр имеет всего 2 входа:

  • вход данных (Data),
  • вход синхронизации (Clock).

Работает сдвиговой регистр следующим образом. На вход Data подаем 1. Подаем на вход Clock комбинацию 0-1-0 (если сдвиговой регистр срабатывает по нарастающему фронту, если нет – нужно подать комбинацию 1-0-1). На светодиодной панели зажигается младший разряд. Если повторить предыдущую цепочку действий то младший разряд сдвинется на один разряд в сторону старших битов, а на его место «станет» то, что подается на вход Data.

Запускаем Quartus и строим следующую схему:

quartus_vhdl_shift_register

 

Перейдем к описанию блока “led_panel”. Содержание кода следующее… Код состоит из таких блоков как «Entity»

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LIBRARY ieee;
USE ieee.std_logic_1164.all;
 
--  Entity Declaration
 
ENTITY led_panel IS
    -- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!
    PORT
    (
        clock : IN STD_LOGIC;
        data_in : IN STD_LOGIC_VECTOR(15 downto 0);     
        data_out : OUT STD_LOGIC_VECTOR(1 downto 0)
    );
    -- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!
 
END led_panel;

 

и «Architecture»:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
--  Architecture Body
 
ARCHITECTURE led_panel_architecture OF led_panel IS
 
signal wait_clock: bit:= '1';
signal tmp_int : integer := 0;
 
BEGIN
 
    process(clock)
        begin
            if rising_edge(clock) then
 
                if(wait_clock='1') then
 
                    if(tmp_int < 16) then
                        data_out(1) <= not data_in(tmp_int);
                        data_out(0) <= '0'; 
                        wait_clock <= '0';
                    end if;
 
                    tmp_int <= tmp_int + 1;
 
                    if(tmp_int > 1000) then 
                        tmp_int <= 0;
                    end if;
 
                else 
                    data_out(0) <= '1';
                    wait_clock <= '1';
 
                end if;
 
            end if;
 
    end process;
 
END led_panel_architecture;

 

Алгоритм работы этой подпрограммы следующий. По нарастающему фронту сигнала “clock” проверяем переменные wait_clock и tmp_int. Если условия выполняются выдаем на выход Data младший разряд входного 16-тиразрядного числа, а также переводим Clock в ‘0’, потом меняем wait_clock на 0 (для того, чтобы при следующем нарастающем тактирующем фронте передать данные, так как мы передадим 1 с Clock).