【问题标题】:Verilog Constructing synchronous 4-bit counter using negative edged JK Flip Flop testbench problemVerilog 使用负沿 JK 触发器测试台问题构建同步 4 位计数器
【发布时间】:2020-06-06 15:14:55
【问题描述】:

我正在构建一个 4 位 mod 12 计数器 (0->1->2->...->11->0) 在 Verilog 中。

但是,当我尝试在 Vivado FPGA 中使用测试平台模拟此代码时, 它似乎无法正常运行。计数器模块的输出始终显示 0。 我尝试以多种方式修改测试台代码,但没有任何改变。 实际上我又构建了 2 个计数器(3-6-9 计数器,2 位十进制计数器), 所有计数器都没有像我预期的那样模拟。

模块计数器3

`timescale 1ns / 1ps

module counter_3(input RESET_N, input CK, output[3:0] COUNT, output[3:0] COMP);
    wire J3, K3, J2, K2, J1, K1, J0, K0;

    assign J3 = COUNT[2] & COUNT[1] & COUNT[0];
    assign K3 = COUNT[1] & COUNT[0];
    assign J2 = COMP[3] & COUNT[1] & COUNT[0];
    assign K2 = COUNT[1] & COMP[0];
    assign J1 = COUNT[0];
    assign K1 = COUNT[0];
    assign J0 = 1;
    assign K0 = 1;

    edgeTriggeredJKFF jk1(.RESET_N(RESET_N), .J(J3), .K(K3), .CK(CK), .Q(COUNT[3]), .Q_(COMP[3]));
    edgeTriggeredJKFF jk2(.RESET_N(RESET_N), .J(J2), .K(K2), .CK(CK), .Q(COUNT[2]), .Q_(COMP[2]));
    edgeTriggeredJKFF jk3(.RESET_N(RESET_N), .J(J1), .K(K1), .CK(CK), .Q(COUNT[1]), .Q_(COMP[1]));
    edgeTriggeredJKFF jk4(.RESET_N(RESET_N), .J(J0), .K(K0), .CK(CK), .Q(COUNT[0]), .Q_(COMP[0]));
endmodule

模块 edgeTriggeredJKFF

`timescale 1ns / 1ps

module edgeTriggeredJKFF(input RESET_N, input J, input K, input CK, output reg Q, output reg Q_);    

    initial begin
      Q = 0;
      Q_ = ~Q;
    end

    always @(negedge CK) begin
        Q = RESET_N & (J&~Q | ~K&Q);
        Q_ = ~RESET_N | ~Q;
    end

endmodule

测试台代码

`timescale 1ns / 1ps

module test_tb();
    reg counter3_RESET_N;
    wire [3:0] counter3_CNT;    
    reg CK;
    integer i;
    counter_3 c3 (.RESET_N(counter3_RESET_N), .CK(counter3_ck), .COUNT(counter3_CNT));
    always #3 CK = ~CK;
    initial begin
        Passed = 0;
        Failed = 0;
        CK <= 0;  
        counter_3_test;
    end
    task counter_3_test;
    begin
    CK <= 0;
    counter3_RESET_N <= 1;
    #60 counter3_RESET_N <= 0;
    #6 counter3_RESET_N <= 1;
    #48;
    end
    endtask


endmodule

【问题讨论】:

    标签: verilog counter circuit digital-design


    【解决方案1】:

    您忘记将时钟传递给 DUT。而不是CK 你通过了counter3_ck,它甚至还没有被声明。我建议您使用``default_nettype none 指令来捕获这些错误。

    在旁注中,您滥用了阻塞和非阻塞分配。在你的测试台的intial 块中应该没有,你应该在你的 jk 模块的 flop 中使用它们。 Q_ 将无法正常工作,在这种情况下会延迟一个周期。它应该是组合的:

    always @(negedge CK)
        Q <= RESET_N & (J&~Q | ~K&Q);
    
    always @*
        Q_ = ~RESET_N | ~Q;
    
    

    您应该始终将任何initial 块视为测试平台的一部分。 jk 模块中的初始块也是如此。

    【讨论】:

    • 谢谢,我解决了问题。错误比我想象的要多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多