差别

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

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
译码器 [2016/06/02 14:53]
anran [设计要求]
译码器 [2016/06/06 11:07] (当前版本)
anran [相关文档]
行 1: 行 1:
-=====7段数管显示=====+=====38译=====
  
 ====硬件平台==== ====硬件平台====
行 9: 行 9:
 ------ ------
   - 掌握38译码器的基本原理   - 掌握38译码器的基本原理
 +  - 掌握组合逻辑的设计
   - 掌握case的基本语法   - 掌握case的基本语法
   - 使用拨码开关实现译码器输入功能   - 使用拨码开关实现译码器输入功能
行 16: 行 17:
 ------ ------
  
-===八段数管显示原理===+===38译原理===
 ------ ------
-数码管是工程设计中使用很广的一种显示输出器件。一个8段数码管分别由a、b、c、d、e、f、g位段和表示小数点的dp位段组成。实际是由8个LED灯组成的,控制每个LED的点亮或熄灭实现数字显示。通常数码管分为共阳极数码管和共阴极数码管,结构如下图所示: 
  
-{{ :数管.jpg |共阳极、共阴极数管}} +器的逻辑功能是将每个输入的二进制代译成对应的输出高低电平信号或另外一个代
-<WRAP centeralign>​ **图1 共阳极共阴极数管** </​WRAP>​+
  
-共阳8段数管的信号端低电平有效而共阳端接高电平有效。当共阳端接高电平时只要在各个位段上加上相应的低电平信号就可以使相应位段发光。比如:要使a段发光,则在a段信号端加上低电平即可。共阴极的数管则相反+38译器由三路信号输入八路信号输出器(2^3 = 8)
  
-数码管有两种显示方式: +芯片74HC138为例:
-  - 一种是独立显示模式,由上图可知,控制数码管显示我们需要8根数据信号线和1根控制端选通信号线,这样如果我们需要4位数码管就需要4*9 = 36根信号线才能分别显示。独立显示模式实现简单,但是需要大量的信号线。 +
-  - 另一种是扫描显示模式,即所有数码管共用8根数据信号线,各自再有1根选通信号线,采用分时的方式循环选通各位数码管,这样就需要8+4 = 12根信号线进行显示。利用人眼的“视觉暂留效应”,可使数码管显示看起来是同时显示。扫描显示模式实现复杂,但是节约信号线的使用。+
  
-在[[STEP-Baseboard]]上的4位数码管结构如下:+{{ :​74hc138原理图.jpg |74hc138原理图}}
  
-{{ :数码管结构.png |数码管结构}} +{{ :74hc138真值表.jpg |74hc138真值表}}
-<WRAP centeralign>​**图2 数码管结构** </​WRAP>​+
  
 +由上图芯片使能由E1,E2,E3共同控制
  
 +三路信号输入:A0,A1,A2
  
-因数码管上的4位需要显示不同的数字故我们需要扫描的方式, 扫描模式采用分时的方式循环选通各个数码管依次显示第1、第2、第3、第4位利用人眼睛的视觉暂留效应扫描的频率越高数码管显示循环周期越小当扫描频率足够高(例如当扫描频率等于100Hz)时,则在人眼看到的数码管显示就是连续的。+八路信号输出:Y0Y1Y2Y3Y4Y5Y6Y7
  
-当扫描频率 = 100Hz,则4位数码管单次扫描周期为10ms,因为4位数码管分时显示,则每位数码管闪烁时间应为2.5ms。 
  
- 
-===74HC595驱动原理=== 
------- 
-从前面我们知道驱动一个4位数码管至少需要12根线,对于小脚丫FPGA的引脚资源来说还是很紧张的。因此在[[STEP-Baseboard]]实验平台上采用了74HC595来驱动数码管显示,这样可以有效的节约我们的管脚资源。 
-74HC595是较为常用的串行转并行的芯片,包括一个8位移位寄存器和一个存储器,三态缓冲输出。在最简单的情况下我们只需要控制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>​ 
- 
-一个4位数码管至少需要12根信号线控制显示,因此[[STEP-Baseboard]]上采用了两片74HC595级联来实现控制。单个74HC595芯片8根并行输出信号更新一次需要8个SH_CP信号周期的时间长度,所以需要16个SH_CP信号周期才能完成一位数码管的显示; 
- 
-假如我们把每位数码管延时时间设为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根并行总线输出,有效减少了引需求。具体硬件连接如下所述:+结合74HC138的结构原理及实验平台[[STEP-Baseboard]]的硬件配置,我们使用: 
 +  - 一个拨开关(S5)替代E1、E2和E3的逻辑运算作为芯片使能脚 
 +  - 三个拨码开关(S1、S2、S3)作为38译码器三路信输入管脚 
 +  - 八个LED灯作为38译码器的八路信号输出
  
-FPGA的系统时钟来自于小脚丫FPGA开发板配置的25MHz时钟晶振,连接FPGA的C1引脚。 +{{:​图11.拨码模块电路连接.png ​  ​|拨码模块电路连接}} 
- +{{:图10.LED模块电路连接.png|LED模块电路连接}}
-模块电路原理图连接和八段共阴极数码管的结构分别如图所示: +
- +
-{{ :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 |管显示程序设计}}+{{ :38译程序设计框图.jpg |38译程序设计框图}}
  
-管是针对数字显示器件,显示内容相对固定,我们首先把需要显示的内容定义为存储器,样当我们需要显示时,只需要有存储器地址就可以调用数据+通过38译原理及程序设计框图,我们不难发现是一个比较简单组合逻辑设计
  
-{{:​111.png|数码管字库}}+正如我们在原理及硬件连接中描述的,我们需要一路芯片使能端口、三路信号输入端口和八路信号输出端口。模块端口设计如下:
  
-我们的数码管是由芯片74HC595驱动的,根据上面计算,SH_CP的频率为6.4KHz,所以我们首先分频产生一个6.4KHz左右的信号clk_div,然后再基于这个信号产生74HC595的控制时序。+<code verilog>​ 
 +module Decode38  
 +
 +input Enable, 
 +input [2:0] A_in, 
 +output reg [7:0] Y_out 
 +); 
 +</​code>​
  
-小脚丫开发板晶振为25MHz我们需要对钟分频得到6.4KHz左右的信号,这样分频系数为25MHz/​6.4KHz ≈ 3900+逻辑部分当芯片使能信号无效,输出全部置高,当芯片使能信号有效时根据三路信号的输入状态译码控制八路信号输出
  
-parameter CLK_DIV_PERIOD=3900+<code verilog>​ 
 +always@(A_in or Enable) begin 
 +    if (Enable) 
 + case (A_in) 
 + 3'​b000:​ Y_out 8'​b11111110; 
 + 3'​b001:​ Y_out = 8'​b11111101;​ 
 + 3'​b010:​ Y_out = 8'​b11111011;​ 
 + 3'​b011:​ Y_out = 8'​b11110111;​ 
 + 3'​b100:​ Y_out = 8'​b11101111;​ 
 + 3'​b101:​ Y_out = 8'​b11011111;​ 
 + 3'​b110:​ Y_out = 8'​b10111111;​ 
 + 3'​b111:​ Y_out = 8'​b01111111;​ 
 + default:​Y_out = 8'​b11111111;​ 
 + endcase 
 +    else Y_out = 8'​b11111111;​ 
 +end 
 +</​code>​
  
-{{:​222.png|产生clk_div=6.4KHz}}+===测试文件===
  
-然后我们使用状态机将clk_div的高电平、低电平、上升沿和下降沿产脉冲方便我们后面结合上升沿和下降沿的状态完成74HC595的控制+测试文件中,我们成被测文件输入信号需要的激励,我们设计Enable信号每隔200ns(200个间单位)进行翻转,三路信号输入为每20ns取随机值($random)
  
-{{:​333.png|}} +<code verilog> 
- +reg Enable; 
-使用状态机我们将赋值和并行转串行分别完成,​分为两个状态: +reg [2:0] A_in; 
-  - IDLE状态:分时控制四位数码管各位需要显示的内容 +initial 
-  - WRITE状态:实现74HC595的控制时序,将数码管需要显示的内容发送出去 + begin 
- + Enable = 1'b0; 
-{{ :数码管显示程序框图.jpg |数码管显示程序框图}} + A_in = 3'​b000;​ 
- + end 
-  * IDLE状态:分时显示的程序设计如下: +  
- +always Enable = #200 ~Enable; 
-{{:​444.jpg|IDLE状态}} +always A_in = #20 $random; 
- +</​code>​
-  * 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 ​ | +^ 管脚名称 | EnableA_in[0]| A_in[1] ​ ​| ​A_in[2] ​ ​| ​Y_out[0] ​ |Y_out[1] ​ |Y_out[2] ​ |Y_out[3] ​ |Y_out[4] ​ |Y_out[5] ​ |Y_out[6] ​ |Y_out[7] ​ | 
-^ FPGA管脚 | C1     B1        ​M1        ​N2        ​K1        ​|  +^ FPGA管脚 | P12M13M14  ​N13  ​|B14  |C14  |E14  |F14  |G14  |J14  |K14  |L14  ​
-====系统运行====+====仿真结果====
  
-{{:系统运行1.jpg?300 |系统运行1}} +{{:38译码器仿真.jpg|38译码器仿真}}
- +
-{{:​系统运行2.jpg?​300 |系统运行2}} +
- +
-{{:​系统运行3.jpg?​300|系统运行3}}+
 ====资源报告==== ====资源报告====
  
 ^ 资源 | 数量 ​ | 比例 ​ | 说明 ​ | ^ 资源 | 数量 ​ | 比例 ​ | 说明 ​ |
-^ LUTs | 134   | 10%   ​| ​  |  +^ LUTs |   | 1%   ​| ​  |  
-^ 寄存器 | 88    ​| ​6% |   |+^ 寄存器 |    ​| ​0% |   |
 ^ 存储器 | 0  | 0%   ​| ​   | ^ 存储器 | 0  | 0%   ​| ​   |
-^ IO管脚 ​  ​| ​|   ​| ​   |+^ IO管脚 ​  ​| ​12 |   ​| ​   |
 ^ 时钟频率 | 25MHz |   ​| ​   | ^ 时钟频率 | 25MHz |   ​| ​   |
  
 ====知识点==== ====知识点====
  
-  * 时钟分频 +  * 组合逻辑 
-  * 串行/​并行转换 +
-  * 数码管动态显示+
  
 ====参考文档==== ====参考文档====
   * {{:​machxo2familydatasheet.pdf|Lattice MachXO2数据手册}}   * {{:​machxo2familydatasheet.pdf|Lattice MachXO2数据手册}}
-  * {{:​sn74hc595.pdf|74HC595数据手册}} 
  
 ====相关文档==== ====相关文档====
  
 ^ **文件名称** ​ | **功能** | ^ **文件名称** ​ | **功能** |
-^ **[[DLED_DISP]]** | **管显示** | +^ **[[Decode38.v]]** | **38译** | 
 +^ **[[Decode38_test.v]]** | **测试文件** |