-1
module rff_try_1(q,inp,clk);
input clk,inp;
output q;
reg q;

DFF dff0(q,inp,clk);
endmodule

module DFF(q,inp,clk);
input inp,clk;
output q;
reg q;
always @ (posedge clk)begin 
if(clk)begin 
q=inp;
end
end

endmodule

在这里我使用了两个模块,但输出没有出现

4

1 回答 1

1

代码中有几个错误。

1)应该去掉线if(clk)begin和相关,已经描述了触发器的触发条件。endposedge clk

2)<=时序逻辑需要非阻塞赋值 ( )。

always块应如下所示:

always @ (posedge clk) begin 
    q <= inp;
end

3)一些模拟器不会抱怨,但信号q应该wire在模块中rff_try_1

wire q;

模拟

我使用下面的测试平台在EDA Playground上模拟了代码(修改后) 。使用Icarus Verilog 0.9.7作为模拟器。

module tb();

  reg clk = 1;
  always clk = #5 ~clk;

  reg  inp;
  wire q;

  rff_try_1 dut(q, inp, clk);

  initial begin
    inp = 0;
    #12;
    inp = 1;
    #27;
    inp = 0;
    #24;
    inp = 1;
  end

  initial begin
    $dumpfile("dump.vcd"); $dumpvars;
    #200;
    $finish;
  end

endmodule

信号q与波形上所见的一样。

在此处输入图像描述

于 2017-11-16T13:09:03.643 回答