# 数字电路课程设计
# 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 码转七段显示译码器 - 引脚设置要仔细,要与开发板上的引脚对应,否则会出现无法下载的情况或者下载后无法正常工作的情况
- 功能仿真时,要注意时钟信号的周期,要与设计时的时钟信号周期一致,否则会出现仿真结果与实际结果不一致的情况