FPGA实验二:基于HDL的十进制计数器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《FPGA》课程报告
设计题目:基于HDL的十进制计数器学生班级:
学生学号:
学生姓名:
指导教师:
时间:
成绩:
一、实验目的:
1.掌握基于语言的ISE设计全流程;
2.熟悉、应用VerilogHDL描述数字电路;
3.掌握基于Verilog的组合和时序逻辑电路的设计方法。

二、实验原理:
本次实验是使用Verilog HDL进行编写十进制计数器与显示器代码而进行的实验,实验原理图如下:
本次实验的内容包括十进制计数器模块,七段译码显示器模块,以及消抖模块。

十进制计数器:对输入时钟进行计数
输入:
CLK -------待计数的时钟
CLR ---------异步清零信号,当CLR =1,输出复位为0,当CLR =0,正常计数
ENA---------使能控制信号,当ENA=1,电路正常累加计数,否则电路不工作
输出:
SUM[3:0]---------- 计数值的个位。

即,在CLK上升沿检测到SUM=9时,SUM将被置0,开始新一轮的计数。

COUT ------------计数值的十位进位,即:只有在时钟CLK上升沿检测到SUM=9时,COUT将被置1,其余情况下COUT=0;
LED显示驱动模块:
输入:sum[3:0] -------待显示的数值
out[6:0] ----------驱动数码管的七位数值
七段数码管的字符显示真值表如下:
消抖模块:
三、实验过程:
1.首先建立一个新的工程,添加一个新的Verilog Module,在其中编写十进制计数模块的代码,如下:
module liao1(CLR,CLK,ENA,SUM,COUT
);
input CLR,CLK,ENA;
output[3:0] SUM;
output COUT;
reg[3:0] SUM;
reg COUT;
always@(posedge CLK or posedge CLR)
if(CLR)
begin
SUM<=4'b0000;
COUT<=1'b0;
end
else
if(ENA)
begin
if(SUM==9)
begin
SUM<=4'b0000;
COUT<=1'b1;
end
else
begin
SUM<=SUM+1'b1;
COUT<=1'b0;
end
end
endmodule
然后执行综合,确认无误后,新建一个Test Bench WaveForm文件,进行仿真,仿真图如下:
2.再新建一个Verilog Module,在其中编写七段数码显示模块的代码,如下:
module liao2(SUM,out
);
input[3:0] SUM;
output[6:0] out;
reg [6:0] out;
always @(SUM)
begin
case(SUM)
4'b0000: out<=7'b0000001;
4'b0001: out<=7'b1001111;
4'b0010: out<=7'b0010010;
4'b0011: out<=7'b0000110;
4'b0100: out<=7'b1001100;
4'b0101: out<=7'b0100100;
4'b0110: out<=7'b0100000;
4'b0111: out<=7'b0001111;
4'b1000: out<=7'b0000000;
4'b1001: out<=7'b0000100;
default :out<=7'b0000001;
endcase
end
endmodule
执行综合,确认无误后新建一个Test Bench WaveForm文件,进行仿真,仿真图如下:
3.添加消抖模块,然后再新建一个Verilog Module,编写例化文件,制成顶层文件,其例化文件代码如下:
module liao(CLK_50M,CLK,CLR,ENA,COUT,out
);
input CLR,CLK,ENA;
input CLK_50M;
output[6:0] out;
output COUT;
wire[3:0] SUM;
debounce_module u1(CLK_50M,CLR,CLK,clk_out);
liao1 u2(CLR,clk_out,ENA,SUM,COUT);
liao2 u3(SUM,out);
endmodule
保存之后形成顶层文件:
4.执行综合,确认无误后,根据实验指导书进行锁引脚操作:
锁引脚完成后,修改、编辑约束文件:
5.生成下载配置文件,下载到开发板进行经行验证。

四、实验思考题:
1.如何用两个或一个always 实现十进制计数模块?写出相应代码。

module liao1(CLR,CLK,ENA,SUM,COUT
);
input CLR,CLK,ENA;
output[3:0] SUM;
output COUT;
reg[3:0] SUM;
reg COUT;
always@(posedge CLK or posedge CLR)
if(CLR)
begin
SUM<=4'b0000;
COUT<=1'b0;
end
else
if(ENA)
begin
if(SUM==9)
begin
SUM<=4'b0000;
COUT<=1'b1;
end
else
begin
SUM<=SUM+1'b1;
COUT<=1'b0;
end
end
endmodule
2.如何用always,或assign实现数码管的驱动设计?写出相应代码。

module liao2(SUM,out
);
input[3:0] SUM;
output[6:0] out;
reg [6:0] out;
always @(SUM)
begin
case(SUM)
4'b0000: out<=7'b0000001;
4'b0001: out<=7'b1001111;
4'b0010: out<=7'b0010010;
4'b0011: out<=7'b0000110;
4'b0100: out<=7'b1001100;
4'b0101: out<=7'b0100100;
4'b0110: out<=7'b0100000;
4'b0111: out<=7'b0001111;
4'b1000: out<=7'b0000000;
4'b1001: out<=7'b0000100;
default :out<=7'b0000001;
endcase
end
endmodule
3.比较实验一与实验二的实验过程,说明原理图输入法与HDL输入法的不同的应用环境。

答:通过做实验一与实验二,可以看出原理图输入法非常直观,而且便于理解,但是需要大量的时间来寻找元器件并进行布线;HDL输入法可以按功能分成多个模块,按需调用,有利于自顶向下的设计,但需要较强的逻辑理解能力。

五、实验体会:
通过本次实验,我基本上掌握了基于HDL语言的ISE设计流程,也熟悉了应用Verilog HDL来描述数字电路,而且也掌握了基于Verilog HDL的组合和时序逻辑电路的设计方法。

在本次实验中因为在写例化文件时出了一个小错误,结果使得我最后结果错误,真是让我意识到了在实验中不能忽视任何一个细节,必须面面俱到才能保证最后的成功,通过这次实验相信对我以后的学习生活都会有很大的帮助。

相关文档
最新文档