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


Нов вид на графа, описващ крайния автомат за управление на светофари



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

Нов вид на графа, описващ крайния автомат за управление на светофари ТrafficLights

- Кликнете двойно с мишката върху името на модула TrafficLights.vhd в прозореца 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 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

----------------------

R_W1 : out std_logic;

G_W1 : out std_logic;

R_W2 : out std_logic;

G_W2 : out std_logic;

----------------------

CAT_Change : out std_logic;

----------------------

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) -- процес необходим за началното установяване

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'; R_W1<='0'; G_W1<='1'; R_W2<='1'; G_W2<='0'; CAT_Change<='0';
when s2 => R1<='1'; Y1<='0'; G1<='0'; R2<='0'; Y2<='1'; G2<='0'; R_W1<='1'; G_W1<='0'; R_W2<='1'; G_W2<='0'; CAT_Change<='0';

when s3 => R1<='1'; Y1<='1'; G1<='0'; R2<='1'; Y2<='0'; G2<='0'; R_W1<='1'; G_W1<='0'; R_W2<='1'; G_W2<='0'; CAT_Change<='1';


when s4 => R1<='0'; Y1<='0'; G1<='1'; R2<='1'; Y2<='0'; G2<='0'; R_W1<='1'; G_W1<='0'; R_W2<='0'; G_W2<='1'; CAT_Change<='1';
when s5 => R1<='0'; Y1<='1'; G1<='0'; R2<='1'; Y2<='0'; G2<='0'; R_W1<='1'; G_W1<='0'; R_W2<='1'; G_W2<='0'; CAT_Change<='1';
when s6 => R1<='1'; Y1<='0'; G1<='0'; R2<='1'; Y2<='1'; G2<='0'; R_W1<='1'; G_W1<='0'; R_W2<='1'; G_W2<='0'; CAT_Change<='0';
when s7 => if(Blink='1') then

R1<='0'; Y1<='1'; G1<='0'; R2<='0'; Y2<='1'; G2<='0'; R_W1<='0'; G_W1<='0'; R_W2<='0'; G_W2<='0'; CAT_Change<='1';

else

R1<='1'; Y1<='0'; G1<='0'; R2<='0'; Y2<='0'; G2<='1'; R_W1<='0'; G_W1<='1'; R_W2<='1'; G_W2<='0'; CAT_Change<='0';



end if;
when s8 => if(Blink='1') then

R1<='0'; Y1<='0'; G1<='0'; R2<='0'; Y2<='0'; G2<='0'; R_W1<='0'; G_W1<='0'; R_W2<='0'; G_W2<='0'; CAT_Change<='0';

else

R1<='1'; Y1<='0'; G1<='0'; R2<='0'; Y2<='0'; G2<='1'; R_W1<='0'; G_W1<='1'; R_W2<='1'; G_W2<='0'; CAT_Change<='0';



end if;

end case;

end if;

end process process3;


OutDouble<=CLK;

end Behavioral;


- Актуализирайте съдържанието на файла чрез File => Save.

Добавяне в проекта на модул – HexToSevenSegment
Нов модул в проектас име HexToSevenSegment ще описва цифров блок, кодиращ информацията, извеждана чрез седем-сегментни индикаторни елементи.
- Създайте/Добавете нов VHDL – модул в проекта чрез командите от главното меню Project => New Source..., в отворилия се прозорец New Source Wizard изберете за тип на модула: VHDL Module, а за име: HexToSevenSegment

- В изведения прозорец за редактиране на текста на HexToSevenSegment.vhd се изобразява текстовата рамка на създадения модул с VHDL – описанието. (Ако прозорецът с текстовата рамка не е показан на екрана, кликнете двойно с мишката върху името на модула HexToSevenSegment в прозореца 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 HexToSevenSegment is

port(


HEX: in STD_LOGIC_VECTOR (3 downto 0);

LED: out STD_LOGIC_VECTOR (6 downto 0)

);

end HexToSevenSegment;


architecture Behavioral of HexToSevenSegment is
begin
with HEX Select

LED <= "1111001" when "0001", --1

"0100100" when "0010", --2

"0110000" when "0011", --3

"0011001" when "0100", --4

"0010010" when "0101", --5

"0000010" when "0110", --6

"1111000" when "0111", --7

"0000000" when "1000", --8

"0010000" when "1001", --9

"1000000" when others; --0
end Behavioral;

- Актуализирайте съдържанието на файла чрез File => Save и изпълнете процесите на проектиране на устройството (от Generate Programming File...).
След това включване на модул и изпълнени процеси на проектиране, прозорецът Sources на развойната среда, показващ модулите на проекта, ще изглежда така:

- За да можете да стартирате работата и проверите функционирането на новата версия на проектираното устройство върху зададения CPLD – чип върху развойна платка, задайте нови ограничения в работата на развойната среда при работата й. Задайте новите изисквания за разполагане на входните и изходни сигнали на устройството върху точно определени изводи на чипа, така че тези сигнали да управляват или да бъдат управлявани от определени елементи (ключове, бутони, светодиоди) на платката. За тази цел в таблицата, която поддържа програмата Pace от развойната среда, трябва да назначите пинове на CPLD – чипа за допълнителните входно/изходни сигнали на новата версия на устройството.

- Активирайте в прозореца Sources UCF – модула на проекта GlobalUcf.ucf, след което в прозореца Processes разширете User Constraints и от разширението кликнете двойно върху Assign Package Pins;



- Попълнете колоната Loc(ation) на таблицата на програмата Pace с имената на изводите на чипа за допълнителните сигнали, както е дадена по-долу:

- Активирайте главния VHDLмодул на проекта и стартирайте чрез Generate Programming File наново процесите на проектиране;

- Заредете получения от развойната среда файл за конфигуриране GeneralModule.jed с ново съдържание в CPLD – чипа на развойната платка чрез програмата ExPort.

- Проверете работата на имплементираното устройство върху развойната платка X-Board.
С помощта на зададеното по-горе чрез програмата PACE и файла GlobalUCF.usf разполагане на входно/изходните сигнали върху изводите на чипа, работата на проектираното и имплементирано устройството за управление на седем-сегментната индикация на светофарна уредба (GeneralModule) ще се управлява и контролира от следните елементи на платката:

От функционирането на платката се вижда, че междинните фази на светофарите (“червено и жълто” и “жълто” ) продължават доста малко време. Опитайте да увеличите продължителността на тези фази чрез увеличаване на крайните стойности, до които достигат броячите counter2 и counter3 в модула ClkStrecher . (Тези броячи определят продулжителността и интервала между двата кратки импулса от тактовата поредица, синхронизираща управляващото устройство за светофарите).








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




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

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