(1)熟悉和掌握FPGA开发流程和Lattice Diamond软件使用方法; (2)通过实验理解和掌握数码管驱动原理; (3)学习用Verilog HDL数据流描述方法驱动数码管进行循环显示。
本实验的任务是驱动两个7段数码管进行数字0~数字9的循环显示,并通过STEP FPGA开发板的12MHz晶振作为触发器时钟信号clkin,轻触按键1为复位信号rstnin输入,将输出分别对应连接至数码管引脚上,在clkin上升沿的驱动下,数码管显示发生相应变化。
首先,根据数码管的原理可知,要控制数码管显示我们至少需要8根段选信号线和1根位选信号线,这样如果我们需要4位数码管至少需要4*8 = 32根信号线才能分别显示。独立显示模式实现方法简单,但是需要大量的信号线。
用独立显示模式实现的数码管循环显示:
(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] segdata1,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
双击打开Lattice Diamond软件,点击File—New—Project新建工程,输入工程名称,指定工程保存目录,单击Next,选择设备如下:
点击File—New—File新建文件,类型选择Verilog Files,输入文件名称,选择保存路径,输入实验中的源代码后保存,编辑器会自动检查有无编辑错误,在下面的Output一栏会输出检查结果,如果有错误更正后重新保存直到没有报错为止。
按照步骤(2)新建一个Verilog仿真文件,输入实验例程中仿真文件的代码后保存。在软件File List一栏中,右键单击“仿真文件”—Include for—Simulation,将文件设置为仿真文件(设置完成后文件图标的V会消失)。
点击Tools选择Simulation Wizard或点击图标,按照仿真向导指示新建仿真工程,
仿真软件会自动启动、运行仿真并显示仿真结果。查看仿真结果是否符合预期功能,如果不符合电路功能,则修改Verilog代码保存后,在Active-HDL中选择Design—Compile All 重新编译文件,编译通过后,在Simulation中重新开始仿真。
在Lattice Diamond软件的Process一栏,双击第一项Synthesize Design进行综合(确保仿真文件设置为simulation后不参与综合),综合结果会在下面的Output一栏中给出,如果有错误则修改Verilog文件后重新综合直至综合成功为止。
双击Process一栏的Map Design和Place & Route Design完成FPGA内部的布局布线。
勾选并双击JEDEC File生成可下载的jed文件。