首页 > 解决方案 > 线输出在verilog仿真代码中什么也不显示

问题描述

它是一个简单的异步 2 位计数器,使用了两个 JK 触发器。

这是我的 TwoBitCounter.v脚本。

`timescale 1ns / 1ps
    
    module TwoBitCounter(
        input wire clk,
        output wire q0,
        output wire q1
        );
    JK jk1(1, 1, clk, q0);
    JK jk2(1, 1, q0, q1);
    
    endmodule
    
    module JK(
        input wire J,
        input wire K,
        input wire clk,
        output reg out
        );
        
    always @(posedge clk) begin
        if(J==0&&K==0)
            begin end
        else if(J==0&&K==1) begin
            out <= 1'b0; 
        end else if(J==1&&K==0) begin
            out <= 1'b1;
        end else if(J==1&&K==1) begin
            out <= ~out;
        end
    end
    endmodule

这是我的模拟代码:


    `timescale 1ns / 1ps
    
    module TwoBitCounter_sim();
    reg clk;
    wire q0;
    wire q1;
    
    TwoBitCounter twoBitCounter(.clk(clk), .q0(q0));
    
    initial clk = 1'b0;
    always clk = #100 ~clk;
    
    initial begin
        #1000;
        $finish;
    end
    
    endmodule

我已经检查过 JK 模块是否可以单独正常工作。我尝试禁用一个 JK 触发器,看看它在TwoBitCounter模块中实现时是否没有错误,它也没有工作。虽然我已经检查了几次,看看算法本身是否有问题,但不知道根本问题是什么。

标签: verilogcountervivado

解决方案


在您的代码中J/K,您只使用一种组合:1/1. 在这种状态下,您只需反转out(out <= ~out)。但是,您从未对其进行初始化。你out最初是x有价值的。的倒置x也是x。所以,它永远不会改变。

您需要找到一种方法来通过操纵 J/K 值或通过其他方式来初始化触发器。

举个例子,initial out = 0;在JK模块中添加会改变图片,但是不能很好的配合合成。所以,你需要自己想办法。


推荐阅读