Проектиране на Управляващо устройство за светофари като краен автомат с помощта на развойна среда (WebPACK) и входно HDL – описание
Целта на настоящото лабораторно упражнение е проектиране, имплементиране върху CPLD – чип и проверка на функционирането на управляващо устройство за светофари на улично кръстовище. Ще използваме развойна среда WebPACK, входен език за описание VHDL и развойна платка Digilent X-Board.
Проектираното и имплементирано устройство ще управлява светофарна уредба на кръстовище от две улици. Светофарната уредба ще включва и допълнителна функция за мигаща жълта светлина, индицираща временно преустановяване на работата на светофара.
Устройството, което ще проектираме и имплементираме върху електрически конфигурируем (програмируем) CPLD – чип, в първата му, опростена версия ще бъде изградено от следните два цифрови блока (устройства):
-
ClkStretcher – блок- генератор на синхронизиращ сигнал с променлива продължителност на тактовите му импулси.
-
ТrafficLights – цифров блок, представляващ краен автомат, който управлява състоянията на светлините на светофарите, последователността им на следване и интервалите от време за оставане във всяко от състоянията; тези времеви интервали се определят от тактовия сигнал на горния модул ClkStretcher.
I. Проектиране на цифров блок за синхронизация ClkStretcher
Задачата на този блок е: използвайки тактов сигнал (от развойната платка) с еднаква продължителност и период на тактовите импулси, да генерира сигнал с променлива продължителност на тактовите импулси в него. Двата сигнала са показани на следващата времедиаграма :
Входен тактов
сигнал
Генериран
изходен тактов сигнал
Времева диаграма, изобразяваща входния тактов сигнал и
генерирания изходен тактов сигнал от блока ClkStrecher
Използването на синхронизиращ сигнал с променлива продължителност на тактовите импулси в него се изисква от физическия принцип на действие на уличните светофари. Той се характеризира със следните състояния: продължителна фаза, в която единият светофар е в червено а другият - в зелено; краткотрайна фаза, в която светофарите са съответно в червено и жълто състояние; още една краткотрайна фаза, в която светофарите са съответно в жълто и червено състояние. След това логично следва повторение на състоянията на светофарите със смяна на ролите им и т.н.
Началото на всяка нова (продължителна или краткотрайна) фаза на светофара, инициирано от управляващия блок ТrafficLights, се задава от поредния нарастващ фронт на генерирания тактов сигнал с променлива продължителност от синхронизиращия блок ClkStrecher.
Следват стъпките на работа с развойната среда по създаване на проект и първия проектен модул в него ClkStretcher.vhd
- Създайте в папката на вашата група проект с име TrafficLightsProject. За тази цел:
- Стартирайте програмната система за проектиране Project Navigator (Xilinx ISE 9.2) чрез:
- иконата Xilinx ISE (Integrated Software Environment) от Desktop
- Създайте нов проект чрез команда на основното меню:
File => New Project...
- В прозореца New Project Wizard посочете необходимите елементи: име (TrafficLightsProject) и директория на проекта (в папката на вашата група).
- в полето Project Location чрез бутона за избор посочете папка за проекта; например C:\VLSI\gr233a;
- запишете името на проекта – TrafficLightsProject в полето Project Name – в папката gr233a ще се създаде папка ТrafficLightsProject за файловете на проекта;
- изберете начин на описание на проектираното устройство, който ще се прилага в главния sourse-модул на проекта – в полето Top-Level Module Type изберете HDL (Hardware Description Language – декларира се използване на език за описание на хардуер);
След натискане на бутона Next преминете към въвеждане на останалите необходими елементи на проекта:
- изберете фамилия от CPLD – чипове, която ще се използва от проекта - Device Family: CoolRunner2 CPLDs;
- изберете CPLD – чип, върху който ще се реализира устройството - Device: XC2C256;
- изберете вид корпус на чипа - Package: TQ144;
- изберете скорост(бързодействие) на използвания чип - Speed Grade: -6;
- средството за проектиране на схемата на устройството от езиковото му описание е технологията на синтезиране на цифрова схема XST (VHDL/Verilog) - Xilinx Synthesis Technology , използваща като входен език за описание на устройството езиците от високо ниво VHDL (който ние ще използваме) .
- Пропуснете чрез натискане на бутона Next двата следващи прозореца New Project Wizard, които се използват за създаване и добавяне на сорс-файлове към проекта; ние ще използваме друг начин за включване в проекта на такива файлове.
В прозореца New Project Wizard – Device Properties се извеждат за справка елементите и параметрите на проекта, който се създава. При несъгласие с някои от тези параметри е възможно връщане към предните стъпки от процедурата на създаване на проекта чрез бутона Back. Бутонът Finish, който трябва да натиснете, на практика създава в избраната директория нужните начални файлове на проекта.
- Създайте source - модул в проекта, съдържащ описанието на проектираното устройство на език VHDL. За тази цел изпълнете от основното меню командите :
Project => New Source…
- В отворилия се прозорец New Source Wizard изберете тип на модула : VHDL Module , а в полето File name въведете за име на файла, който ще съдържа този модул: ClkStretcher. За да преминете по-нататък, натиснете бутона Next.
- Пропуснете отново чрез натискане на бутона Next следващия прозорец New Source Wizard- Define Module, чрез който се декларират входните и изходните сигнали (портове) на проектираното устройство. Тези портове ще бъдат декларирани по-късно чрез текста на VHDL - описанието на устройството.
В прозореца New Source Wizard – Summary се извеждат за справка параметрите на създавания модул. Ако сте съгласни с тях, натиснете Finish, с което на практика се създава в директорията на проекта файлът ClkStretcher.vhd (vhd е разширение в името, означаващо модул/файл с текст на езика VHDL).
В изведения прозорец за редактиране на текста на ClkStretcher.vhd се изобразява текстовата рамка на създадения модул с VHDL – описанието. (Ако прозорецът с текстовата рамка не е показан на екрана, кликнете двойно с мишката върху името на модула ClkStretcher в прозореца Sources на Project Navigator). Изтрийте текстовата рамка и въведете следния VHDL- код, описващ проектираното устройство:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ClkStretcher is port(
CLK : in std_logic; -- тактовия сигнал на развойната платка
OutCLK : inout std_logic; -- продуцирания изходен сигнал
Reset : in std_logic; -- сигнал за начална инициализация
Blink : in std_logic -- сигнал за мигащата жълта светлина
);
end ClkStretcher;
architecture Behavioral of ClkStretcher is
signal enable1 : std_logic; -- стартира генерирането на дългия пулс
signal enable2 : std_logic; -- стартира генерирането на първия кратък пулс след всеки дълъг
signal enable3 : std_logic; -- стартира генерирането на втория кратък пулс след всеки дълъг
signal enable4 : std_logic; -- стартира секцията необходима за мигащата жълта светлина
signal counter1 : std_logic_vector(7 downto 0); -- определя дължината на дългия пулс
signal counter2 : std_logic_vector(3 downto 0); -- определя продължителността на първия тактов пулс
signal counter3 : std_logic_vector(3 downto 0); -- определя продължителността на втория тактов пулс
signal counter4 : std_logic_vector(3 downto 0); -- определя честотата на мигане на жълтата светлина
begin
process(Reset, CLK, Blink)
begin
if(Reset = '1') then -- при начално установяване се активира първата секция генерираща дългия пулс
enable1<='1';
enable2<='0';
enable3<='0';
enable4<='0';
counter1<=(others=>'0'); -- нулиране на всички броячи
counter2<=(others=>'0');
counter3<=(others=>'0');
counter4<=(others=>'0');
OutCLK<='0';
elsif(CLK'event and CLK='1') then
if(enable1='1') then -- секция за активиране само на първия брояч
counter1<=counter1+1;
if(counter1<"00001111")then OutCLK<='1'; -- начало/високо ниво на OutCLK
elsif(counter1="00010000") then
enable1<='0'; -- секцията се заключва и край на първия пулс
counter1<=(others=>'0'); -- нулиране на първия брояч
enable2<='1'; -- стартиране на следващата секция
enable3<='0'; -- секцията е непозволена
enable4<='0'; -- секцията за мигащата жълта светлина е непозволена
OutCLK<='0'; -- OutCLK пада в ниско състояние
else OutCLK<='0'; -- OutCLK пада в ниско състояние
end if;
elsif(enable2='1') then -- секция за активиране само на втория брояч
counter2<=counter2+1;
if(counter2<"0111")then OutCLK<='1'; -- начало/високо ниво на OutCLK
elsif(counter2="1111") then
enable1<='0'; -- секцията е непозволена
enable2<='0'; -- секцията се заключва и край на втория пулс
counter2<=(others=>'0'); -- нулиране на втория брояч
enable3<='1'; -- стартиране на следващата секция
enable4<='0'; -- секцията за мигащата жълта светлина е непозволена
OutCLK<='0'; -- OutCLK пада в ниско състояние
else OutCLK<='0'; -- OutCLK пада в ниско състояние
end if;
elsif(enable3='1') then -- секция за активиране само на третия брояч
counter3<=counter3+1;
if(counter3<"0111")then OutCLK<='1'; -- начало/високо ниво на OutCLK
elsif(counter3="1111") then
enable3<='0'; -- секцията се заключва и край на третия пулс
counter3<=(others=>'0'); -- нулиране на третия брояч
enable1<='0'; -- секцията е непозволена
enable2<='0'; -- секцията е непозволена
enable4<='1'; -- секцията за мигащата жълта светлина е позволена
OutCLK<='0'; -- OutCLK пада в ниско състояние
else OutCLK<='0'; -- OutCLK пада в ниско състояние
end if;
elsif(enable4='1') then -- секция за мигащата светлина и активиране само на четвъртия брояч
counter4<=counter4+1;
------- проверка дали сигнала отговарящ за мигащата жълта светлина е активен
if(Blink='0') then -- Ако Blink е неактивен
OutCLK<='0'; -- OutCLK пада в ниско състояние
enable1<='1'; -- секция 1 се отключва
enable2<='0'; -- секция 2 е заключена
enable3<='0'; -- секция 3 е заключена
enable4<='0'; -- секция 4 е заключена
counter4<=(others=>'0'); -- нулиране на четвъртия брояч
elsif(Blink='1') then -- Ако Blink е активен
OutCLK<=counter4(3); -- продуцираме делител на честота
end if;
end if; -- край на секцията с enablе…
end if; -- край на секцията отговорна за Reset и CLK
end process;
end Behavioral;
Кратки пояснения към горния VHDL - код, описващ цифровия блок ClkStrecher:
Изходният тактов сигнал с променлива продължителност, описан в горния текст, се генерира посредством изходните сигнали на три брояча на входните импулси от развойната платка. Броячите са един 8-битов – counter1 и два 4-битови – counter2 и counter3 , отговарящи за отделните изходни импулси с различна продължителност. Освен това се използват и три еднобитови флагове(сигнали) – enable1, enable2, enable3, които се изключват взаимно и определят кой от трите изходни импулса в дадения момент да се генерира .
Блокът ClkStretcher използва освен изброените по - горе цифрови възли, още и един 4 – битов брояч (counter4) и еднобитов флаг – enable4. Те са необходими за генерирането на „къси” импулси с еднаква продължителност и честота, управляващи мигащата жълта светлина, индицираща временното преустановяване на работа на светофарната уредба.
- Актуализирайте съдържанието на файла чрез File => Save.
- Изпълнете процесите на проектиране на блока. За тази цел в прозореца Processes for Current Source (при избран сорс-модул ClkStretcher в прозореца Sources in Project) двойно кликнете върху последния процес: Generate Programming File. Развойната среда ще изпълни процесите на проектиране в необходимата последователност.
II. Проектиране на цифров блок с управляващ краен автомат ТrafficLights
Както бе споменато по-горе, модулът ТrafficLights описва краен автомат, управляващ състоянията на светлините на светофарите на проектираното устройство и последователността им на следване. Графът, описващ преходите на крайния автомат съдържа 8 върха, представящи състоянията на светофарите за кръстовище на две улици при нормално функциониране, а също и при функциониране с мигащи жълти светлини.
Вид на графа, описващ крайния автомат за устройството ТrafficLights
Следват стъпките на работа с развойната среда по създаване на проектен модул ТrafficLights.vhd, описващ блока с управляващия краен автомат:
- Създайте нов VHDL – модул в проекта чрез командите от главното меню Project => New Source..., в отворилия се прозорец New Source Wizard изберете за тип на модула: VHDL Module, а за име: TrafficLights.
В изведения прозорец за редактиране на текста на TrafficLights.vhd се изобразява текстовата рамка на създадения VHDL –модул. (Ако прозорецът с текстовата рамка не е показан на екрана, кликнете двойно с мишката върху името на модула TrafficLights в прозореца Sources на Project Navigator).
- Изтрийте текстовата рамка и въведете следния VHDL код, описващ функциониране според графа на преходите и изходите на управляващия краен автомат:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity TrafficLights is
port (
CLK : in std_logic; -- тактовият сигнал, който ще идва от модула ClkStretcher
Reset : in std_logic; -- входен сигнал за начално установяване
Blink : in std_logic; -- сигнал отговарящ за мигащата жълта светлина
R1 : out std_logic; -- сигнал за червената светлина на светофар 1
Y1 : out std_logic; -- сигнал за жълтата светлина на светофар 1
G1 : out std_logic; -- сигнал за зелената светлина на светофар 1
R2 : out std_logic; -- сигнал за червената светлина на светофар 2
Y2 : out std_logic; -- сигнал за жълтата светлина на светофар 2
G2 : out std_logic; -- сигнал за зелената светлина на светофар 2
OutDouble : out std_logic -- контролен изходен сигнал, който повтаря CLK
);
end TrafficLights;
architecture Behavioral of TrafficLights is
type state_type is (s1,s2,s3,s4,s5, s6, s7,s8); -- дефинираме потребителски тип
signal state , nextstate : state_type ; -- необходим за състоянията на графа
begin
process1: process (CLK,Reset) -- процес, необходим за началното установяване на крайния автомат
-- начално състояние след Reset – s1
begin
if (Reset ='1') then
state <=s1;
elsif (CLK='1' and CLK'event) then
state <= nextstate;
end if;
end process process1;
process2: process (state, Reset, Blink) -- процес, управляващ преходите
begin -- между отделните състояния и условията за тях
case state is
when s1 => if (Reset='1') then
nextstate <= s1;
elsif (Reset='0') then
nextstate <= s2;
end if;
when s2 => nextstate <= s3;
when s3 => if(Blink='0') then
nextstate <= s4;
elsif(Blink='1') then
nextstate <= s7;
end if;
when s4 => nextstate <= s5;
when s5 => nextstate <= s6;
when s6 => if(Blink='0') then
nextstate <= s1;
elsif(Blink='1') then
nextstate <= s7;
end if;
----------- секция, отговорна за мигащата жълта светлина
when s7 => if(Reset='0' and Blink='1') then
nextstate <= s8;
elsif(Reset='1') then
nextstate <= s1;
elsif(Reset='0' and Blink='0') then
nextstate <= s2;
end if;
when s8 => if(Reset='0' and Blink='1') then
nextstate <= s7;
elsif(Reset='1') then
nextstate <= s1;
elsif(Reset='0' and Blink='0') then
nextstate <= s2;
end if;
end case;
end process process2;
process3 : process (CLK, state) -- процес, управляващ изходните сигнали на крайния автомат
begin -- тук се посочва какво да се управлява
-- когато автоматът се намира във всяко от възможните си състояния
if (CLK='1' and CLK'event) then
case state is
when s1 => R1<='1'; Y1<='0'; G1<='0'; R2<='0'; Y2<='0'; G2<='1';
when s2 => R1<='1'; Y1<='0'; G1<='0'; R2<='0'; Y2<='1'; G2<='0';
when s3 => R1<='0'; Y1<='1'; G1<='0'; R2<='1'; Y2<='0'; G2<='0';
when s4 => R1<='0'; Y1<='0'; G1<='1'; R2<='1'; Y2<='0'; G2<='0';
when s5 => R1<='0'; Y1<='1'; G1<='0'; R2<='1'; Y2<='0'; G2<='0';
when s6 => R1<='1'; Y1<='0'; G1<='0'; R2<='0'; Y2<='1'; G2<='0';
when s7 => if(Blink='1') then
R1<='0'; Y1<='1'; G1<='0'; R2<='0'; Y2<='1'; G2<='0';
else
R1<='1'; Y1<='0'; G1<='0'; R2<='0'; Y2<='0'; G2<='1';
end if;
when s8 => if(Blink='1') then
R1<='0'; Y1<='0'; G1<='0'; R2<='0'; Y2<='0'; G2<='0';
else
R1<='1'; Y1<='0'; G1<='0'; R2<='0'; Y2<='0'; G2<='1';
end if;
end case;
end if;
end process process3;
OutDouble<=CLK;
end Behavioral;
Кратки пояснения към горния VHDL - код, описващ цифровия блок (управляващ краен автомат) TrafficLights.
Това управляващо устройство излъчва 3 двойки изходни сигнали (R1 и R2, Y1 и Y2, G1 и G2) отговарящи за светлините на светофарите, приема входен сигнал Blink, необходим за определяне дали е стартирана мигащата жълта светлина и входен синхронизиращ сигнал CLK с различна продължителност на импулсите, генериран от другия блок, описан в проекта - ClkStretcher.
За описание на устройството е използвана поведенческа архитектура (с процеси - process), които в случая са три. Състоянията на крайния автомат (8 на брой) са представени като стойности на два сигнала ( state и nextstate) ot потребителски дефиниран тип state_type чрез конструкцията:
type state_type is (s1,s2,s3,s4,s5, s6, s7,s8);
signal state , nextstate : state_type ;
В първия процес се извършва асинхронна инициализация на устройството и се определя преминаването от едно състояние на крайния автомат в друго да се извършва по нарастващия фронт на тактовия сигнал CLK.
Вторият процес управлява последователността на преходите между отделните състояния, както и условията за тези преходи (описва функцията на преходите на крайния автомат).
Третият процес е отговорен за управлението на светлинната индикация (описва функцията на изходите на крайния автомат). В него с високи и ниски нива (цифрова ‘1’ и цифрова ‘0’ ) на съответните изходни сигнали (R1 и R2, Y1 и Y2, G1 и G2) се управляват светлините – при ‘1’ – светят, при ‘0’ - не.
-
Актуализирайте съдържанието на файла TrafficLights.vhd чрез File => Save.
----------------------------------------------------------------------------------------------------------------------------------------------
Светофар в джунглите на Нова Каледония; папагалите в него са специално дресирани
--------------------------------------------------------------------------------------------------------------------------------------------------
III. Добавяне на главен модул на проекта - GeneralModule
Чрез този главен модул на проекта се описва структурата на устройство, съставено от описаните досега два блока - ClkStrecher и TrafficLights.
Следват стъпките на работа с развойната среда по създаване на главния модул на проекта GeneralModule:
- Създайте нов VHDL – модул в проекта чрез командите от главното меню Project => New Source..., в отворилия се прозорец New Source Wizard изберете за тип на модула: VHDL Module, а за име: GeneralModule.
- В следващия прозорец New Source Wizard- Define Module, чрез който се декларират входните и изходните сигнали (портове) на проектираното устройство посочете за име на архитектурата Architecture Name: Structural. За да преминете по-нататък, натиснете бутона Next.
В прозореца New Source Wizard – Summary се извеждат за справка параметрите на създавания модул. Натиснете Finish, с което на практика се създава в папката на проекта файлът GeneralModule.vhd (да припомним, vhd е разширение в името, означаващо модул/файл с текст на езика VHDL).
В изведения прозорец за редактиране на текста на GeneralModule.vhd се изобразява текстовата рамка на създадения модул с VHDL – описанието. Изтрийте текстовата рамка и въведете следния VHDL-код, описващ проектираното устройство, съставено от двата блока:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity GeneralModule is
port(
BoardCLK : in std_logic;
Reset : in std_logic;
Blink : in std_logic;
R1 : out std_logic;
Y1 : out std_logic;
G1 : out std_logic;
R2 : out std_logic;
Y2 : out std_logic;
G2 : out std_logic;
OutDouble : out std_logic );
end GeneralModule;
architecture Structural of GeneralModule is
component ClkStretcher
port( CLK : in std_logic;
OutCLK : inout std_logic;
Reset : in std_logic;
Blink : in std_logic
);
end component;
component TrafficLights
port( CLK : in std_logic;
Reset : in std_logic;
Blink : in std_logic;
R1 : out std_logic;
Y1 : out std_logic;
G1 : out std_logic;
R2 : out std_logic;
Y2 : out std_logic;
G2 : out std_logic;
OutDouble : out std_logic
);
end component;
signal Intermed : std_logic; -- вътрешен сигнал за предаване на тактовия сигнал от ClkStrecher
--към TrafficLights
begin
in1: ClkStretcher port map(CLK=>BoardCLK,OutCLK=>Intermed,Reset=>Reset,Blink=>Blink);
in2: TrafficLights port map(CLK=>Intermed,Reset=>Reset,Blink=>Blink,R1=>R1,Y1=>Y1,G1=>G1,R2=>R2,Y2=>Y2,G2=>G2,OutDouble=>OutDouble);
end Structural;
В проекта главният модул GeneralModule описва архитектурата на устройство, съставено от декларирани два блока (компонента): ClkStretcher и TrafficLights, които са описани в съответните, подчинени на главния модули.
- Актуализирайте съдържанието на файла чрез File => Save.
В прозореца Sources на Project Navigator получавате следния вид на досега включените елементи в проекта:
- Изпълнете процесите на проектиране на устройството. За тази цел:
- В прозореца Processes for Current Source (при избран сорс-модул GeneralModule в прозореца Sources in Project) разширете Implement Design и двойно кликнете върху последния процес: Generate Programming File. Системата за проектиране ще изпълни всички процеси на проектиране в необходимата последователност.
Сподели с приятели: |