差别

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

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
7段数码管 [2016/06/01 11:07]
anran [代码设计]
7段数码管 [2020/09/10 22:21] (当前版本)
gongyu
行 1: 行 1:
-=====基于小脚丫FPGA开发板和74HC595数码管动态显示=====+[[7-seg_disp_verilog]]
  
-====设计要求==== +## 7段数码管显示
-基于小脚丫FPGA开发板和74HC595驱动数码管显示,要求: +
-  - 采用FPGA+74HC595+数码管的硬件配置实现数字显示; +
-  - 实现0到9循环左移显示。+
  
-====硬件连接====+### 硬件平台
  
-我们知道数码管实际是由8个LED灯组成的,控制每个LED的点亮或熄灭实现数字显示。数码管分为共阳极数码管和共阴极数码管,结构如下图所示:+------ 
 +  - [[STEP-MXO2第一代]] 
 +  - [[STEP-Baseboard]]
  
-{{  :​数码管.jpg |共阳极、共阴极数码管}} +### 设计要求
-<WRAP centeralign>​ **图1 共阳极、共阴极数码管** </​WRAP>​+
  
-数码管有两种显示方式: +------ 
-  - 一种是独立显示模式,由上图可知,控制数码管显示我们需要8根数据信号线和1根选通信号线,这样如果我们需要4位数码管就需要4*9 = 36根信号线才能分别显示。独立显示模式实现简单,但是需要大量的信号线 +  - 了解数码管显示的工作原理 
-  - 另一种是扫描显示模式,即所有数码管共用8根数据信号线,各自再有1根选通信号线,采用分时的方式循环选通各位数码管,这样就需要8+4 = 12根信号线进行显示。扫描显示模式实现复杂,同时节约信号线的使用+  - 掌握Verilog语言设计数码管显示驱动 
 +  - 掌握Verilog语言设计串行转并行逻辑 
 +  - 掌握数码管动态显示,按秒实现0到9循环左移显示
  
-我们设计中采用的扫描显示模式,使用的数码管结构如下:+### 工作原理
  
-{{ :​数码管结构.png |数码管结构}} +------
-<WRAP centeralign>​**图2 数码管结构** </​WRAP>​+
  
-数码管结构可以看出,本设计采用扫描显示模式,加上数码管中间的冒号显示,我们需要14根信号线控制,同样需要占用大量的IO接口,本设计又增加了芯片74HC595进行驱动,74HC595是一个串行总线转并行总线的芯片,实现3根串行总线控制8根并行总线输出,同时芯片74HC595可以串接使用,我们将两个74HC595串接使用,就实现了3根串行总线控制16根并行总线输出,满足设计中驱动数码管的设计需求,具体硬件连接如下所述:+### 八段数码管显示原理
  
-FPGA系统时钟来自于脚丫FPGA开发板配置25MHz时钟晶振连接FPGAC1引脚+------ 
 +数码管是工程设计中使用很广一种显示输出器件。一个8段数码管分别由a、b、c、d、e、f、g位段和表示数点的dp位段组成。实际是由8个LED灯组成的,控制每个LED点亮或熄灭实现数字显示通常数码管分为共阳极数码管和共阴极数码管,结构如下图所示:
  
-数码管模块电路原理图连接和八段共阴极数码管的结构分别如所示:+{{ :数码管.jpg |共阳极、共阴极数码管}} 
 +<WRAP centeralign>​ **1 共阳极、共阴极数码管** </​WRAP>​
  
-{{ :74hc595路连.png |图3 74HC595路连}} +共阴8段数码管的信号端低平有效,而共阳端平有效。当共阳端平时只要在各个位段上加上相应的低电平信号就可以使相应的位段发光。比如:要使a段发光,则在a段信号端加上低电平即可。共阴极的数码管则相反。
-<WRAP centeralign>​ **图3 74HC595路连接** </​WRAP>​+
  
-{{ :数码管电路连接.png?​500 |图4数码管电路连接}} +数码管有两种显示方式: 
-<WRAP centeralign>​ **4 数码管电路连接** </​WRAP>​+  - 一种是独立显示模式,由上可知,控制数码管显示我们需要8根数据信号线和1根控制端选通信号线,这样如果我们需要4数码管就需要4*9 = 36根信号线才能分别显示。独立显示模式实现简单,但是需要大量的信号线。 
 +  - 另一种是扫描显示模式,即所有数码管共用8根数据信号线,各自再有1根选通信号线,采用分时的方式循环选通各位数码管,这样就需要8+= 12根信号线进行显示。利用人眼的“视觉暂留效应”,可以使数码管显示看起来是同时显示。扫描显示模式实现复杂,但是节约信号线的使用。
  
 +在[[STEP-Baseboard]]上的4位数码管结构如下:
  
-数码管模块、小脚丫与FPGA的引脚连接关系如下: +{{ :数码管结构.png ​|数码结构}} 
-  +<WRAP centeralign>​**图2 数码结构** </​WRAP>​
-^ 74HC595管脚  ​|11(SCK) | 12(RCK) ​ |14(SER) ​  | +
-^ 小脚丫脚  |32     | 31   ​|30 ​  | +
-^ FPGA脚  |N2    |M1  |K1   |+
  
-====工作原理==== 
-从上面数码管结构图看出,本设计采用共阴极数码管,根据上述的硬件连接关系,显示采用74HC595驱动的扫描模式。 
  
-===八段数码管显示原理=== 
  
 因数码管上的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驱动原理
  
-芯片74HC595是较为常用的串行转并行的芯片,3根引脚输入8根引脚并行输出,这样可以有效的节约我们的管脚资源+------ 
 +从前面我们知道驱动一个4位数码管至少需要12根线,对于小脚丫FPGA的引脚资源来说还是很紧张的。因此在[[STEP-Baseboard]]实验平台上采用了74HC595来驱动数码管显示,这样可以有效的节约我们的管脚资源。 
 +74HC595是较为常用的串行转并行的芯片,包括一个8位移位寄存器和一个存储器,三态缓冲输出。在最简单的情况下我们只需要控制3根引脚输入得到8根引脚并行输出信号
  
 {{ :​74hc595引脚功能.jpg |74hc595引脚功能}} {{ :​74hc595引脚功能.jpg |74hc595引脚功能}}
行 63: 行 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左右
  
-====代码设计====+### 硬件连接 
 + 
 +------ 
 +根据上面[[STEP-Baseboard]]采用的4为数码馆结构图可以看到,加上数码管中间的冒号显示,我们需要14根信号线控制。通过两片74HC595级联驱动实现了3根串行总线控制16根并行总线输出,有效减少了引脚需求。具体硬件连接如下所述: 
 + 
 +FPGA的系统时钟来自于小脚丫FPGA开发板配置的25MHz时钟晶振,连接FPGA的C1引脚。 
 + 
 +数码管模块电路原理图连接和八段共阴极数码管的结构分别如图所示: 
 + 
 +{{ :​74hc595电路连接.png |图3 74HC595电路连接}} 
 +<WRAP centeralign>​ **图3 74HC595电路连接** </​WRAP>​ 
 + 
 +{{ :​数码管电路连接.png?​500 |图4. 数码管电路连接}} 
 +<WRAP centeralign>​ **图4 数码管电路连接** </​WRAP>​ 
 + 
 + 
 +数码管模块、小脚丫与FPGA的引脚连接关系如下: 
 +  
 +^ 74HC595管脚 ​ |11(SCK) | 12(RCK) ​ |14(SER) ​  | 
 +^ 小脚丫管脚 ​ |32     | 31   ​|30 ​  | 
 +^ FPGA管脚 ​ |N2    |M1  |K1   | 
 + 
 + 
 +### 代码设计 
 + 
 +---- 
 + 
 +{{ :​数码管显示程序设计.jpg |数码管显示程序设计}}
  
 数码管是针对数字的显示器件,显示内容相对固定,我们首先把需要显示的内容定义为存储器,这样当我们需要显示时,只需要有存储器的地址就可以调用数据。 数码管是针对数字的显示器件,显示内容相对固定,我们首先把需要显示的内容定义为存储器,这样当我们需要显示时,只需要有存储器的地址就可以调用数据。
行 85: 行 111:
 {{:​333.png|}} {{:​333.png|}}
  
-使用状态机我们将赋值和并行转串行分别完成 +使用状态机我们将赋值和并行转串行分别完成,​分为两个状态: 
-  ​* 普通列表项目赋值状态的程序设计如下+  ​- IDLE状态:分时控制四位数码管各位需要显示内容 
 +  - WRITE状态实现74HC595的控制时序,将数码管需要显示的内容发送出去
  
-{{:444.jpg|}}+{{ :数码管显示程序框图.jpg |数码管显示程序框图}}
  
 +  * IDLE状态:分时显示的程序设计如下:
  
 +{{:​444.jpg|IDLE状态}}
  
-  * 普通列表项目并行输出串行输出状态的程序设计如下:+  * WRITE状态:实现74HC595的控制时序,串行输出的程序设计如下:
  
-{{:​555.png|}}+{{:555.png|WRITE状态}}
  
-数码管显示数来源由两部分程序完成+如上所述就实现了数码管的分时显示,四位码管可以同时显示不同数字。
  
-分频产生1Hz的时钟,然后基于1Hz时钟循环产生1~9数据并使用寄存器逐级赋值锁存,方法如下:+设计要求还需要按秒实现0到9循环左移显示,所以我们需要成一个1Hz的信号clk_div_1Hz,然后由clk_div_1Hz触发完成显示内容切换。
  
-{{:​666.png|}}+分频产生1Hz的时钟与上面产生6.4KHz信号的程序原理相同,这里不做赘述,然后基于1Hz时钟循环产生1~9的数据并使用寄存器逐级赋值锁存,方法如下: 
 + 
 +{{:666.png|显示内容生成}}
  
 引脚分配如下: 引脚分配如下:
行 106: 行 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        |
-====系统运行==== 
  
-{{:系统运行.jpg?​800|图4、系统运行}}+### 系统运行
  
-====资源报告====+{{:​系统运行1.jpg?​300 |系统运行1}} 
 + 
 +{{:​系统运行2.jpg?​300 |系统运行2}} 
 + 
 +{{:​系统运行3.jpg?​300|系统运行3}} 
 + 
 +### 资源报告
  
 ^ 资源 | 数量 ​ | 比例 ​ | 说明 ​ | ^ 资源 | 数量 ​ | 比例 ​ | 说明 ​ |
-^ LUTs | 204   | 16%   ​| ​  |  +^ LUTs | 134   | 10%   ​| ​  |  
-^ 寄存器 | 119   7% |   |+^ 寄存器 | 88    ​6% |   |
 ^ 存储器 | 0  | 0%   ​| ​   | ^ 存储器 | 0  | 0%   ​| ​   |
 ^ IO管脚 ​  | 5 |   ​| ​   | ^ IO管脚 ​  | 5 |   ​| ​   |
 ^ 时钟频率 | 25MHz |   ​| ​   | ^ 时钟频率 | 25MHz |   ​| ​   |
  
-====知识点====+### 知识点
  
   * 时钟分频   * 时钟分频
行 125: 行 161:
   * 数码管动态显示   * 数码管动态显示
  
-====参考文档====+ 
 +### 参考文档
   * {{:​machxo2familydatasheet.pdf|Lattice MachXO2数据手册}}   * {{:​machxo2familydatasheet.pdf|Lattice MachXO2数据手册}}
   * {{:​sn74hc595.pdf|74HC595数据手册}}   * {{:​sn74hc595.pdf|74HC595数据手册}}
  
-====相关文档====+### 相关文档
  
 ^ **文件名称** ​ | **功能** | ^ **文件名称** ​ | **功能** |
-^ **[[DLED_DISP]]** | **数码管显示** | +^ **[[DLED_DISP]].v** | **数码管显示** |
- +
- +
- +