# 数字电路课程设计
# 1. 课设要求
学习利用计数器和状态机设计十字路口交通灯控制器。设计一个简单十字路口交通灯控制器。该控制器控制甲乙两道的红、黄、绿三色灯,指挥交通和行人安全通行。复杂十字路口交通灯控制器要比简单交通灯控制器增加一些功能,如倒计时时间显示,左转弯(左拐)、指示灯闪烁及特殊紧急情况的处理等.
# 2. 设计方案
甲道 --> 绿灯 25s 黄灯 5s 左转灯 15s 黄灯 5s 红灯 40s
乙道 --> 红灯 50s 绿灯 20s 黄灯 5s 左转灯 10s 黄灯 5s
# 3. 设计思想描述
保证主干道的绿灯时间大于支路的绿灯时间,保证主干道的通行能力大于支路的通行能力.
当使能端为高电平时,甲道状态为
绿->黄->左->黄->红
,乙道状态为红->绿->黄->左->黄
,并依次循环进行下去.每个方向上的红灯时间都应该为绿灯 + 黄灯 + 左转灯 + 黄灯时间
状态 LAMPA: 控制 A 方向的四盏灯的亮灭,状态 LAMPB: 控制 B 方向的四盏灯的亮灭,状态如下表所示.
<table>
<tr>
<th colspan="4">LAMPA</th>
<th colspan="4">LAMPB</th>
</tr>
<tr>
<th> 绿 </th>
<th> 黄 </th>
<th> 左 </th>
<th> 红 </th>
<th> 绿 </th>
<th> 黄 </th> <!-- 高电平亮 -->
<th> 左 </th>
<th> 红 </th>
</tr>
<tr>
<th>0</th>
<th>0</th>
<th>0</th>
<th>1</th>
<th>0</th>
<th>0</th>
<th>0</th>
<th>1</th>
</tr>
<tr>
<th>0</th>
<th>0</th>
<th>1</th>
<th>0</th>
<th>0</th>
<th>0</th>
<th>1</th>
<th>0</th>
</tr>
<tr>
<th>0</th>
<th>1</th>
<th>0</th>
<th>0</th>
<th>0</th>
<th>1</th>
<th>0</th>
<th>0</th>
</tr>
<tr>
<th>1</th>
<th>0</th>
<th>0</th>
<th>0</th>
<th>1</th>
<th>0</th>
<th>0</th>
<th>0</th>
</tr>
</table>将 DE2-70 实验板上的 50MHz 时钟信号分频为 1Hz 的时钟信号,用于计时.
使用七段数字显示器显示甲乙两道上的倒计时时间,将每条通道的倒计时时间分为两个部分,一个部分为十位数,一个部分为个位数,使用两个七段数字显示器分别显示十位数和个位数.
对应 DE2-70 管脚图屏蔽掉开发板上的小数点位显示
当遇到紧急情况时,甲乙两道全部变成无倒计时的红灯.
夜间警惕模式,甲乙两道都变成黄灯闪烁
# 4. 代码实现
# 4.1 BCD 码转七段显示译码器
1 | // 实现将BCD码转为七段显示译码器 |
# 4.2 时钟降频
1 | //降频模块 |
# 4.3 主体逻辑代码
1 | module traffic( |
# 4.4 顶层模块
1 | module TrafficTop ( |
# 5. 实验过程
# 5.1 New Project Wizard
- 新建工程文件
注意输入的顶层实体名必须与之后设计文件的顶层实体名一致
- 添加 traffictop.v 文件
- 选择设计器件,本次实验采用的是 Altera 公司提供的 DE2-70 开发板.
Device family 选择 CycloneⅡ,Package 选择 FBGA,PinCount 选择 896,speed grade 选择 6
# 5.2 Start Analysis & Synthesis
将 RTL (寄存器传输级) 转换为网表级,并进行综合分析,生成综合报告
# 5.3 Start Compilation
# 5.4 Pins Assignment
手工分配引脚
NodeName | Location |
---|---|
CLK | PIN_AD15 |
EN | PIN_AA23 |
mode[1] | PIN_AB25 |
mode[0] | PIN_AB26 |
dis[7] | PIN_G2 |
dis[6] | PIN_K2 |
dis[5] | PIN_K6 |
dis[4] | PIN_L6 |
dis[3] | PIN_M4 |
dis[2] | PIN_AC19 |
dis[1] | PIN_AC17 |
dis[0] | PIN_AF12 |
LAMPA[3] | PIN_AJ7 |
LAMPA[2] | PIN_AD8 |
LAMPA[1] | PIN_AD9 |
LAMPA[0] | PIN_AC11 |
LAMPB[3] | PIN_AB12 |
LAMPB[2] | PIN_AC12 |
LAMPB[1] | PIN_AB13 |
LAMPB[0] | PIN_AC13 |
segAH[6] | PIN_G1 |
segAH[5] | PIN_H3 |
segAH[4] | PIN_H2 |
segAH[3] | PIN_H1 |
segAH[2] | PIN_J2 |
segAH[1] | PIN_J1 |
segAH[0] | PIN_K3 |
segAL[6] | PIN_E4 |
segAL[5] | PIN_F4 |
segAL[4] | PIN_G4 |
segAL[3] | PIN_H8 |
segAL[2] | PIN_H7 |
segAL[1] | PIN_H4 |
segAL[0] | PIN_H6 |
segBH[6] | PIN_K5 |
segBH[5] | PIN_K4 |
segBH[4] | PIN_K1 |
segBH[3] | PIN_L3 |
segBH[2] | PIN_L2 |
segBH[1] | PIN_L1 |
segBH[0] | PIN_M3 |
segBL[6] | PIN_M2 |
segBL[5] | PIN_M1 |
segBL[4] | PIN_N3 |
segBL[3] | PIN_N2 |
segBL[2] | PIN_P3 |
segBL[1] | PIN_P2 |
segBL[0] | PIN_P1 |
# 5.5 Programmer
将设计下载到 FPGA 中
# 5.6 功能仿真
- 添加波形文件
- 插入信号结点
- CLK 设为周期为 20ns 的时钟信号,EN 设为 1,mode 设为 00
- 设置仿真模式为 Functional
- 生成功能仿真网表
- 启动仿真
# 6. 实验结果
见视频
# 7. 实验收获与体会
- 注意 verilog 语言的书写规范,如
begin
和end
要成对出现,case
和endcase
要成对出现,if
和else
要成对出现,always
和end
要成对出现,always
和begin
要成对出现,always
和endcase
要成对出现,always
和case
要成对出现,always
和if
要成对出现 - 名称命名要规范,如
CLK_1HzOut
和CLK_50MHzInput
中的CLK
表示时钟,1Hz
表示 1Hz 时钟,Out
表示输出,50MHz
表示 50MHz 时钟,Input
表示输入,Divider50MHz
表示 50MHz 时钟的分频模块,Divider
表示分频,50MHz
表示 50MHz 时钟,traffic
表示交通灯控制模块,trafficTop
表示顶层模块,_BCDto7LED
表示 BCD 码转七段显示译码器 - 引脚设置要仔细,要与开发板上的引脚对应,否则会出现无法下载的情况或者下载后无法正常工作的情况
- 功能仿真时,要注意时钟信号的周期,要与设计时的时钟信号周期一致,否则会出现仿真结果与实际结果不一致的情况