****大学实验报告课程名称:基于FPGA的现代数字系统设计实验名称:基于HDL十进制计数显示系统设置姓名:学号: 班级:指导教师:****大学信息工程学院制基于HDL十进制计数显示系统设置一、实验要求1.设计具有异步复位,同步使能的十进制计数器,其计数结果通过七段数码管,发光二极管等进行显示。
2.主要设计的模块有十进制计数模块和数码管驱动模块以及消抖模块。
3.需要将按键输入的时钟,然后通过消抖模块消抖后,再输出至后续使用。
4.共阴极数码管驱动。
二、实验原理本次的设计是一个具有数显输出的十进制计数器。
示意图如2.1所示。
图2.1七段数码管属于数码管的一种,是由7段二极管组成。
按发光二极管单元衔接方式分为共阳极数码管和共阴极数码管。
本实验使用共阴数码管。
它是指将一切发光二极管的阴极接到一同构成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平相应字段就点亮,当某一字段的阳极为低电平相应字段就不亮。
显示译码器,用HDL语言判断CLK的上升沿信号,每次收到一次上升沿信号,计数器的值加一并显示在数码管上,所以本次实验会将十进制计数与七段数码管的显示分别写在两个模块里面。
系统模块划分及引脚连线图如下:三、实验步骤(设计输入)1.十进制计数器模块module cnt10(clk,clr,ena,sum,cout);input clk,clr,ena;output [3:0] sum;output cout;reg [3:0] sum;reg cout;always @ (posedge clk or posedge clr)if(clr==1)beginsum <= 4'b0000; cout<= 1'b0;endelse if(ena==1'b1)if(sum==4'b1001)beginsum <= 4'b0000; cout<= 1'b1; endelsebeginsum <= sum+1; cout<= 1'b0; endelsebeginsum <= sum; cout<= cout; endEndmodule程序主要思路是用always等待clk与clr的上升沿信号,因为是异步清零所以在always 中也要等待clr的清零信号。
用if语句判断clr信号,为1则清零。
判断ena信号,为1进行计数操作,为0输出保持不变。
计数中,判断sum的值如果为9时,进行进位操作,并将sum值赋值为02.数码管驱动模块module led7 (sum ,out );input [3:0] sum;output [6:0] out;reg [6:0] out ;always @(sum)beginout = {7{1'b0}};case (sum) //根据共阳接法译码4'b0000 : out [6:0] = 7'b1000000;4'b0001 : out [6:0] = 7'b1111001;4'b0010 : out [6:0] = 7'b0100100;4'b0011 : out [6:0] = 7'b0110000;4'b0100 : out [6:0] = 7'b0011001;4'b0101 : out [6:0] = 7'b0010010;4'b0110 : out [6:0] = 7'b0000010;4'b0111 : out [6:0] = 7'b1111000;4'b1000 : out [6:0] = 7'b0000000;4'b1001 : out [6:0] = 7'b0011000;default : out [6:0] = {7{1'b0}};endcaseendEndmodule用一个case语句判断输入的data_in的值,选择data_out的输出,这样比用原理图设计数码管要大大的减少工作量。
3.顶层模块①用verilog HDL代码描述模块的连接,构成如下图所示的系统:module top(clk_50,clk,clr,ena,cout,out);input clk,clr,ena,clk_50;output cout;output [6:0]our;wire [3:0]temp;cnt10 u1(pin_out,clr,ena,cout,temp);led u2(temp,out);debounce_module u3(clk_50,clk,pin_out);endmodule②引脚锁定引脚锁定表相应的用户约束文件:NET "clk" LOC = V16 | IOSTANDARD = LVCMOS33 | PULLDOWN ;NET "clk_50m" LOC = C9 | IOSTANDARD = LVCMOS33 ;NET "clr" LOC = N17 | IOSTANDARD = LVCMOS33;NET "ena" LOC = H18 | IOSTANDARD = LVCMOS33;NET "q[0]" LOC = C5 | IOSTANDARD = LVCMOS33; # DATA0 aNET "q[1]" LOC = B4 | IOSTANDARD = LVCMOS33; # DATA1 bNET "q[2]" LOC = A4 | IOSTANDARD = LVCMOS33; # DATA2 cNET "q[3]" LOC = F7 | IOSTANDARD = LVCMOS33; # DATA3 dNET "q[4]" LOC = B6 | IOSTANDARD = LVCMOS33; # DATA4 eNET "q[5]" LOC = E7 | IOSTANDARD = LVCMOS33; # DATA5 fNET "q[6]" LOC = A6 | IOSTANDARD = LVCMOS33; # DATA6 gNET "COM" LOC = D5 | IOSTANDARD = LVCMOS33; # DATA7 DIG注意:由于clk没锁于ISE默认的时钟输入引脚上,需要添加“CLOCK_DEDICATED_ROUTE = FALSE;”为了更好的消抖效果,需要在V16输入端口加入下拉电阻,即需加“PULLDOWN”。
所以在约束文件(.ucf)中clk的锁定应为为:1)NET “clk” LOC = “V16” |PULLDOWN | CLOCK_DEDICATED_ROUTE = FALSE;”:或者2)NET “clk” LOC = “V16” |PULLDOWN ;NET "clk" CLOCK_DEDICATED_ROUTE=FALSE;4.双击Implement Design,进行布局布线,双击Generate Programming File生成下载文件,双击Configure Target Device,完成结果如图所示。
四、实验结果及分析共阴极数码管驱动模块的输入与输出:输入是0000 输出是1111110;输入是0001 输出是0110000;输入是0010 输出是1101101; 输入是0011 输出是1111001;输入是0100 输出是0110011; 输入是0101 输出是1011011;输入是0110 输出是1011111; 输入是0111 输出是1110000;输入是1000 输出是1111111; 输入是1001 输出是1111011;输入是1010 输出是1110111; 输入是1011 输出是0011111;输入是1100 输出是1001110; 输入是1101 输出是0111101;输入是1110 输出是1001111; 其他输入输出是1000111;五、实验思考题解答(实验指导书要求的思考题)1.如何用两个或一个always 实现十进制计数模块?写出相应代码。
答:用always实现十进制计数模块,程序如下:module cnt10(clk,clr,ena,sum,cout);input clk,clr,ena;output [3:0] sum;output cout;reg [3:0] sum;reg cout;always @ (posedge clk or posedge clr)if(clr==1)beginsum <= 4'b0000; cout<= 1'b0;endelse if(ena==1'b1)if(sum==4'b1001)beginsum <= 4'b0000; cout<= 1'b1; endelsebeginsum <= sum+1; cout<= 1'b0; endelsebeginsum <= sum; cout<= cout; endEndmodule2.如何用always,或assign实现数码管的驱动设计?写出相应代码。
答:用always实现数码管驱动设计,程序如下:module led7 (sum ,out );input [3:0] sum;output [6:0] out;reg [6:0] out ;always @(sum)beginout = {7{1'b0}};case (sum) //根据共阳接法译码4'b0000 : out [6:0] = 7'b1000000;4'b0001 : out [6:0] = 7'b1111001;4'b0010 : out [6:0] = 7'b0100100;4'b0011 : out [6:0] = 7'b0110000;4'b0100 : out [6:0] = 7'b0011001;4'b0101 : out [6:0] = 7'b0010010;4'b0110 : out [6:0] = 7'b0000010;4'b0111 : out [6:0] = 7'b1111000;4'b1000 : out [6:0] = 7'b0000000;4'b1001 : out [6:0] = 7'b0011000;default : out [6:0] = {7{1'b0}};endcaseendEndmodule3.比较实验一与实验二的实验过程,说明原理图输入法与HDL输入法的不同的应用环境。