Простой пример VHDL кода для DE0-Nano

23.11.2015
В прошлый раз мы научились создавать новый проект в Quartis II и написали первую программу для FPGA. Сегодня я бы хотел привести разбор кода, который мы записали в ПЛИС. Вот сам код, немного подкорректированный для лучшего понимания:
 
library ieee;
use ieee.std_logic_1164.all;
 
entity led_switch is
port(
key0 : in std_logic ;
led0 : out std_logic 
);
end entity;
 
architecture myArc of  led_switch is 
 
signal LED : std_logic ; 
 
begin
  my_process : process(key0)
begin
if (key0 = '1') then 
LED <= '0';
else
LED <= '1';
end if;
end process my_process;
 
led0 <= LED;
end myArc;
 
Первые две строчки подключают к коду библиотеку ieee и дают указание использовать модуль для работы с логическими значениями типа '0', '1', 'H', 'L', 'Z'
В секции 'entity' по сути описывается "корпус" нашего устройства. Типичный пример - в линейке STM32 микроконтроллеров есть микросхемы с одинаковым расположением выводов, но разными внутренностями. Эти самые внутренности и описываются в секции 'architecture'. В случае чего можно не меняя корпус (выводы) изменить архитектуру.
Еще как выяснилось - в языке VHDL, на котором и написан код, есть понятие переменные и есть сигналы. Чтобы их отличить используется разное присваивание:
для сигналов: LED <= '0';
для переменных : myVar := 0 ;
В нашем примере нет переменных, только один сигнал LED, которы мы определили в начале секции 'architectura'. Еще в учебниках пишут, что для работы сигналами нужно использовать пока непонятную штуку как 'process', у которого также есть начало и есть конец. Экспериментальным путем выяснилось, что без указания секции 'my_process : process(key0)'  условный оператор if else не будет работать.
Однако, если отказаться от конструкции if-then и "включить логику", то код заметно упрощается:
 
library ieee;
use ieee.std_logic_1164.all;
 
entity led_switch is
port(
key0 : in std_logic ;
led0 : out std_logic 
);
end entity;
 
architecture myArc of  led_switch is 
begin
led0 <= not key0;
end myArc;
 
По сути мы собрали логическую схему с одним элементом НЕ, где входом является вывод от кнопки, а на выход подключен светодиод.
В следующем примере
library ieee;
use ieee.std_logic_1164.all;
 
entity led_switch is
port(
key0, key1 : in std_logic ;
led0, led1 : out std_logic 
);
end entity;
 
architecture myArc of  led_switch is 
begin
 
led0 <= not key0;
led1 <= not key1;
end myArc;
 
организована параллельная работа - за включение led0 отвечает key0, а за led1 - key1. Причем все работает независимо - можно жать кнопки раздельно, можно обе сразу. Отклик будет мгновенный. Подобный пример, выполненный на микроконтроллере будет осуществляться последовательно с некоторой задержкой. Если вас как и меня раздражает слабая светимость на плате DE0-Nano остальных 6 светодиодов, то в коде архитектуры их можно "отключить", записав в порты led2-7 '0'. Также не забываем все новые порты указывать в Port Planner. Чтобы новые порты появились в Port Planner - нужно выполнить команду Start Analysis & Syntesis
library ieee;
use ieee.std_logic_1164.all;
 
entity led_switch is
port(
key0, key1 : in std_logic ;
led0, led1, led2, led3, led4, led5, led6, led7 : out std_logic 
);
end entity;
 
architecture myArc of  led_switch is 
begin
led0 <= not key0;
led1 <= not key1;
led2 <= '0';
led3 <= '0';
led4 <= '0';
led5 <= '0';
led6 <= '0';
led7 <= '0';
end myArc;
 
В принципе для работы в статическом (ручном) режиме полученных знаний достаточно. Дальше будем пробовать процессы.
 
Нажав на соответствующий значок, Вы можете добавить эту заметку к себе на страничку в социальной сети
 

Если же вы хотите первыми узнавать о выходе моих новых статей, то можете заполнить следующую форму, вписав туда адрес своего электронного ящика:

 

 

© 2016 Дневник хорошего человека
Рейтинг@Mail.ru