差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
7段数码管 [2016/06/01 15:40] zhijun |
7段数码管 [2020/09/10 22:21] (当前版本) gongyu |
||
---|---|---|---|
行 1: | 行 1: | ||
- | =====7段数码管显示===== | + | [[7-seg_disp_verilog]] |
+ | |||
+ | ## 7段数码管显示 | ||
+ | |||
+ | ### 硬件平台 | ||
- | ====硬件平台==== | ||
------ | ------ | ||
- [[STEP-MXO2第一代]] | - [[STEP-MXO2第一代]] | ||
- [[STEP-Baseboard]] | - [[STEP-Baseboard]] | ||
- | ====设计要求==== | + | ### 设计要求 |
------ | ------ | ||
- 了解数码管显示的工作原理 | - 了解数码管显示的工作原理 | ||
行 13: | 行 17: | ||
- 掌握数码管动态显示,按秒实现0到9循环左移显示 | - 掌握数码管动态显示,按秒实现0到9循环左移显示 | ||
- | ====工作原理==== | + | ### 工作原理 |
------ | ------ | ||
- | ===八段数码管显示原理=== | + | ### 八段数码管显示原理 |
------ | ------ | ||
数码管是工程设计中使用很广的一种显示输出器件。一个8段数码管分别由a、b、c、d、e、f、g位段和表示小数点的dp位段组成。实际是由8个LED灯组成的,控制每个LED的点亮或熄灭实现数字显示。通常数码管分为共阳极数码管和共阴极数码管,结构如下图所示: | 数码管是工程设计中使用很广的一种显示输出器件。一个8段数码管分别由a、b、c、d、e、f、g位段和表示小数点的dp位段组成。实际是由8个LED灯组成的,控制每个LED的点亮或熄灭实现数字显示。通常数码管分为共阳极数码管和共阴极数码管,结构如下图所示: | ||
行 23: | 行 29: | ||
<WRAP centeralign> **图1 共阳极、共阴极数码管** </WRAP> | <WRAP centeralign> **图1 共阳极、共阴极数码管** </WRAP> | ||
- | 共阳8段数码管的信号端低电平有效,而共阳端接高电平有效。当共阳端接高电平时只要在各个位段上加上相应的低电平信号就可以使相应的位段发光。比如:要使a段发光,则在a段信号端加上低电平即可。共阴极的数码管则相反。 | + | 共阴8段数码管的信号端低电平有效,而共阳端接高电平有效。当共阳端接高电平时只要在各个位段上加上相应的低电平信号就可以使相应的位段发光。比如:要使a段发光,则在a段信号端加上低电平即可。共阴极的数码管则相反。 |
数码管有两种显示方式: | 数码管有两种显示方式: | ||
行 38: | 行 44: | ||
因数码管上的4位需要显示不同的数字,故我们需要扫描的方式, 扫描模式采用分时的方式循环选通各个数码管,依次显示第1、第2、第3、第4位,利用人眼睛的视觉暂留效应,扫描的频率越高,数码管显示循环周期越小,当扫描频率足够高(例如当扫描频率等于100Hz)时,则在人眼看到的数码管显示就是连续的。 | 因数码管上的4位需要显示不同的数字,故我们需要扫描的方式, 扫描模式采用分时的方式循环选通各个数码管,依次显示第1、第2、第3、第4位,利用人眼睛的视觉暂留效应,扫描的频率越高,数码管显示循环周期越小,当扫描频率足够高(例如当扫描频率等于100Hz)时,则在人眼看到的数码管显示就是连续的。 | ||
- | 当扫描频率 = 100Hz,则4位数码管单次扫描周期为10ms,因为4位数码管分时显示,则每位数码管闪烁时间应为2.5ms | + | 当扫描频率 = 100Hz,则4位数码管单次扫描周期为10ms,因为4位数码管分时显示,则每位数码管闪烁时间应为2.5ms。 |
+ | |||
+ | |||
+ | ### 74HC595驱动原理 | ||
- | ===74HC595驱动原理=== | ||
------ | ------ | ||
从前面我们知道驱动一个4位数码管至少需要12根线,对于小脚丫FPGA的引脚资源来说还是很紧张的。因此在[[STEP-Baseboard]]实验平台上采用了74HC595来驱动数码管显示,这样可以有效的节约我们的管脚资源。 | 从前面我们知道驱动一个4位数码管至少需要12根线,对于小脚丫FPGA的引脚资源来说还是很紧张的。因此在[[STEP-Baseboard]]实验平台上采用了74HC595来驱动数码管显示,这样可以有效的节约我们的管脚资源。 | ||
行 54: | 行 62: | ||
<WRAP centeralign> **图7 74hc595时序图** </WRAP> | <WRAP centeralign> **图7 74hc595时序图** </WRAP> | ||
- | 由上图可知,单个74HC595芯片8根并行输出信号更新一次需要8个SH_CP信号周期的时间长度,我们设计采用两片74HC595串联的方式,故,需要16个SH_CP信号周期才能完成一位数码管的显示; | + | 一个4位数码管至少需要12根信号线控制显示,因此[[STEP-Baseboard]]上采用了两片74HC595级联来实现控制。单个74HC595芯片8根并行输出信号更新一次需要8个SH_CP信号周期的时间长度,所以需要16个SH_CP信号周期才能完成一位数码管的显示; |
- | 每位数码管闪烁时间应为2.5ms,对应16个SH_CP信号周期,则SH_CP信号周期应该为2.5ms/16 ≈ 156us,SH_CP信号的频率应该为1000000us/156us ≈ 6.4KHz,所以后面我们在程序设计的时候我们可以将SH_CP的控制信号(sclk_out)设置为6.4KHz所有。 | + | 假如我们把每位数码管延时时间设为2.5ms(正好满足人眼暂留效应,看起来像是4位同时显示),对应16个SH_CP信号周期,则SH_CP信号周期应该为2.5ms/16 ≈ 156us,SH_CP信号的频率应该为1000000us/156us ≈ 6.4KHz,这样在程序设计的时候我们可以将SH_CP的控制信号(sclk_out)设置为6.4KHz左右。 |
- | ====硬件连接==== | + | ### 硬件连接 |
- | 我们知道数码管实际是由8个LED灯组成的,控制每个LED的点亮或熄灭实现数字显示。数码管分为共阳极数码管和共阴极数码管,结构如下图所示: | + | ------ |
- | + | 根据上面[[STEP-Baseboard]]采用的4为数码馆结构图可以看到,加上数码管中间的冒号显示,我们需要14根信号线控制。通过两片74HC595级联驱动实现了3根串行总线控制16根并行总线输出,有效减少了引脚需求。具体硬件连接如下所述: | |
- | {{ :数码管.jpg |共阳极、共阴极数码管}} | + | |
- | <WRAP centeralign> **图1 共阳极、共阴极数码管** </WRAP> | + | |
- | + | ||
- | 数码管有两种显示方式: | + | |
- | - 一种是独立显示模式,由上图可知,控制数码管显示我们需要8根数据信号线和1根选通信号线,这样如果我们需要4位数码管就需要4*9 = 36根信号线才能分别显示。独立显示模式实现简单,但是需要大量的信号线 | + | |
- | - 另一种是扫描显示模式,即所有数码管共用8根数据信号线,各自再有1根选通信号线,采用分时的方式循环选通各位数码管,这样就需要8+4 = 12根信号线进行显示。扫描显示模式实现复杂,同时节约信号线的使用 | + | |
- | + | ||
- | 我们设计中采用的扫描显示模式,使用的数码管结构如下: | + | |
- | + | ||
- | {{ :数码管结构.png |数码管结构}} | + | |
- | <WRAP centeralign>**图2 数码管结构** </WRAP> | + | |
- | + | ||
- | 由数码管结构可以看出,本设计采用扫描显示模式,加上数码管中间的冒号显示,我们需要14根信号线控制,同样需要占用大量的IO接口,本设计又增加了芯片74HC595进行驱动,74HC595是一个串行总线转并行总线的芯片,实现3根串行总线控制8根并行总线输出,同时芯片74HC595可以串接使用,我们将两个74HC595串接使用,就实现了3根串行总线控制16根并行总线输出,满足设计中驱动数码管的设计需求,具体硬件连接如下所述: | + | |
FPGA的系统时钟来自于小脚丫FPGA开发板配置的25MHz时钟晶振,连接FPGA的C1引脚。 | FPGA的系统时钟来自于小脚丫FPGA开发板配置的25MHz时钟晶振,连接FPGA的C1引脚。 | ||
行 94: | 行 89: | ||
- | ====代码设计==== | + | ### 代码设计 |
+ | |||
+ | ---- | ||
+ | |||
+ | {{ :数码管显示程序设计.jpg |数码管显示程序设计}} | ||
数码管是针对数字的显示器件,显示内容相对固定,我们首先把需要显示的内容定义为存储器,这样当我们需要显示时,只需要有存储器的地址就可以调用数据。 | 数码管是针对数字的显示器件,显示内容相对固定,我们首先把需要显示的内容定义为存储器,这样当我们需要显示时,只需要有存储器的地址就可以调用数据。 | ||
行 138: | 行 137: | ||
^ 管脚名称 | clk_in | rst_n_in | rclk_out | sclk_out | sdio_out | | ^ 管脚名称 | clk_in | rst_n_in | rclk_out | sclk_out | sdio_out | | ||
^ FPGA管脚 | C1 | B1 | M1 | N2 | K1 | | ^ FPGA管脚 | C1 | B1 | M1 | N2 | K1 | | ||
- | ====系统运行==== | + | |
+ | ### 系统运行 | ||
{{:系统运行1.jpg?300 |系统运行1}} | {{:系统运行1.jpg?300 |系统运行1}} | ||
行 145: | 行 145: | ||
{{:系统运行3.jpg?300|系统运行3}} | {{:系统运行3.jpg?300|系统运行3}} | ||
- | ====资源报告==== | + | |
+ | ### 资源报告 | ||
^ 资源 | 数量 | 比例 | 说明 | | ^ 资源 | 数量 | 比例 | 说明 | | ||
行 154: | 行 155: | ||
^ 时钟频率 | 25MHz | | | | ^ 时钟频率 | 25MHz | | | | ||
- | ====知识点==== | + | ### 知识点 |
* 时钟分频 | * 时钟分频 | ||
行 160: | 行 161: | ||
* 数码管动态显示 | * 数码管动态显示 | ||
- | ====参考文档==== | + | |
+ | ### 参考文档 | ||
* {{:machxo2familydatasheet.pdf|Lattice MachXO2数据手册}} | * {{:machxo2familydatasheet.pdf|Lattice MachXO2数据手册}} | ||
* {{:sn74hc595.pdf|74HC595数据手册}} | * {{:sn74hc595.pdf|74HC595数据手册}} | ||
- | ====相关文档==== | + | ### 相关文档 |
^ **文件名称** | **功能** | | ^ **文件名称** | **功能** | | ||
- | ^ **[[DLED_DISP]]** | **数码管显示** | | + | ^ **[[DLED_DISP]].v** | **数码管显示** | |
- | + | ||
- | + | ||
- | + |