VHDL交通灯控制


VHDL交通灯控制

一、项目目的

设计十字路口交通灯控制电路。通过本次实验,要求能够将已有的实体文件
转换为图形符号,并通过图形输入方式实现电路的连接并设定图形电路层的接口;
深入理解结构描述方法和图形输入法的关系。

二、需准备条件

(1) Windows7 或更高版本的操作系统的 PC 机;

(2)安装 QuartusII9.0 EDA 软件;

(3)Cyclone 系列 EP1C3T144 开发板。

三、项目原理

通过 VHDL 编程,实现交通灯控制电路“TrafficLight”。

(1)端口要求:

 clk:50MHz 时钟输入;

 reset:异步复位信号,低电平有效;

 led_h[2..0]:h 方向的三色灯输出;

 led_v[2..0]:v 方向的三色灯输出;

 seg8_addr[3..0]:四位数码管的使能信号线,低电平有效;

 seg8_data[7..0]:四位数码管的数据总线,低电平有效;

撰写三个独立的实体文件,分别为“Clock_1Hz.vhd”、 “TrafficControl.vhd”和“ScanDis.vhd”,并生成对应的图形符号。在图形输入界面将图形符号实例化后连接构成顶层电路图。

(2)功能要求:
设十字路口为 h(东西)方向和 v(南北)方向,h 方向为主干道,绿灯时间稍长。要求整个控制周期为100秒,系统复位后h方向为绿灯(计数显示55秒), v 方向为红灯(计数显示 60 秒),其控制具体要求如下表所示:
image-20210408204808635

TrafficControl 模块是本设计的核心模块,要求输入端包括秒脉冲和异 步复位信号;输出为两组三色灯信号和计数器值信号。注意,计数值输出为 4 位二进制数,每个方向分为个位和十位两组,所以要求在设计中将计数结果的个 位和十位分别取出。比如当前计数为 37,则需要通过数学计算分别取出数值“3” 和“7”,然后通过接口送出到显示模块 ScanDis。

四、外围电路原理

本次实验所用的外围电路包括时钟电路、独立按键电路、6 位 Led 显示电路
和数码管显示电路,其电路原理图和实物图如下图所示。

image-20210408204955155

图 3:时钟产生电路-50MHz

image-20210408205115689

图 4:6 位 Led 显示电路

image-20210408205132719

图 5:4 位独立按键电路

image-20210408205152472

图 6:4 位数码管显示电路

image-20210408205206400

图 7:硬件实物

6位Led发光发光管请选择左边3位为h方向三色灯;右边3位为v方向三色灯;数码管左边两位显示 h 方向计数值,右边两位显示 v 方向技术值;系统复位按键可任意从独立按键中选择。

四、主要代码

1、clock_1hz

entity clock_1hz is
port(clk:in std_logic;
       sclk:out std_logic);
end entity clock_1hz;
architecture one of clock_1hz is
    signal temp:std_logic;
    signal counter:integer range 0 to 50000000:=0;
begin
    process(clk)    
    begin
        IF (clk'event AND clk='1') THEN
            if(counter=25000000)then 
                temp<=not temp;
                counter<=0;
            else
                counter<=counter+1;
            end if;
        end if;    
    end process;
        sclk<=temp;
end architecture one;

2、ScanDis

entity ScanDis is --将数码管扫描显示功能做成块语句
port(clk:in std_logic; --开发板时钟源 50MHz
data3:in integer range 0 to 15;--千位数码管接口输入信号,4 位二进制数
data2:in integer range 0 to 15;--百位数码管接口输入信号,4 位二进制数
data1:in integer range 0 to 15;--十位数码管接口输入信号,4 位二进制数
data0:in integer range 0 to 15;--个位数码管接口输入信号,4 位二进制数
addr:out std_logic_vector(3 downto 0); --4 位数码管使能信号(地址信号)
seg8data:out std_logic_vector(7 downto 0));--4 位数码管公共数据信号
end entity ScanDis;
architecture one of ScanDis is
begin
process(clk)
constant MAX_DIV:integer:=25000;
variable counter:integer range 0 to MAX_DIV;
variable addr_counter:integer range 0 to 3; --地址计数器
variable data_temp:integer range 0 to 15;
begin
if(clk'event and clk='1')then
if(counter=MAX_DIV-1)then
counter:=0;
addr_counter:=addr_counter+1; --地址循环计数 03
case addr_counter is
--输出对应的地址使能信号并读取对应位置的数值到 data_temp
when 0=>addr<="0111";data_temp:=data3;
when 1=>addr<="1011";data_temp:=data2;
when 2=>addr<="1101";data_temp:=data1;
when 3=>addr<="1110";data_temp:=data0;
end case;
case data_temp is
--根据数值选择输出数码形状信号
when 0=>seg8data<="00000011";
when 1=>seg8data<="10011111";
when 2=>seg8data<="00100101";
when 3=>seg8data<="00001101";
when 4=>seg8data<="10011001";
when 5=>seg8data<="01001001";
when 6=>seg8data<="01000001";
when 7=>seg8data<="00011111";
when 8=>seg8data<="00000001";
when 9=>seg8data<="00001001";
when 10=>seg8data<="11111101";
when 11=>seg8data<="11111111";
when 12=>seg8data<="11111111";
when 13=>seg8data<="11111111";
when 14=>seg8data<="11111111";
when 15=>seg8data<="11111111";
end case;
else
counter:=counter+1;
end if;
end if;
end process;
end architecture one;

3、TrafficControl

此处注意a1_2, a2_3, a3_4, a4_1为四个标志位,上升沿时表示状态切换,四个标志位代表四个切换节点。

entity TrafficControl is
port(clk_1s:in std_logic;
      areset:in std_logic;--此为复位信号
     light_h:out std_logic_vector(2 downto 0);
     light_v:out std_logic_vector(2 downto 0);
 count_h_ten:out integer range 0 to 15;
 count_h_one:out integer range 0 to 15;
 count_v_ten:out integer range 0 to 15;
 count_v_one:out integer range 0 to 15);
end entity TrafficControl;
architecture one of TrafficControl is
    signal counter_h:integer range 0 to 100;
    signal counter_v:integer range 0 to 100;
    signal a1_2,a2_3,a3_4,a4_1:std_logic:='0';
begin
    process(clk_1s)
    begin
    if(clk_1s'event and clk_1s='1')then
        count_h_ten<=counter_h/10;
        count_h_one<=counter_h rem 10;
        count_v_ten<=counter_v/10;
        count_v_one<=counter_v rem 10;
    end if;
    end process;
    process(clk_1s,areset)
    begin
    if(areset='0')then
        a4_1<='1';counter_h<=55;counter_v<=60;
    else
        if(clk_1s'event and clk_1s='1')then
            if(a4_1='1')then
                counter_v<=counter_v-1;
                if(counter_h>=1)then
                    counter_h<=counter_h-1;
                elsif(counter_h<1)then
                    a4_1<='0';a1_2<='1';
                    counter_h<=5;
                end if;    
            elsif(a1_2='1')then
                counter_v<=counter_v-1;
                if(counter_h>=1)then
                    counter_h<=counter_h-1;
                elsif(counter_h<1)then
                    a1_2<='0';a2_3<='1';
                    counter_h<=40;
                    counter_v<=35;
                end if;
            elsif(a2_3='1')then
                counter_v<=counter_v-1;
                if(counter_h>=6)then
                    counter_h<=counter_h-1;
                elsif(counter_h<6)then
                    a2_3<='0';a3_4<='1';
                    counter_v<=5;
                end if;
            elsif(a3_4='1')then
                counter_v<=counter_v-1;
                if(counter_h>=1)then
                    counter_h<=counter_h-1;
                elsif(counter_h<1)then
                    a3_4<='0';a4_1<='1';
                    counter_h<=55;
                    counter_v<=60;
                end if;
            else
                counter_h<=88;
                counter_v<=88;
            end if;
        end if;
    end if;
    end process;
    process(clk_1s)
    begin
    if(a1_2='1')then
        light_h<="101";light_v<="011";
    elsif(a2_3='1')then
        light_h<="011";light_v<="110";
    elsif(a3_4='1')then
        light_h<="011";light_v<="101";
    elsif(a4_1='1')then
        light_h<="110";light_v<="011";
    end if;
    end process;
end architecture;

五、模块信号端口连接示意

image-20210408210352756

六、运行结果

image-20210408210721775

h方向绿灯通行,剩余46秒;v方向红灯禁行,剩余51秒

image-20210408210647982

h方向绿灯通行,剩余35秒;v方向红灯禁行,剩余40秒

七、提示

本文仅供学习交流,本项目有助于FPGA入门。FPGA具有开发周期短、灵活性强的优势。近些年来应用领域已由通信逐渐拓展至各行各业(就业前景一片光明_~_)。因此,强烈不推荐直接将源代码粘贴复制,甚至直接将文中图片下载交差了事。


文章作者: Qianyu Zhang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Qianyu Zhang !
  目录