差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
比赛计分系统设计 [2018/10/22 14:54] anran [实验原理] |
比赛计分系统设计 [2021/08/18 09:31] (当前版本) gongyusu |
||
---|---|---|---|
行 1: | 行 1: | ||
- | =====比赛计分系统设计===== | + | ## 比赛计分系统设计 |
- | ----- | + | |
- | ====实验任务==== | + | ### 实验任务 |
* 任务:基于 STEP-MAX10M08核心板 和 STEP BaseBoard V3.0底板 完成比赛计分系统设计并观察调试结果 | * 任务:基于 STEP-MAX10M08核心板 和 STEP BaseBoard V3.0底板 完成比赛计分系统设计并观察调试结果 | ||
行 7: | 行 7: | ||
* 解析:FPGA驱动独立按键,当按动两队加分按键时,控制两队分数调整,最后通过驱动底板上的数码管电路将得分值显示在数码管上。 | * 解析:FPGA驱动独立按键,当按动两队加分按键时,控制两队分数调整,最后通过驱动底板上的数码管电路将得分值显示在数码管上。 | ||
- | ====实验目的==== | + | ### 实验目的 |
在基础数字电路实验部分我们已经掌握了FPGA驱动独立按键的原理及方法,控制数码管显示十进制数的BCD码方案前面也多次介绍,本实验主要学习数码管扫描显示的原理及方法。 | 在基础数字电路实验部分我们已经掌握了FPGA驱动独立按键的原理及方法,控制数码管显示十进制数的BCD码方案前面也多次介绍,本实验主要学习数码管扫描显示的原理及方法。 | ||
行 15: | 行 15: | ||
* 完成比赛计分系统设计实现 | * 完成比赛计分系统设计实现 | ||
- | ====设计框图==== | + | ### 设计框图 |
根据前面的实验解析我们可以得知,该设计可以拆分成三个功能模块实现, | 根据前面的实验解析我们可以得知,该设计可以拆分成三个功能模块实现, | ||
行 26: | 行 26: | ||
{{:5-Top-Down层次设计.png?500|Top-Down层次设计}}{{:5-模块结构设计.png?500|模块结构设计}} | {{:5-Top-Down层次设计.png?500|Top-Down层次设计}}{{:5-模块结构设计.png?500|模块结构设计}} | ||
- | ====实验原理==== | + | ### 实验原理 |
- | ===数码管连接方式=== | + | #### 数码管连接方式 |
在前面之前的教程中数码管章节已为大家介绍了数码管独立显示的相关内容,关于独立显示这里就不在赘述。我们的实验平台的扩展板卡上有8位数码管,根据驱动方法不同,有以下比较: | 在前面之前的教程中数码管章节已为大家介绍了数码管独立显示的相关内容,关于独立显示这里就不在赘述。我们的实验平台的扩展板卡上有8位数码管,根据驱动方法不同,有以下比较: | ||
行 42: | 行 42: | ||
上图中我们用了4位数码管,共用了段选控制8+位选控制4=12管脚,如果是8位数码管,按照上面方式连接,段选控制还是8管脚,位选控制也增加到8管脚,共计16管脚,当然硬件的连接还需要结合软件的驱动,扫描显示数码管的驱动方法和独立显示数码管驱动方法不同,接下来我们一起来学习。 | 上图中我们用了4位数码管,共用了段选控制8+位选控制4=12管脚,如果是8位数码管,按照上面方式连接,段选控制还是8管脚,位选控制也增加到8管脚,共计16管脚,当然硬件的连接还需要结合软件的驱动,扫描显示数码管的驱动方法和独立显示数码管驱动方法不同,接下来我们一起来学习。 | ||
- | ===数码管模块电路连接=== | + | #### 数码管模块电路连接 |
数码管连接方式部分我们了解到数码管常用的两种连接方式,独立显示数码管的原理及驱动方法我们在基础数字电路实验部分就已经详细学习了,本实验我们来学习扫描显示数码管工作原理及驱动方法。 | 数码管连接方式部分我们了解到数码管常用的两种连接方式,独立显示数码管的原理及驱动方法我们在基础数字电路实验部分就已经详细学习了,本实验我们来学习扫描显示数码管工作原理及驱动方法。 | ||
行 50: | 行 50: | ||
{{:5-74HC595驱动数码管电路.png?800|74HC595驱动数码管电路}} | {{:5-74HC595驱动数码管电路.png?800|74HC595驱动数码管电路}} | ||
- | ===数码管模块驱动设计=== | + | #### 数码管模块驱动设计 |
我们知道数码管分位共阴极和共阳极,我们底板上使用的就是8位共阴极数码管,驱动数码管显示需要字库,方便程序中通过数据索引对应字库,在基础数字电路实验部分我们已经学习过。 | 我们知道数码管分位共阴极和共阳极,我们底板上使用的就是8位共阴极数码管,驱动数码管显示需要字库,方便程序中通过数据索引对应字库,在基础数字电路实验部分我们已经学习过。 | ||
行 120: | 行 120: | ||
{{:74hc595逻辑图.jpg?600|74HC595内部结构图}} | {{:74hc595逻辑图.jpg?600|74HC595内部结构图}} | ||
- | {{:74hc595时序图.jpg?300|74HC595时序图}} | + | {{:74hc595时序图.jpg?600|74HC595时序图}} |
根据74HC595内部结构及时序图可以得知,SH_CP(SCK)每个上升沿都会将DS(SER)的数据采样到8位移位寄存器中,当ST_CP(RCK)上升沿时,8位移位寄存器中的数据被所存到8位锁存器中,同时对应Q0~Q7管脚刷新对应输出。对于我们的硬件,我们首先通过SH_CP(SCK)和DS(SER)配合将需要传输的16位数据输出,然后控制ST_CP(RCK)产生上升沿,所以我们需要至少16个SH_CP(SCK)周期完成1次数码管控制。 | 根据74HC595内部结构及时序图可以得知,SH_CP(SCK)每个上升沿都会将DS(SER)的数据采样到8位移位寄存器中,当ST_CP(RCK)上升沿时,8位移位寄存器中的数据被所存到8位锁存器中,同时对应Q0~Q7管脚刷新对应输出。对于我们的硬件,我们首先通过SH_CP(SCK)和DS(SER)配合将需要传输的16位数据输出,然后控制ST_CP(RCK)产生上升沿,所以我们需要至少16个SH_CP(SCK)周期完成1次数码管控制。 | ||
行 176: | 行 176: | ||
如果我们设计一个状态机,将数码管扫描的程序和74HC595串行驱动程序分别做成两个状态MAIN和WRITE,控制数码管扫描程序每次产生一组控制数据,执行一次74HC595串行通信,就可以完成我们数码管模块电路的驱动设计了。 | 如果我们设计一个状态机,将数码管扫描的程序和74HC595串行驱动程序分别做成两个状态MAIN和WRITE,控制数码管扫描程序每次产生一组控制数据,执行一次74HC595串行通信,就可以完成我们数码管模块电路的驱动设计了。 | ||
- | {{:5-状态机设计框架.png?800|状态机设计框架}} | + | {{:5-状态机设计框架.png?600|状态机设计框架}} |
8位数码管刷新1次需要8个数码管各点亮1次,每个数码管点亮1次需要16位数据,16位数据通过串行方式传输给74HC595需要至少16个SH_CP(SCK)周期,按照我们前面说的数码管刷新率达到125次/秒,扫描方式下每个数码管会点亮1毫秒,数码管点亮的时间应该等于1次数码管控制的时间,也就是16个SH_CP(SCK)周期,所以我们可以控制74HC595的SH_CP(SCK)时钟周期计算: | 8位数码管刷新1次需要8个数码管各点亮1次,每个数码管点亮1次需要16位数据,16位数据通过串行方式传输给74HC595需要至少16个SH_CP(SCK)周期,按照我们前面说的数码管刷新率达到125次/秒,扫描方式下每个数码管会点亮1毫秒,数码管点亮的时间应该等于1次数码管控制的时间,也就是16个SH_CP(SCK)周期,所以我们可以控制74HC595的SH_CP(SCK)时钟周期计算: | ||
行 204: | 行 204: | ||
{{:5-状态机状态转移图.png?800|状态机状态转移图}} | {{:5-状态机状态转移图.png?800|状态机状态转移图}} | ||
- | ===系统总体实现=== | + | #### 系统总体实现 |
+ | 按键消抖模块我们前面基础数字电路实验中详细介绍过,这里我们直接调用消抖模块,记分器逻辑部分其实就是对按键按动次数计数,输出0~999之间的BCD码制数据,这里也不再赘述,最后例化数码管模块将两队的比分数据显示出来。最后显示的数据为000~999,本实验例程中为了显示最小有效数据位,增加了将最高位为0的数据位不显示的设计,例如当分数为5分时,数码管本来会显示005,现在控制高两位的00不显示,只显示最低位5。 | ||
+ | 显示控制程序实现如下: | ||
+ | <code verilog> | ||
+ | wire [7:0] dat_en; //控制数码管点亮 | ||
+ | assign dat_en[7] = 1'b0; | ||
+ | assign dat_en[6] = red_seg[11:8]? 1'b1:1'b0; | ||
+ | assign dat_en[5] = red_seg[11:4]? 1'b1:1'b0; | ||
+ | assign dat_en[4] = 1'b1; | ||
+ | |||
+ | assign dat_en[3] = 1'b0; | ||
+ | assign dat_en[2] = blue_seg[11:8]? 1'b1:1'b0; | ||
+ | assign dat_en[1] = blue_seg[11:4]? 1'b1:1'b0; | ||
+ | assign dat_en[0] = 1'b1; | ||
+ | </code> | ||
+ | |||
+ | 数码管显示模块例化 程序实现如下: | ||
+ | <code verilog> | ||
+ | //segment_scan display module | ||
+ | Segment_scan u4 | ||
+ | ( | ||
+ | .clk (clk ), //系统时钟 12MHz | ||
+ | .rst_n (rst_n ), //系统复位 低有效 | ||
+ | .dat_1 (0 ), //SEG1 显示的数据输入 | ||
+ | .dat_2 (red_seg[11:8] ), //SEG2 显示的数据输入 | ||
+ | .dat_3 (red_seg[7:4] ), //SEG3 显示的数据输入 | ||
+ | .dat_4 (red_seg[3:0] ), //SEG4 显示的数据输入 | ||
+ | .dat_5 (0 ), //SEG5 显示的数据输入 | ||
+ | .dat_6 (blue_seg[11:8] ), //SEG6 显示的数据输入 | ||
+ | .dat_7 (blue_seg[7:4] ), //SEG7 显示的数据输入 | ||
+ | .dat_8 (blue_seg[3:0] ), //SEG8 显示的数据输入 | ||
+ | .dat_en (dat_en ), //数码管数据位显示使能,[MSB~LSB]=[SEG1~SEG8] | ||
+ | .dot_en (8'b0001_0001 ), //数码管小数点位显示使能,[MSB~LSB]=[SEG1~SEG8] | ||
+ | .seg_rck (seg_rck ), //74HC595的RCK管脚 | ||
+ | .seg_sck (seg_sck ), //74HC595的SCK管脚 | ||
+ | .seg_din (seg_din ) //74HC595的SER管脚 | ||
+ | ); | ||
+ | </code> | ||
+ | |||
+ | 综合后的设计框图如下: | ||
+ | |||
+ | {{:5-RTL设计框图.png?800|RTL设计框图}} | ||
- | ====实验步骤==== | + | #### 实验步骤 |
- 双击打开Quartus Prime工具软件; | - 双击打开Quartus Prime工具软件; | ||
- 新建工程:File → New Project Wizard(工程命名,工程目录选择,设备型号选择,EDA工具选择); | - 新建工程:File → New Project Wizard(工程命名,工程目录选择,设备型号选择,EDA工具选择); | ||
行 219: | 行 260: | ||
- | ====实验现象==== | + | ### 实验现象 |
+ | |||
+ | 将程序加载到FPGA开发平台,底板数码管左边4位为红队比分,右边4位为蓝队比分,初始都为0分,核心板K3按键为红队加分按键,核心板K4按键为蓝队加分按键,按动K3、K4按键,观察红队和蓝队比分变化。 | ||
+ | |||
+ | ### 相关资料 | ||
+ | |||
+ | {{:sn74hc595.pdf|SN74HC595芯片资料}} |