差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
译码器 [2016/06/03 11:54] anran [工作原理] |
译码器 [2016/06/06 11:07] (当前版本) anran [相关文档] |
||
---|---|---|---|
行 23: | 行 23: | ||
38译码器由三路信号输入,八路信号输出的译码器(2^3 = 8)。 | 38译码器由三路信号输入,八路信号输出的译码器(2^3 = 8)。 | ||
+ | |||
+ | 以芯片74HC138为例: | ||
{{ :74hc138原理图.jpg |74hc138原理图}} | {{ :74hc138原理图.jpg |74hc138原理图}} | ||
行 29: | 行 31: | ||
由上图芯片使能由E1,E2,E3共同控制 | 由上图芯片使能由E1,E2,E3共同控制 | ||
+ | |||
三路信号输入:A0,A1,A2 | 三路信号输入:A0,A1,A2 | ||
+ | |||
八路信号输出:Y0,Y1,Y2,Y3,Y4,Y5,Y6,Y7 | 八路信号输出:Y0,Y1,Y2,Y3,Y4,Y5,Y6,Y7 | ||
行 36: | 行 40: | ||
====硬件连接==== | ====硬件连接==== | ||
------ | ------ | ||
- | 根据上面[[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 | | + | ^ 管脚名称 | Enable| A_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管脚 | P12| M13| M14 | 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 | 8 | 1% | | |
- | ^ 寄存器 | 88 | 6% | | | + | ^ 寄存器 | 0 | 0% | | |
^ 存储器 | 0 | 0% | | | ^ 存储器 | 0 | 0% | | | ||
- | ^ IO管脚 | 5 | | | | + | ^ IO管脚 | 12 | | | |
^ 时钟频率 | 25MHz | | | | ^ 时钟频率 | 25MHz | | | | ||
====知识点==== | ====知识点==== | ||
- | * 时钟分频 | + | * 组合逻辑 |
- | * 串行/并行转换 | + | |
- | * 数码管动态显示 | + | |
====参考文档==== | ====参考文档==== | ||
* {{:machxo2familydatasheet.pdf|Lattice MachXO2数据手册}} | * {{:machxo2familydatasheet.pdf|Lattice MachXO2数据手册}} | ||
- | * {{:sn74hc595.pdf|74HC595数据手册}} | ||
====相关文档==== | ====相关文档==== | ||
^ **文件名称** | **功能** | | ^ **文件名称** | **功能** | | ||
- | ^ **[[DLED_DISP]]** | **数码管显示** | | + | ^ **[[Decode38.v]]** | **38译码器** | |
+ | ^ **[[Decode38_test.v]]** | **测试文件** | | ||