差别
这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
实验3-1_译码器 [2017/03/02 10:11] zhijun 创建 |
实验3-1_译码器 [2017/03/02 10:34] (当前版本) zhijun |
||
---|---|---|---|
行 5: | 行 5: | ||
===== 1.实验目的 ===== | ===== 1.实验目的 ===== | ||
- | * 熟悉和掌握FPGA开发流程和Lattice Diamond软件使用方法 | + | (1)熟悉和掌握FPGA开发流程和Lattice Diamond软件使用方法; |
- | * 通过实验理解基本门电路 | + | (2)通过实验理解和掌握数码管驱动原理; |
- | * 掌握用Verilog HDL数据流基本门电路的方法 | + | (3)学习用Verilog HDL数据流描述方法驱动数码管进行循环显示。 |
===== 2.实验任务 ===== | ===== 2.实验任务 ===== | ||
- | 本实验的任务是描述一个3-8译码器电路。 | + | 本实验的任务是驱动两个7段数码管进行数字0~数字9的循环显示,并通过STEP FPGA开发板的12MHz晶振作为触发器时钟信号clk_in,轻触按键1为复位信号rst_n_in输入,将输出分别对应连接至数码管引脚上,在clk_in上升沿的驱动下,数码管显示发生相应变化。 |
===== 3.实验原理 ===== | ===== 3.实验原理 ===== | ||
- | 译码器电路有n个输入和2n 个输出。每个输出都对应着一个可能的二进制输入。通常,一次只能有一个输出有效。编码器就是译码器的反向器件,他有2n输入和n个输出。3-8译码器的真值表如下,试写出8个输出的逻辑方程: | + | 首先,根据数码管的原理可知,要控制数码管显示我们至少需要8根段选信号线和1根位选信号线,这样如果我们需要4位数码管至少需要4*8 = 32根信号线才能分别显示。独立显示模式实现方法简单,但是需要大量的信号线。 |
- | + | {{ ::shuamguanzhijielianjie.png?600 |}} | |
- | {{ ::38zhenzhibiao.png?800 |}} | + | |
===== 4.Verilog HDL建模描述 ===== | ===== 4.Verilog HDL建模描述 ===== | ||
- | ==== 程序清单gates.v ==== | + | 用独立显示模式实现的数码管循环显示: |
+ | ==== 程序清单gates.v ==== | ||
+ | (1)数码管显示模块:Segment_led.v | ||
<code verilog> | <code verilog> | ||
// -------------------------------------------------------------------- | // -------------------------------------------------------------------- | ||
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< | // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< | ||
// -------------------------------------------------------------------- | // -------------------------------------------------------------------- | ||
- | // File name : gates.v | + | // File name : Segment_led.v.v |
- | // Module name : gates | + | // Module name : Segment_led |
// Author : Step | // Author : Step | ||
- | // Description : Logic gates | + | // Description : Segment_led |
// Web : www.stepfpga.com | // Web : www.stepfpga.com | ||
// | // | ||
行 39: | 行 41: | ||
// V1.0 |2015/11/11 |Initial ver | // V1.0 |2015/11/11 |Initial ver | ||
// -------------------------------------------------------------------- | // -------------------------------------------------------------------- | ||
- | module decode38 | + | module segment_led |
( | ( | ||
//INPUT | //INPUT | ||
- | sw , | + | seg_data_1 , |
- | | + | seg_data_2 , |
//OUTPUT | //OUTPUT | ||
- | led | + | seg_led_1 , |
- | ); | + | seg_led_2 |
+ | ); | ||
+ | |||
+ | input [3:0] seg_data_1,seg_data_2; | ||
- | //******************* | + | output [8:0] seg_led_1,seg_led_2; |
- | //DEFINE INPUT | + | |
- | //******************* | + | //REGS |
- | //******************* | + | reg [6:0] seg [15:0]; |
- | input [2:0] sw ; | + | |
+ | //WIRE | ||
+ | wire dp1,dp2; | ||
+ | |||
+ | initial | ||
+ | begin | ||
+ | seg[0] = 7'h3f; // 0 | ||
+ | seg[1] = 7'h06; // 1 | ||
+ | seg[2] = 7'h5b; // 2 | ||
+ | seg[3] = 7'h4f; // 3 | ||
+ | seg[4] = 7'h66; // 4 | ||
+ | seg[5] = 7'h6d; // 5 | ||
+ | seg[6] = 7'h7d; // 6 | ||
+ | seg[7] = 7'h07; // 7 | ||
+ | seg[8] = 7'h7f; // 8 | ||
+ | seg[9] = 7'h6f; // 9 | ||
+ | seg[10]= 7'h08; // A | ||
+ | seg[11]= 7'h7c; // b | ||
+ | seg[12]= 7'h39; // C | ||
+ | seg[13]= 7'h5e; // d | ||
+ | seg[14]= 7'h79; // E | ||
+ | seg[15]= 7'h71; // F | ||
+ | end | ||
+ | |||
+ | assign dp1=1'b0; | ||
+ | assign dp2=1'b0; | ||
+ | assign seg_led_1 = {1'b0,dp1,seg[seg_data_1]}; | ||
+ | assign seg_led_2 = {1'b0,dp2,seg[seg_data_2]}; | ||
+ | |||
+ | endmodule | ||
- | //******************* | + | </code> |
- | //DEFINE OUTPUT | + | |
- | //******************* | + | |
- | output [7:0] led ; | + | |
- | //******************** | + | (2)顶层模块进行调用 |
- | //OUTPUT ATTRIBUTE | + | <code verilog> |
- | //******************** | + | module segment_top |
+ | ( | ||
+ | //INPUT | ||
+ | clk , | ||
+ | rst_n , | ||
+ | //OUTPUT | ||
+ | seg_led_1 , //MSB~LSB = SEG,DP,G,F,E,D,C,B,A | ||
+ | seg_led_2 | ||
+ | ); | ||
+ | |||
+ | parameter CNT_NUM = 12_000_000; | ||
+ | |||
+ | input clk,rst_n; | ||
- | //WIRES | + | output [8:0] seg_led_1,seg_led_2; |
- | reg [7:0] led1 ; | + | |
| | ||
- | //********************* | + | //REGS |
- | //MAIN CORE | + | reg [23:0] cnt; |
- | //********************* | + | reg [3:0] seg_data; |
- | //Plan A | ||
- | always @ (sw) | ||
- | begin | ||
- | case(sw) | ||
- | 3'b000: led1=8'b10000000; | ||
- | 3'b001: led1=8'b01000000; | ||
- | 3'b010: led1=8'b00100000; | ||
- | 3'b011: led1=8'b00010000; | ||
- | 3'b100: led1=8'b00001000; | ||
- | 3'b101: led1=8'b00000100; | ||
- | 3'b110: led1=8'b00000010; | ||
- | 3'b111: led1=8'b00000001; | ||
- | endcase | ||
- | end | + | always @(posedge clk) |
- | assign led=~led1; | + | if(!rst_n)begin |
- | /* | + | cnt <= 1'b0; |
- | //Plan B | + | end else if(cnt >= CNT_NUM - 1) |
- | assign led[0]=~(~a[2]&~a[1]&~a[0]); | + | cnt <= 1'b0; |
- | assign led[1]=~(~a[2]&~a[1]& a[0]); | + | else |
- | assign led[2]=~(~a[2]& a[1]&~a[0]); | + | cnt <= cnt + 1'b1; |
- | assign led[3]=~(~a[2]& a[1]& a[0]); | + | |
- | assign led[4]=~( a[2]&~a[1]&~a[0]); | + | always @(posedge clk) |
- | assign led[5]=~( a[2]&~a[1]& a[0]); | + | if(!rst_n) seg_data <= 4'b0000; |
- | assign led[6]=~( a[2]& a[1]&~a[0]); | + | else if(cnt == CNT_NUM - 1) |
- | assign led[7]=~( a[2]& a[1]& a[0]); | + | begin |
- | */ | + | if(seg_data >= 9) seg_data <= 4'b0000; |
- | endmodule | + | else seg_data <= seg_data + 1'b1; |
+ | end | ||
+ | else seg_data <= seg_data; | ||
+ | | ||
+ | segment_led u1( | ||
+ | .seg_data_1(seg_data), | ||
+ | .seg_data_2(seg_data), | ||
+ | .seg_led_1(seg_led_1), | ||
+ | .seg_led_2(seg_led_2) | ||
+ | ); | ||
+ | endmodule | ||
</code> | </code> | ||
+ | 仿真文件: | ||
+ | <code verilog> | ||
+ | `timescale 1ns/100ps | ||
+ | module segment_top_tb(); | ||
+ | reg clk,rst_n; | ||
+ | wire [8:0] seg_led_1,seg_led_2; | ||
+ | |||
+ | initial | ||
+ | begin | ||
+ | clk=0; | ||
+ | rst_n=0; | ||
+ | #25 | ||
+ | rst_n=1; | ||
+ | end | ||
+ | | ||
+ | always #10 clk = clk+1; | ||
+ | |||
+ | segment_top #(.CNT_NUM(10)) u1 ( | ||
+ | .clk (clk), | ||
+ | .rst_n (rst_n), | ||
+ | .seg_led_1 (seg_led_1), | ||
+ | .seg_led_2 (seg_led_2) | ||
+ | ); | ||
+ | endmodule | ||
+ | |||
+ | |||
+ | </code> | ||