Проектиране на Управляващо устройство за светофари като краен автомат с помощта на развойна среда (Webpack) и входно hdl – описание



страница1/3
Дата23.10.2018
Размер3.32 Mb.
#93420
  1   2   3


Упражнение № 4, 2012
Системи с Програмируема Логика

Проектиране на Управляващо устройство за светофари като краен автомат с помощта на развойна среда (WebPACK) и входно HDL – описание

Целта на настоящото лабораторно упражнение е проектиране, имплементиране върху CPLD – чип и проверка на функционирането на управляващо устройство за светофари на улично кръстовище. Ще използваме развойна среда WebPACK, входен език за описание VHDL и развойна платка Digilent X-Board.


Проектираното и имплементирано устройство ще управлява светофарна уредба на кръстовище от две улици. Светофарната уредба ще включва и допълнителна функция за мигаща жълта светлина, индицираща временно преустановяване на работата на светофара.

Устройството, което ще проектираме и имплементираме върху електрически конфигурируем (програмируем) CPLD – чип, в първата му, опростена версия ще бъде изградено от следните два цифрови блока (устройства):



  1. ClkStretcher – блок- генератор на синхронизиращ сигнал с променлива продължителност на тактовите му импулси.

  2. Т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. Системата за проектиране ще изпълни всички процеси на проектиране в необходимата последователност.



Сподели с приятели:
  1   2   3




©obuch.info 2024
отнасят до администрацията

    Начална страница