差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
上一修订版 两侧同时换到之后的修订记录
比赛计分系统设计 [2018/10/22 14:54]
anran [实验原理]
比赛计分系统设计 [2018/10/22 15:10]
anran [实验现象]
行 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)时钟周期计算:
行 206: 行 206:
 ===系统总体实现=== ===系统总体实现===
  
 +按键消抖模块我们前面基础数字电路实验中详细介绍过,这里我们直接调用消抖模块,记分器逻辑部分其实就是对按键按动次数计数,输出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设计框图}}
  
 ====实验步骤==== ====实验步骤====
行 220: 行 261:
  
 ====实验现象==== ====实验现象====
 +
 +将程序加载到FPGA开发平台,底板数码管左边4位为红队比分,右边4位为蓝队比分,初始都为0分,核心板K3按键为红队加分按键,核心板K4按键为蓝队加分按键,按动K3、K4按键,观察红队和蓝队比分变化。
 +
 +====相关资料====
 +
 +{{:​sn74hc595.pdf|SN74HC595芯片资料}}