verilog十六分频实现

  • 格式:doc
  • 大小:71.50 KB
  • 文档页数:6

西北工业大学

《FPGA技术实验》

实验报告一

(用计数方法实现一个16分频电路)

学 院: 软件与微电子学院

学 号:

姓 名:

专 业: 微电子学

实验时间: 2011.9.28

实验地点: 毅字楼335

指导教师: ***

西北工业大学

2011 年10月

一、实验目的及要求

实验目的:进一步熟悉verilog语言,学会熟练操作modelsim软件,并用它进行仿真,为以后的进一步发展打下良好基础.

实验要求:使用计数方法实现一个16分频电路,用Verilog写出电路实现程序以及测试文件.

二、实验设备(环境)及要求

实验软件:ModelSim SE 6.2b

三、实验内容与步骤

1. 实验总体设计思路

用一个计数器(counter)来计数,当计数器等于7时,让输出结果翻转,同时计数器置零,如此往下.

a. 输入端口为有时钟信号clk以及复位信号reset,输出为dout,先用reset信号把clk和dout都清零.

b. 在时钟上升沿触发,如果计数器counter等于7,则把dou翻转且把counter清零,否则的话counter自加一.

c. 这样的话就可以实现对时钟信号的16分频.

2. 测试平台设计

模块设计:

`timescale 1ns/1ns

module div_16(clk, reset,

dout);

input clk // 时钟信号

input reset; // 清零端reset,且高电平有效

output dout;

reg[2:0] counter; // 设置一3位计数器

reg dout;

always@(posedge clk or posedge reset) // 在时钟上升沿和复位端上升沿触发

begin

if(reset)

begin

counter=0;

dout=0; // 复位端起作用,计数器和输出结果都清零

end

else if(counter==7) // 若计数器counter为7,dout翻转且计数器清零

begin

dout=~dout;

counter=0;

end

else

counter=counter+1; // 否则的话计数器自加1

end

endmodule //结束

Tesetbench如下:

`timescale 1ns/1ns

module div_bench; reg clk;

reg reset;

wire dout;

div_16 d1(clk,reset,dout); // 实例化

always

begin // 对时钟信号clk赋值

#10 clk=0;

#10 clk=1;

end

initial

begin

reset=1; // 对复位信号reset赋值

#5 reset=0;

#1000 $finish; // 1000ns仿真结束

end

initial

$monitor("dout changed to %b at time %t,%b",dout,$time);//监视输出结果

Endmodule //结束

四、实验结果与数据处理

1. Modelsim仿真结果,波形图,代码覆盖率图等

仿真结果波形图如下:

上图中第一条线是时钟信号(clk),第二条是复位信号(reset),第三条是输出结果(dout),第四条是设置的三位计数器(conuter),复位信号在0时刻清零此时dout和counter都复位,5秒时复位信号失去作用,clk 10ns开始产生,并且周期为20ns,丛仿真波形图中可以看出,dout的周期变为clk的16倍,也就是16分频,这正是我们期望的.

代码覆盖率图如下:

可见代码覆盖率是非常高的.

2. 综合结果,布局布线结果,关键路径,资源利用率等。

综上可见结果正确合理,达到了预期的结果和要求,资源利用率较高.

五、分析与讨论

1. 电路的功能是否正确,仿真是否充分,如何进一步提高代码覆盖率

电路功能正确,仿真充分,代码利用率非常好.

2. 电路的关键路径在哪里,如何对关键路径进行优化。

关键是对计数器的控制,要在7的时刻让输出结果翻转,这是此问题的精华.

六、教师评语

签名:

日期: 成绩