Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 22

课程设计报告

课程:EDA 技术基础

题目: 交通灯控制器的设计

学生姓名:周桢
学 号:202111250520
班 级: 电信 2102
专 业:电子信息科学与技术
指导教师:刘凡 金宇玥 杨耀城 周妙芳 王博文 胡力文 钟海丽

2023 年 12 月 30 日

长沙理工大学课程设计任务书

II
物理与电子科学 学院 电子信息科学与技术 专业 电信 2102 班 姓名 周桢

课程名称 EDA 技术基础


题 目 交通灯控制器的设计
同组设计者:沙余、张聪、王煜、徐瑞鑫

要求:1)主干道绿灯亮时,支干道红灯亮,反之亦然,两者交替允许通行,主干道每次
放行120s,支干道每次放行30s。每次由绿灯变为红灯的过程中,黄灯亮3s作为过渡
(2)能实现正常的倒计时显示功能
(3)能实现总体复位功能:计数器由初始状态开始计数,对应状态的指示灯亮
(4)能实现特殊状态的功能显示:进入特殊状态时,东西、南北路口均显示红灯状态
(5)加速测试功能(五倍、十倍)

发挥部分:
(6)增加左转和右转允许指示灯和对应控制逻辑

工作计划
(1)时间安排
本课程设计安排2周时间
(2)进度安排
第1周周一周二:查阅资料,拿出整体设计方案,划分模块,分工和人员安排
第1周周三至周五:各模块的设计、调试、验证
第2周周三前完成项目整体调试和测试
第2周周三周四文档写作整理
第2周周五:以PPT形式做答辩讨论

指导教师: 教研室意见:

刘凡 金宇玥 杨耀城 周妙芳 王


博文 胡力文 钟海丽
教研室主任
年 月 日
2023 年 12 月 30 日

长沙理工大学课程设计成绩评定表

III
学生姓名: 周桢 学号:202111250520 专业班级: 电信 2102
课程设计题目: 交通灯控制器的设计

评分项目 要求 分值 得分

学习态度 学习态度认真,遵守纪律。 10

设计方案 调研充分,方案设计合理。 20
工作量 完成了任务书规定的工作量。实际设计、
40
调试效果好。
完全符合撰写规范要求,结构严谨,逻
设计报告 辑性强,层次清晰,表述准确,文字流 20
畅。

准备充分,概念清楚,能准确流利地回
答辩 10
答各种问题。

总分

备注:

成绩: 指导教师:

年 月 日

IV
摘要
本设计基于 VHDL 语言,设计了一款交通灯控制器用于模拟和控制路口的红黄绿交通
灯的变化过程。该设计可以分为时钟分频、红绿灯状态转换及 5 种状态译码和数码管显示 4
个模块。时钟分频模块用于将 50MHz 的时钟分为 10 Hz、5Hz、1Hz 的时钟计数信号,并输入
到交通灯的计数模块控制计数状态的转换以及红黄绿灯的跳转,同时设计了置数功能和特
殊状态,以实现交通灯的显示与控制。
在本次设计中使用 FPGA 作为主要的设计芯片,用 VHDL 语言对所需要的程序进行编写,
使得它具有非常强的移植性,有利于产品的升级换代。利用 Quartus Ⅱ 13.1 对所设计出组
成计费器的 VHDL 代码进行了仿真,并在 FPGA 实验板上实现了实物演示与验证。

关键字:FPGA,交通灯控制器,VHDL,Quartus Ⅱ 13.0

Abstract

This design is based on VHDL language, and a traffic light controller is


designed to simulate and control the changing process of red, yellow, and green
traffic lights at intersections. This design can be divided into four modules:
clock division, traffic light state conversion, 5 state decoding, and digital
display. The clock division module is used to divide the 50MHz clock into 10
Hz, 5 Hz, and 1 Hz clock counting signals, and input them into the counting
module of the traffic light to control the conversion of counting status and
the jumping of red, yellow, and green lights. At the same time, the setting
function and special status are designed to achieve the display and control of
traffic lights.

In this design, FPGA is used as the main design chip, and the required programs
are written in VHDL language, making it highly portable and conducive to
product upgrades and upgrades. The VHDL code for the designed billing device
was simulated using Quartus II 13.1, and a physical demonstration and
verification were achieved on an FPGA experimental board.

Keywords: FPGA, traffic light controller, VHDL, Quartus II 13.0

3
目录
摘要......................................................................................................3
Abstract..............................................................................................3
第一章:任务要求:..........................................................................5
第二章:设计方案与原理..................................................................6
第三章 模块设计..............................................................................8
第四章 个人模块设计与仿真..........................................................13
第五章 整体顶层文件与整体电路图..............................................14
第六章 总结.......................................................................................15
参考文献............................................................................................16
附录....................................................................................................17

第一章:任务要求

4
1.1 基本要求:
由一条主干道和一条支干道汇合点形成十字交叉路口,主干道为南北向,支干道为东西向
为确保车辆安全、迅速地通行,在交叉道口的每个入口处设置了红,绿,黄3色信号灯。
(1)主干道绿灯亮时,支干道红灯亮,反之亦然,两者交替允许通行,主干道每次放行12
0s,支干道每次放行30s。每次由绿灯变为红灯的过程中,黄灯亮3s作为过渡
(2)能实现正常的倒计时显示功能
(3)能实现总体复位功能:计数器由初始状态开始计数,对应状态的指示灯亮
(4)能实现特殊状态的功能显示:进入特殊状态时,东西、南北路口均显示红灯状态
(5)手动控制红绿灯功能
(6)加速测试功能(五倍、十倍)

1.2 发挥部分:
发挥部分:
(1) 增加左转允许控制功能
(2) 红绿灯时间设置
选择学校附近一个实际路口观测,按观测的实际数据设计该路口交通灯控制器。

5
第二章:设计方案与原理
FPGA 交通灯控制器由分频模块、计数模块、译码模块、置数模块等模块组成,整个系统
采用模块化设计。
通过分频模块对 50MHz 晶振进行分频后输出计数模块所需要的时钟信号,然后通过计
算时钟信号上升沿来驱动计数模块进行计数,计数模块则由一个 184 进制的加计数器和状
态机构成同时内部设立了复位和特殊状态,计数器的初始状态为 0 并对输入的时钟信号的
上升沿进行计数,当计数值达到一定大小时,则会驱使状态机进行状态转换,在不同的状
态下通过设定一定大小的数减去 184 进制加计数器中的数即可得到该状态下所需显示红绿
灯数码值,在进制转换后,将该数码值的高低四位分别输入到译码模块中即可在数码管上
显示出对应的数字。其总体框架如下:

图 2.1 总体设计框架

6
第三章 模块设计
3.1 分频模块
分频模块主要是将 50MHz 的晶振信号分频成 10Hz、5Hz、1Hz 的信号,并通过薄码开关对
档位进行控制,将晶振信号分频后的时钟信号输入给下一级的计数模块以提供所需的倒计
时秒计数器,同时通过档位的调节将 5Hz、10Hz 信号输入计数模块即可完成 5 倍速和 10 倍
速的加速测试功能 图 3.1 是设计好的模块示意图。
clk——输入端,该端口输入 50MHz 晶振信号。
S1、S2——输入端,为档位选择按键。
档位设定如下:
当 S1、S2 同时为低电平时,输出端 HZ 输出高电平;当 S1 为高电平 S2 为低电平时,输
出 1Hz 时钟信号;当 S1 为低电平 S2 为高电平时,输出 5Hz 时钟信号;当输入 S1、S2 均为
高电平时,输出端输出 10Hz 时钟信号。
HZ——输出端,该端为时钟信号输出端口,可输出 1Hz、5Hz、10Hz 的时钟信号。

图 3.1 分频模块
实际代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY fenpin IS
port(signal clk:in std_logic;
signal S1:in std_logic;
signal S2:in std_logic;
signal HZ:out std_logic);
END ENTITY fenpin;
architecture ONE OF fenpin IS
COMPONENT oneHZ
port(signal clk:in std_logic;
signal cout:out std_logic);
END COMPONENT;

COMPONENT fourone
port(b,c,d : in std_logic;
s1,s2 : in std_logic;

7
z : out std_logic);
END COMPONENT;

COMPONENT fiveHZ
port(signal clk:in std_logic;
signal cout:out std_logic);
END COMPONENT;

COMPONENT tenHZ
port(signal clk:in std_logic;
signal cout:out std_logic);
END COMPONENT;
SIGNAL B:STD_LOGIC;
SIGNAL C:STD_LOGIC;
SIGNAL D:STD_LOGIC;
BEGIN
U1: oneHZ PORT MAP(clk=>clk,cout=>B);
U2: fiveHZ PORT MAP(clk=>clk,cout=>C);
U3: tenHZ PORT MAP(clk=>clk,cout=>D);
U4: fourone PORT MAP(b=>B,c=>C,d=>D,z=>HZ,S2=>s2,S1=>s1);
END architecture ONE ;

3.2 计数模块
在计数模块中同时设定了复位端、紧急情况端和置数端。计数模块核心为 184 进制的加
计数器,主要对接收到的脉冲进行计数,从而进行红绿灯状态的转换,并通过简单的 10 进
制计算出所需输出的秒数后,转换为 8 位二进制码输出,其中高低四位分别输出到译码模
块,以完成最后的译码显示。图 3.2 是设计好的模块示意图。
CLK1——输入端,输入分频好的时钟信号。
RST1——输入端,复位输入端。
key1——输入端,输入紧急信号,按下按键后强制跳转为红灯。
key2——输入端,进行位数选择。
Key3——输入端,对选择位数进行加 1 操作。
Key4——输入端,对选择位数进行减 1 操作。
LED——输出端,输出红绿灯控制信号,高低三位分别为主干道和支干道的红黄绿灯。
WideSEGH——输出端,输出主干道红绿灯倒计时对应的十位的 BCD 码。
WideSEGL——输出端,输出主干道红绿灯倒计时对应的个位的 BCD 码。
NSEGH——输出端,输出支干道红绿灯倒计时对应的十位的 BCD 码。
NSEGL——输出端,输出支干道红绿灯倒计时对应的个位的 BCD 码。

8
图 3.2 计数模块
实际代码如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY Traffic1 IS
PORT (CLK1,RST1 : IN STD_LOGIC;
LED1: OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
key1: in bit;
key2: in bit;
key3: in bit;
key4: in bit;
OUT1 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUT2 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUT3 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUT4 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0) );
END ENTITY Traffic1 ;
architecture ONE OF Traffic1 IS
COMPONENT traffic
PORT(CLK,RST: IN STD_LOGIC;
key1: in bit;
key2: in bit;
key3: in bit;
key4: in bit;
LED: OUT STD_LOGIC_VECTOR(5 DOWNTO 0);--定义 6 个 LED 灯
WideSEGH: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --主干倒计时的十位
WideSEGL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --主干倒计时的个位
NSEGH: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --支干倒计时的十位
NSEGL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); --支干倒计时的个位
END COMPONENT;

COMPONENT SEG
PORT ( INNUM1 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
INNUM2 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
INNUM3 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
INNUM4 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
OUTNUM1 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
9
OUTNUM2 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUTNUM3 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUTNUM4 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); --输出七位字形码
END COMPONENT;
SIGNAL A:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL B:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL C:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL D:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
U1: traffic PORT MAP(CLK=>CLK1,RST=>RST1,WideSEGH=>A,
WideSEGL=>B,NSEGH=>C,NSEGL=>D,LED=>LED1,key1=>key1,key2=>key2,key3=>key3,key4=>
key4);
U2: SEG PORT
MAP(INNUM1=>A,INNUM2=>B,INNUM3=>C,INNUM4=>D,OUTNUM1=>OUT1,OUTNUM2=>OUT2,OUTNUM3
=>OUT3,OUTNUM4=>OUT4);
END architecture ONE ;

3.3 译码模块
译码模块在收到计数模块给的 BCD 码输出后,将其译为对应的字符信号输出以驱动数
码管显示对应的字符。图 3.3 是设计好的模块示意图。
INNUM1、INNUM2、INNUM3、INNUM4——输入端,输入对应的 BCD 码。
OUTNUM1、OUTNUM2、OUTNUM3、OUTNUM4——输出端,输出 BCD 码所对应的字符码,并驱动数
码管显示相应字符。

图 3.3 译码模块
实际代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY SEG2 IS --工程名为 SEG7_4
PORT ( INNUM1 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
INNUM2 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
NNUM3 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
INNUM4 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
OUTNUM1 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUTNUM2 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUTNUM3 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUTNUM4 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); --输出七位字形码
END;
ARCHITECTURE ONE OF SEG2 IS
BEGIN
10
PROCESS(INNUM1)
BEGIN
CASE INNUM1 IS
WHEN "0000" => OUTNUM1 <= NOT"0111111";
WHEN "0001" => OUTNUM1 <= NOT"0000110";
WHEN "0010" => OUTNUM1 <= NOT"1011011";
WHEN "0011" => OUTNUM1 <= NOT"1001111";
WHEN "0100" => OUTNUM1 <= NOT"1100110";
WHEN "0101" => OUTNUM1 <= NOT"1101101";
WHEN "0110" => OUTNUM1 <= NOT"1111101";
WHEN "0111" => OUTNUM1 <= NOT"0000111";
WHEN "1000" => OUTNUM1 <= NOT"1111111";
WHEN "1001" => OUTNUM1 <= NOT"1101111";
WHEN OTHERS => NULL ;
END CASE ;
END PROCESS;

PROCESS(INNUM2)
BEGIN
CASE INNUM2 IS
WHEN "0000" => OUTNUM2 <=NOT "0111111";
WHEN "0001" => OUTNUM2 <=NOT "0000110";
WHEN "0010" => OUTNUM2 <=NOT "1011011";
WHEN "0011" => OUTNUM2 <=NOT "1001111";
WHEN "0100" => OUTNUM2 <=NOT "1100110";
WHEN "0101" => OUTNUM2 <=NOT "1101101";
WHEN "0110" => OUTNUM2 <=NOT "1111101";
WHEN "0111" => OUTNUM2 <=NOT "0000111";
WHEN "1000" => OUTNUM2 <=NOT "1111111";
WHEN "1001" => OUTNUM2 <=NOT "1101111";
WHEN OTHERS => NULL ;
END CASE ;
END PROCESS;
PROCESS(INNUM3)
BEGIN
CASE INNUM3 IS
WHEN "0000" => OUTNUM3 <=NOT "0111111";
WHEN "0001" => OUTNUM3 <=NOT "0000110";
WHEN "0010" => OUTNUM3 <=NOT "1011011";
WHEN "0011" => OUTNUM3 <=NOT "1001111";
WHEN "0100" => OUTNUM3 <=NOT "1100110";
WHEN "0101" => OUTNUM3 <=NOT "1101101";
WHEN "0110" => OUTNUM3 <=NOT "1111101";
WHEN "0111" => OUTNUM3 <=NOT "0000111";
11
WHEN "1000" => OUTNUM3 <=NOT "1111111";
WHEN "1001" => OUTNUM3 <=NOT "1101111";
WHEN OTHERS => NULL ;
END CASE ;
END PROCESS;

PROCESS(INNUM4)
BEGIN
CASE INNUM4 IS
WHEN "0000" => OUTNUM4 <=NOT "0111111";
WHEN "0001" => OUTNUM4 <=NOT "0000110";
WHEN "0010" => OUTNUM4 <=NOT "1011011";
WHEN "0011" => OUTNUM4 <=NOT "1001111";
WHEN "0100" => OUTNUM4 <=NOT "1100110";
WHEN "0101" => OUTNUM4 <=NOT "1101101";
WHEN "0110" => OUTNUM4 <=NOT "1111101";
WHEN "0111" => OUTNUM4 <=NOT "0000111";
WHEN "1000" => OUTNUM4 <=NOT "1111111";
WHEN "1001" => OUTNUM4 <=NOT "1101111";
WHEN OTHERS => NULL ;
END CASE ;
END PROCESS;
END;

12
第四章 个人模块设计与仿真

图 4.1 设备烧录

设备烧录

将编译好的代码烧录进板子并进行调试和测试

仿真方案:时序仿真方法;

仿真设置:

对整体进行仿真,由于分频模块的存在,在仿真前将分频模块的代码修改成为二分频,在
设置仿真周期时设置为 40ns,仿真结束时间设置为 10us,这样也可以实现在一个仿真过程
里面观察到完整的一个红绿灯变化过程。

仿真预期:

加入激励信号,开始仿真后,LED 和 LEDL 输出端显示直行和左转的状态机状态转换,OUT


输出端会显示直行和左转的倒计时 7 段译码显示。

仿真结果:如下图,符合预期的设想

仿真分析:

在测试仿真时,使用之前的激励设置发现并不能实现仿真,经过排错与分析,找到出现错
误的原因是分频模块的存在,而仿真的最大只能在 100us,所以导致了仿真的失败,之后
13
为了测试完整的仿真效果,就修改了分频模块的代码,使设置合适的时钟信号后,可以在
仿真图中显示一个完整的仿真过程。

14
第五章 整体顶层文件与整体电路图

5.1 总体设计

图 5.1 总体电路图

5.2 整体实物图

15
图 5.2.1 实物展示图

第六章 总结
本文论述了基于 VHDL 的交通信号灯的设计,分别介绍了整体系统设计和各模块的设计。
使用 VHDL 语言和 Quartus Ⅱ 软件,实现了该系统软件的设计。在为期两周的课程设计中,
我们能够实现基本的要求,还做了一些发挥部分。
在进行这个交通灯控制器的 EDA 课设过程中,我深刻领悟到了电子设计自动化领域的
广度和深度。首先,通过对逻辑设计的深入思考,我学到了如何有效地将复杂的交通控制
逻辑转化为可行的电路结构。仿真验证阶段帮助我发现潜在的问题和优化空间,培养了我
对设计的细致入微的关注。在团队合作中,与同学们的交流让我拓展了视野,学到了不同
思维方式下的解决方案。
这个课设不仅仅是一个实习项目,更是一个锻炼全方位技能的机会。处理电路设计中
的挑战时,我培养了解决问题的耐心和毅力。同时,通过与团队协作,我更加深刻地理解
了在项目中沟通、合作和分享资源的重要性。这个交通灯控制器的 EDA 课设是一个独特而充
实的学习体验,让我更加自信地面对未来电子设计领域的挑战。
在完成交通灯控制器的 EDA 课设过程中,我不仅仅掌握了具体的电路设计技能,还深
刻认识到整个项目生命周期中的各个环节如何相互关联。透过仿真验证,我学到了如何分
析电路性能和稳定性,以及如何通过调整参数和逻辑来达到设计目标。此外,与团队协作

16
的经验让我领悟到团队协作对于项目成功的至关重要性。我们需要协同努力,分享思路,
解决潜在问题,从而推动整个设计流程向前推进。这种团队协作的经历为我未来职业生涯
中与他人合作打下了坚实基础。
总的来说,这个项目不仅在技术层面上提升了我的能力,还培养了我在团队合作和解
决实际问题方面的素养。这次经历为我未来在电子设计领域的发展奠定了坚实的基础,让
我深感收获颇丰。

17
参考文献
[1] 余丽红.龙诺春.林春景.柳贵东.基于 VHDL 的交通灯控制器的程序设计.无线互联
科技.2020
[2] 付家才.EDA 工程实践技术[M].北京:化学工业出版社,2005..
[3] 潘松.黄继业.EDA 技术实用教程[M].北京:科学出版社,2013.
[4] 黄明霞.许泽恩.李如仁.张海强.基于 FPGA 的智能交通信号灯的设计.沈阳建筑大
学交通工程学院硕士论文
[5] 刘艳萍,高振斌,李志军.EDA 技术及应用[M].北京:国防工业出版社,2006.
[6] 潘松,黄继业.EDA 技术实用教程.北京.科学出版社,2018.
[7] 黄智伟.FPGA 系统设计与实践应用,北京:电子工业出版社,2005,200~217.
[8] 王小军.VHDL 简明教程[M].北京:清华大学出版社,1997,3-4.

附录
附录 1:VHDL 部分程序:
分频模块:LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY fenpin IS
port(signal clk:in std_logic;
signal S1:in std_logic;
signal S2:in std_logic;
signal HZ:out std_logic);
END ENTITY fenpin;
architecture ONE OF fenpin IS
COMPONENT oneHZ
port(signal clk:in std_logic;
signal cout:out std_logic);
END COMPONENT;

COMPONENT fourone
port(b,c,d : in std_logic;
s1,s2 : in std_logic;
z : out std_logic);
END COMPONENT;

COMPONENT fiveHZ
port(signal clk:in std_logic;
signal cout:out std_logic);
18
END COMPONENT;

计数模块:COMPONENT tenHZ
port(signal clk:in std_logic;
signal cout:out std_logic);
END COMPONENT;
SIGNAL B:STD_LOGIC;
SIGNAL C:STD_LOGIC;
SIGNAL D:STD_LOGIC;
BEGIN
U1: oneHZ PORT MAP(clk=>clk,cout=>B);
U2: fiveHZ PORT MAP(clk=>clk,cout=>C);
U3: tenHZ PORT MAP(clk=>clk,cout=>D);
U4: fourone PORT MAP(b=>B,c=>C,d=>D,z=>HZ,S2=>s2,S1=>s1);
END architecture ONE ;

IBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY Traffic1 IS
PORT (CLK1,RST1 : IN STD_LOGIC;
LED1: OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
key1: in bit;
key2: in bit;
key3: in bit;
key4: in bit;
OUT1 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUT2 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUT3 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUT4 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0) );
END ENTITY Traffic1 ;
architecture ONE OF Traffic1 IS
COMPONENT traffic
PORT(CLK,RST: IN STD_LOGIC;
key1: in bit;
key2: in bit;
key3: in bit;
key4: in bit;
LED: OUT STD_LOGIC_VECTOR(5 DOWNTO 0);--定义 6 个 LED 灯
WideSEGH: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --主干倒计时的十位
19
WideSEGL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --主干倒计时的个位
NSEGH: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --支干倒计时的十位
NSEGL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); --支干倒计时的个位
END COMPONENT;

COMPONENT SEG
PORT ( INNUM1 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
INNUM2 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
INNUM3 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
INNUM4 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
OUTNUM1 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUTNUM2 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUTNUM3 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUTNUM4 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); --输出七位字形码
END COMPONENT;
SIGNAL A:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL B:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL C:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL D:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
U1: traffic PORT MAP(CLK=>CLK1,RST=>RST1,WideSEGH=>A,
WideSEGL=>B,NSEGH=>C,NSEGL=>D,LED=>LED1,key1=>key1,key2=>key2,key3=>key3,ke
y4=>key4);
U2: SEG PORT
MAP(INNUM1=>A,INNUM2=>B,INNUM3=>C,INNUM4=>D,OUTNUM1=>OUT1,OUTNUM2=>OUT2,OUT
NUM3=>OUT3,OUTNUM4=>OUT4);
END architecture ONE ;

译码模块:LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY SEG2 IS --工程名为 SEG7_4
PORT ( INNUM1 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
INNUM2 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
NNUM3 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
INNUM4 : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
OUTNUM1 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUTNUM2 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUTNUM3 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
OUTNUM4 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); --输出七位字形码
END;
ARCHITECTURE ONE OF SEG2 IS
20
BEGIN
PROCESS(INNUM1)
BEGIN
CASE INNUM1 IS
WHEN "0000" => OUTNUM1 <= NOT"0111111";
WHEN "0001" => OUTNUM1 <= NOT"0000110";
WHEN "0010" => OUTNUM1 <= NOT"1011011";
WHEN "0011" => OUTNUM1 <= NOT"1001111";
WHEN "0100" => OUTNUM1 <= NOT"1100110";
WHEN "0101" => OUTNUM1 <= NOT"1101101";
WHEN "0110" => OUTNUM1 <= NOT"1111101";
WHEN "0111" => OUTNUM1 <= NOT"0000111";
WHEN "1000" => OUTNUM1 <= NOT"1111111";
WHEN "1001" => OUTNUM1 <= NOT"1101111";
WHEN OTHERS => NULL ;
END CASE ;
END PROCESS;

PROCESS(INNUM2)
BEGIN
CASE INNUM2 IS
WHEN "0000" => OUTNUM2 <=NOT "0111111";
WHEN "0001" => OUTNUM2 <=NOT "0000110";
WHEN "0010" => OUTNUM2 <=NOT "1011011";
WHEN "0011" => OUTNUM2 <=NOT "1001111";
WHEN "0100" => OUTNUM2 <=NOT "1100110";
WHEN "0101" => OUTNUM2 <=NOT "1101101";
WHEN "0110" => OUTNUM2 <=NOT "1111101";
WHEN "0111" => OUTNUM2 <=NOT "0000111";
WHEN "1000" => OUTNUM2 <=NOT "1111111";
WHEN "1001" => OUTNUM2 <=NOT "1101111";
WHEN OTHERS => NULL ;
END CASE ;
END PROCESS;

21

You might also like