使用主从JK触发器实现一个四位的同步计数器

清零信号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]会变),不知道问题出在哪,可能是计数器的原理图画错了。希望读者指正。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值