====== 实验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|}} 观察开发板现象。