Нов вид на графа, описващ крайния автомат за управление на светофари Т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 . (Тези броячи определят продулжителността и интервала между двата кратки импулса от тактовата поредица, синхронизираща управляващото устройство за светофарите).
Сподели с приятели: |