显示页面 讨论 修订记录 反向链接 本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。 =====7段数码管显示===== ====硬件平台==== ------ - [[STEP-MXO2第一代]] - [[STEP-Baseboard]] ====设计要求==== ------ - 了解数码管显示的工作原理 - 掌握Verilog语言设计数码管显示驱动 - 掌握Verilog语言设计串行转并行逻辑 - 掌握数码管动态显示,按秒实现0到9循环左移显示 ====硬件连接==== 我们知道数码管实际是由8个LED灯组成的,控制每个LED的点亮或熄灭实现数字显示。数码管分为共阳极数码管和共阴极数码管,结构如下图所示: {{ :数码管.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引脚。 数码管模块电路原理图连接和八段共阴极数码管的结构分别如图所示: {{ :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 | ====工作原理==== 从上面数码管结构图看出,本设计采用共阴极数码管,根据上述的硬件连接关系,显示采用74HC595驱动的扫描模式。 ===八段数码管显示原理=== 因数码管上的4位需要显示不同的数字,故我们需要扫描的方式, 扫描模式采用分时的方式循环选通各个数码管,依次显示第1、第2、第3、第4位,利用人眼睛的视觉暂留效应,扫描的频率越高,数码管显示循环周期越小,当扫描频率足够高(例如当扫描频率等于100Hz)时,则在人眼看到的数码管显示就是连续的。 当扫描频率 = 100Hz,则4位数码管单次扫描周期为10ms,因为4位数码管分时显示,则每位数码管闪烁时间应为2.5ms ===74HC595驱动原理=== 芯片74HC595是较为常用的串行转并行的芯片,3根引脚输入,8根引脚并行输出,这样可以有效的节约我们的管脚资源。 {{ :74hc595引脚功能.jpg |74hc595引脚功能}} <WRAP centeralign> **图5 74hc595引脚功能** </WRAP> {{ :74hc595逻辑图.jpg |74hc595逻辑图}} <WRAP centeralign> **图6 74hc595逻辑图** </WRAP> {{ :74hc595时序图.jpg |74hc595时序图}} <WRAP centeralign> **图7 74hc595时序图** </WRAP> 由上图可知,单个74HC595芯片8根并行输出信号更新一次需要8个SH_CP信号周期的时间长度,我们设计采用两片74HC595串联的方式,故,需要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所有。 ====代码设计==== 数码管是针对数字的显示器件,显示内容相对固定,我们首先把需要显示的内容定义为存储器,这样当我们需要显示时,只需要有存储器的地址就可以调用数据。 {{:111.png|数码管字库}} 我们的数码管是由芯片74HC595驱动的,根据上面计算,SH_CP的频率为6.4KHz,所以我们首先分频产生一个6.4KHz左右的信号clk_div,然后再基于这个信号产生74HC595的控制时序。 小脚丫开发板晶振为25MHz,我们需要对时钟分频得到6.4KHz左右的信号,这样分频系数为25MHz/6.4KHz ≈ 3900。 parameter CLK_DIV_PERIOD=3900; {{:222.png|产生clk_div=6.4KHz}} 然后我们使用状态机将clk_div的高电平、低电平、上升沿和下降沿产生脉冲,方便我们后面结合上升沿和下降沿的状态完成74HC595的控制时序。 {{:333.png|}} 使用状态机我们将赋值和并行转串行分别完成,分为两个状态: - IDLE状态:分时控制四位数码管各位需要显示的内容 - WRITE状态:实现74HC595的控制时序,将数码管需要显示的内容发送出去 {{ :数码管显示程序框图.jpg |数码管显示程序框图}} * IDLE状态:分时显示的程序设计如下: {{:444.jpg|IDLE状态}} * WRITE状态:实现74HC595的控制时序,串行输出的程序设计如下: {{:555.png|WRITE状态}} 如上所述就实现了数码管的分时显示,四位数码管可以同时显示不同的数字。 设计要求还需要按秒实现0到9循环左移显示,所以我们需要生成一个1Hz的信号clk_div_1Hz,然后由clk_div_1Hz触发完成显示内容的切换。 分频产生1Hz的时钟与上面产生6.4KHz信号的程序原理相同,这里不做赘述,然后基于1Hz时钟循环产生1~9的数据并使用寄存器逐级赋值锁存,方法如下: {{:666.png|显示内容生成}} 引脚分配如下: ^ 管脚名称 | clk_in | rst_n_in | rclk_out | sclk_out | sdio_out | ^ FPGA管脚 | C1 | B1 | M1 | N2 | K1 | ====系统运行==== {{:系统运行1.jpg?300 |系统运行1}} {{:系统运行2.jpg?300 |系统运行2}} {{:系统运行3.jpg?300|系统运行3}} ====资源报告==== ^ 资源 | 数量 | 比例 | 说明 | ^ LUTs | 134 | 10% | | ^ 寄存器 | 88 | 6% | | ^ 存储器 | 0 | 0% | | ^ IO管脚 | 5 | | | ^ 时钟频率 | 25MHz | | | ====知识点==== * 时钟分频 * 串行/并行转换 * 数码管动态显示 ====参考文档==== * {{:machxo2familydatasheet.pdf|Lattice MachXO2数据手册}} * {{:sn74hc595.pdf|74HC595数据手册}} ====相关文档==== ^ **文件名称** | **功能** | ^ **[[DLED_DISP]]** | **数码管显示** |