Verilog HDL实验报告
Verilog 实验报告
题 目: JK触发器、同步计数器
系部名称 : 专业名称 : 班 级 : 班内序号 : 学生姓名 : 时
通信工程 通信工程
2010.11.28
间 :
一、 实验内容:
用JK触发器构成同步计数器:
设计一个同步计数器,其逻辑图和JK触发器的逻辑图所示。清零信号clear低电平有效,输入数据在时钟信号clock的上升沿被锁存,触发器在clock的下降沿输出,当count_enable信号为低电平时停止计数。写出同步计数器的verilog描述和激励模块,在激励模块中使用clear和count_enable对计数器进行测试,并显示输出计数Q[3:0]。
二、 实验原理图:
JK触发器构成同步计数器
源代码: //主模块
module synchronous_counter(clear,clock,count_enable,Q); input clear,clock,count_enable; output [3:0] Q;
wire qbar1,qbar2,qbar3,qbar0; wire a,b,c;
assign a = Q[0] & count_enable; assign b = a & Q[1]; assign c = b & Q[2];
JK_flip_flop myJK(count_enable,count_enable,clock,clear,Q[0],qbar0); JK_flip_flop myJK1(a,a,clock,clear,Q[1],qbar1); JK_flip_flop myJK2(b,b,clock,clear,Q[2],qbar2); JK_flip_flop myJK3(c,c,clock,clear,Q[3],qbar3); endmodule//调用的JK触发器模块
module JK_flip_flop(j,k,clock,clear,q,qbar); input j,k,clock,clear; output q,qbar;
wire a,b,y,ybar,c,cbar,d,q,qbar;
assign a = ~ (((qbar & j)& clock) & clear); assign b = ~ ((clock & k) & q); assign y = ~ (a & ybar);
assign ybar = ~ ((y & clear) & b); assign c = ~(y & cbar); assign cbar = ~ clock;
assign d = ~ (cbar & ybar); assign q = ~ (c & qbar);
assign qbar = ~ ((q & clear) & d);
endmodule
测试文件源代码: module count_test;
reg count_enable=1,clock=0,clear=0; wire [3:0]Q;
synchronous_counter myCount(clear,clock,count_enable,Q); initial #10 clear=1; always@(negedge clock) begin
$monitor($time,\" clear=%b,count_enable=%b,Q=%b%b%b%b\\n\
clear,count_enable,Q[3],Q[2],Q[1],Q[0]);
end
always clock = #5 ~clock;
always count_enable= #170 ~count_enable; endmodule
实验结果:
波形图:
三、 实验心得:
这次实验比上一次顺利多了,可能是因为有了前一次的铺垫,我对软件的熟悉度有了一定的提高。经过这次实验,我对数据流建模和行为建模有了进一步了解,也能很好的在机器上进行排错和完善。而且,我对JK触发器的内部原理和应用都有了较深的体会,这对于我数电的学习很有帮助。
但是,我在编写测试代码的时候有明显的不足,经过老师指点后才的完成了实验。所以我会更加重视测试部分的编写和一些基本运算符的使用方法,相信下一次我一定会做的更好!