计数器的Modelsim仿真报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计数器的Modelsim仿真
一.实验目的和要求:
1. 熟悉Quartus和Modelsim软件的基本使用方法和步骤,熟悉基本的Verilog语法,学会用Verilog语言编写简单的程序。
2.学会使用Quartus编写计数器模块并用Modelsim进行仿真。
3.熟练掌握Quartus和Modelsim软件工程建立、添加文件、编译运行和仿真的方法,学会写程序文件和测试文件。
4.试验设备及要求:@Quartus 13 和Modelsim。@运行Modelsim软件建立工程并添加测试.v 文件,进行仿真,查看波形图。
二.仿真方案:
用Quartus编写出计数器模块,已由上节课完成这个任务。编写好计数器模块后,再进行Modelsim进行仿真实验。
三.仿真过程:
1.根据自己写的计数器模块编写测试程序。这里我是用Quartus编写的,所以在编写的时候遇到一些问题。编写如下图:
2.编写完测试模块并编译完成后,打开Modelsim。选择菜单栏的【File】→【New】→【Project】
命令,在弹出窗口中选择【Add Exiting File】,把事先写好的测试文件和程序文件tb_cnt84和count84加入。
3、编译运行:在空白处右键,在弹出窗口中选择【Compile】→【Compile All】,检查完错误后,进行更改,直至没有错误出现。最后进行【Simulate】,选择自己编写的tb_cnt84,然后右击选择加波形,add wave。
4、计数器仿真结束:
四.仿真过程中的错误排查与解决方案:
1、在编写测试模块时我是用Quartus进行编写的,所以总是有一个问题,也就是总是有一个错误解决不了,在请教了同学之后,知道这可能是没问题的,所以还要导入Modelsim之后再进行修改,我导入Modelsim之后,发现确实没有了错误。
2、测试模块的变量问题,测试模块的变量决定了测试模块能否编写成功的关键,所以在编写变量时要格外注意,第一次我并没有把所有的变量编写进去,所以总是漏洞百出,最后,终于成功地完成了测试模块的编写。
五.仿真结果分析:
1:测试模块程序:
`timescale 1ns/1ns
module tb_cnt84( );
wire [7:0] qout;
reg clk;
reg reset;
reg enable;
wire cout;
initial begin
reset = 1'b0;
clk = 1'b0;
# 30 reset = 1'b1;
enable=1'b1;
end
always #50 clk = ~clk;
count84 u1(
.clk(clk),
.reset(reset),
.enable(enable),
.qout(qout),
.cout(cout)
);
Endmodule
2、计数器模块程序:
module count84(input clk, reset, enable,
output reg[7:0] qout,
output cout ); //定义输入输出变量,采用级联的形式,十位记到8,个位到4 always@(posedge clk or negedge reset)
begin
if(!reset)
qout <= 8'b00000000;
else if( enable== 1'b0)
qout <= qout;
else if( (qout[7:4] == 4'b1000)&&(qout[3:0] == 4'b0100) ) //十位是8并且个位为4
qout <= 8'b00000000;
else if(qout[3:0] == 4'b1001) //如果为9
begin
qout[3:0] <= 4'b0000;
qout[7:4] <= qout[7:4] + 1'b1; //加一运算
end
else
begin
qout[7:4] <= qout[7:4];
qout[3:0] <= qout[3:0] + 1'b1; //加一运算
end
end
assign cout=((qout[7:4] == 4'b1000)&&(qout[3:0] == 4'b0100))?1'b1:1'b0; //输出进位endmodule
3、结果分析:
在看到并行之后,我想这个结果应该是正确的。因为在计时脉冲经过84次之后,进位端就会进行一次进位,然后再次进行计数,再次进行进位。