====== 实验3.1 数码管显示实验 ======
===== 1.实验目的 =====
(1)熟悉和掌握FPGA开发流程和Lattice Diamond软件使用方法;
(2)通过实验理解和掌握数码管驱动原理;
(3)学习用Verilog HDL数据流描述方法驱动数码管进行循环显示。
===== 2.实验任务 =====
本实验的任务是驱动两个7段数码管进行数字0~数字9的循环显示,并通过STEP FPGA开发板的12MHz晶振作为触发器时钟信号clk_in,轻触按键1为复位信号rst_n_in输入,将输出分别对应连接至数码管引脚上,在clk_in上升沿的驱动下,数码管显示发生相应变化。
===== 3.实验原理 =====
首先,根据数码管的原理可知,要控制数码管显示我们至少需要8根段选信号线和1根位选信号线,这样如果我们需要4位数码管至少需要4*8 = 32根信号线才能分别显示。独立显示模式实现方法简单,但是需要大量的信号线。
{{ ::shuamguanzhijielianjie.png?600 |}}
===== 4.Verilog HDL建模描述 =====
用独立显示模式实现的数码管循环显示:
==== 程序清单gates.v ====
(1)数码管显示模块:Segment_led.v
// --------------------------------------------------------------------
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// --------------------------------------------------------------------
// File name : Segment_led.v.v
// Module name : Segment_led
// Author : Step
// Description : Segment_led
// Web : www.stepfpga.com
//
// --------------------------------------------------------------------
// Code Revision History :
// --------------------------------------------------------------------
// Version: |Mod. Date: |Changes Made:
// V1.0 |2015/11/11 |Initial ver
// --------------------------------------------------------------------
module segment_led
(
//INPUT
seg_data_1 ,
seg_data_2 ,
//OUTPUT
seg_led_1 ,
seg_led_2
);
input [3:0] seg_data_1,seg_data_2;
output [8:0] seg_led_1,seg_led_2;
//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
(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.新建工程 ===
\\
双击{{:diamond图标.png?28|}}打开Lattice Diamond软件,点击**File—New—Project**新建工程,输入工程名称,指定工程保存目录,单击**Next**,选择设备如下:\\
* **Family**选择**MachXO2**,
* **Device**选择**LCMXO2-4000HC**,
* **Performance grade**选择**4**,
* **Package type**选择**CSBGA132**,
* **Operating conditions**选择**Commercial**,
* **Part Names**为**LCMXO2-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**或点击图标,按照仿真向导指示新建仿真工程,
* 输入工程名称,选择工程目录,选择**Simulator**为**Active-HDL**,
* **Process Stage**选择**RTL**,
* **Add and Reorder Source**:确认参与仿真的文件列表,**Next**
* **Parse HDL files for simulation**:软件会编译仿真文件,若报错需修改后重新仿真
* **Summary**:确认仿真工程信息,勾选**Run simulator**、**Add 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**或是点击图标{{::分配管脚.png|}}在**Port Assignments**一栏中对输入输出信号分配引脚。
\\
\\
=== 7. 布局布线 ===
\\
双击**Process**一栏的**Map Design**和**Place & Route Design**完成**FPGA**内部的布局布线。
\\
\\
=== 8. 生成配置文件 ===
\\
勾选并双击**JEDEC File**生成可下载的**jed**文件。
\\
\\
=== 9. 下载 ===
\\
打开**Tools—Programmer**或单击图标,根据下图选择设备和下载文件,点击上面的绿色按钮**Program**,下载**jed**文件到FPGA,下载成功后**Status**状态显示**PASS**(下载前确保下载器驱动成功安装)。
{{:下载成功.png|}}
观察开发板现象。