清零信号clear低电平有效,输入数据在clock上升沿锁存,下降沿输出。count_ena低电平时停止计数。主从JK触发器和四位带清零端和计数使能的同步计数器的逻辑图如下:
自顶向下设计:
顶层模块:
//使用主从JK触发器来设计一个同步计数器 倒计时
module counter(
input clock,clear,count_ena,
output [3:0] q
);
wire c1,c2,c3;
wire [3:0] q_bar;
assign c1 = count_ena&q_bar[0], c2 = c1&q_bar[1], c3 = c2&q_bar[2];
latch_jk jk1(count_ena,count_ena,clear,clock,q[0],q_bar[0]);
latch_jk jk2(c1,c1,clear,clock,q[1],q_bar[1]);
latch_jk jk3(c2,c2,clear,clock,q[2],q_bar[2]);
latch_jk jk4(c3,c3,clear,clock,q[3],q_bar[3]);
endmodule
JK触发器模块:
module latch_jk(
input j,k,clear,clock,
output q,qbar
);
wire a,b,y,ybar,c,d;
assign a = ~(qbar&j&clear&clock), b = ~(clock&k&q);
assign ybar = ~(y&clear&b), y = ~(a&ybar);
assign c = ~(~clock&y), d = ~(~clock&ybar);
assign q = ~(c&qbar), qbar = ~(d&q&clear);
endmodule
测试模块:
module tb_counter(
);
reg clear,clock,count_ena;
wire [3:0] Q;
counter counter1(clock,clear,count_ena,Q);
initial begin
$monitor($time," clear= %b, count_ena= %b, Q= %d",clear,count_ena,Q);
clock <= 0; clear <= 0; count_ena <= 1;
#100
clear <= 1; count_ena <= 1;
#360
clear <= 0; count_ena <= 0;
#100
$stop;
end
always #10 clock<=~clock;
endmodule
测试结果:
这里的结果其实并不是题目想要的,经过一番试探,得出一个反向的计数器,题意应该是从0到15,但是按照题中的图是得不到想要的结果的(结果是0-1-0-1-0-1,很明显,Q[1]Q[2]Q[3]都是0,经过JK触发器之后不会变,只有Q[0]会变),不知道问题出在哪,可能是计数器的原理图画错了。希望读者指正。