实验3.1 数码管显示实验

1.实验目的

(1)熟悉和掌握FPGA开发流程和Lattice Diamond软件使用方法; (2)通过实验理解和掌握数码管驱动原理; (3)学习用Verilog HDL数据流描述方法驱动数码管进行循环显示。

2.实验任务

本实验的任务是驱动两个7段数码管进行数字0~数字9的循环显示,并通过STEP FPGA开发板的12MHz晶振作为触发器时钟信号clkin,轻触按键1为复位信号rstnin输入,将输出分别对应连接至数码管引脚上,在clkin上升沿的驱动下,数码管显示发生相应变化。

3.实验原理

首先,根据数码管的原理可知,要控制数码管显示我们至少需要8根段选信号线和1根位选信号线,这样如果我们需要4位数码管至少需要4*8 = 32根信号线才能分别显示。独立显示模式实现方法简单,但是需要大量的信号线。

4.Verilog HDL建模描述

用独立显示模式实现的数码管循环显示:

程序清单gates.v

(1)数码管显示模块:Segmentled.v <code verilog> ——————————————————————– »»»»»»»»»»»»> COPYRIGHT NOTICE ««««««««««««< ——————————————————————– File name : Segmentled.v.v Module name : Segmentled Author : Step Description : Segmentled Web : www.stepfpga.com ——————————————————————– Code Revision History : ——————————————————————– Version: |Mod. Date: |Changes Made: V1.0 |2015/11/11 |Initial ver ——————————————————————– module segmentled ( INPUT segdata1 , segdata2 , OUTPUT segled1 , segled2
); input [3:0] seg
data1,segdata_2;
output [8:0] segled1,segled2;
REGS

  reg     [6:0]   seg [15:0];  
  
  //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>
(2)顶层模块进行调用

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;    
 
    output  [8:0]   seg_led_1,seg_led_2;
 
    //REGS
    reg     [23:0]  cnt; 
    reg     [3:0]   seg_data;
 
 
    always @(posedge clk)
        if(!rst_n)begin
            cnt <= 1'b0;
        end else if(cnt >= CNT_NUM - 1)
      cnt <= 1'b0;
        else
            cnt <= cnt + 1'b1;
 
    always @(posedge clk)
        if(!rst_n) seg_data <= 4'b0000;
        else if(cnt == CNT_NUM - 1)
            begin
                if(seg_data >= 9)  seg_data <= 4'b0000;
                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


仿真文件:

`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


四、 实验步骤


1.新建工程


双击打开Lattice Diamond软件,点击File—New—Project新建工程,输入工程名称,指定工程保存目录,单击Next,选择设备如下:

  • Family选择MachXO2
  • Device选择LCMXO2-4000HC,
    • Performance grade选择4
    • Package type选择CSBGA132
    • Operating conditions选择Commercial
    • Part NamesLCMXO2-4000HC-4MG132C
    • 选择综合工具Lattice LSE,完成。

    2. 输入Verilog文件


点击File—New—File新建文件,类型选择Verilog Files,输入文件名称,选择保存路径,输入实验中的源代码后保存,编辑器会自动检查有无编辑错误,在下面的Output一栏会输出检查结果,如果有错误更正后重新保存直到没有报错为止。

3. 输入仿真文件


按照步骤(2)新建一个Verilog仿真文件,输入实验例程中仿真文件的代码后保存。在软件File List一栏中,右键单击“仿真文件”—Include for—Simulation,将文件设置为仿真文件(设置完成后文件图标的V会消失)。

4. 功能仿真


点击Tools选择Simulation Wizard或点击图标,按照仿真向导指示新建仿真工程,

  • 输入工程名称,选择工程目录,选择SimulatorActive-HDL
  • Process Stage选择RTL
  • Add and Reorder Source:确认参与仿真的文件列表,Next
  • Parse HDL files for simulation:软件会编译仿真文件,若报错需修改后重新仿真
  • Summary:确认仿真工程信息,勾选Run simulatorAdd top-level signals to waveform display和Run simulation,然后Finish

仿真软件会自动启动、运行仿真并显示仿真结果。查看仿真结果是否符合预期功能,如果不符合电路功能,则修改Verilog代码保存后,在Active-HDL中选择Design—Compile All 重新编译文件,编译通过后,在Simulation中重新开始仿真。

5. 综合


在Lattice Diamond软件的Process一栏,双击第一项Synthesize Design进行综合(确保仿真文件设置为simulation后不参与综合),综合结果会在下面的Output一栏中给出,如果有错误则修改Verilog文件后重新综合直至综合成功为止。

6. 分配管脚


打开Tools—Spreadsheet View或是点击图标Port Assignments一栏中对输入输出信号分配引脚。

7. 布局布线


双击Process一栏的Map DesignPlace & Route Design完成FPGA内部的布局布线。

8. 生成配置文件


勾选并双击JEDEC File生成可下载的jed文件。

9. 下载


打开Tools—Programmer或单击图标,根据下图选择设备和下载文件,点击上面的绿色按钮Program,下载jed文件到FPGA,下载成功后Status状态显示PASS(下载前确保下载器驱动成功安装)。 观察开发板现象。