差别

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

到此差别页面的链接

后一修订版
前一修订版
实验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_nseg_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> ​