微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > verilog仿真结果看不懂,求指出哪儿出错了

verilog仿真结果看不懂,求指出哪儿出错了

时间:10-02 整理:3721RD 点击:
这是代码:
                module counter(q,clock,clear);
  output [3:0] q;
  input clock,clear;
  T_FF tff0(q[0],clock,clear);
  T_FF tff1(q[1],q[0],clear);
  T_FF tff2(q[2],q[1],clear);
  T_FF tff3(q[3],q[2],clear);
endmodule

module T_FF(q,clock,reset);
  output q;
  input clock,reset;
  D_FF d_ff(.q(q),.clk(clock),.clear(reset),.d(~q));
endmodule
module D_FF(q,qbar,clear,clk,d);
  output q,qbar;
  input clear,clk,d;
  wire sbar,s,r,rbar,cbar;
  assign cbar=~clear;
  assign sbar=~(rbar&s);
  assign s=~(sbar&cbar&~clk);
  assign r=~(s&~clk&rbar);
  assign q=~(s&qbar);
  assign qbar=~(q&cbar&r);
endmodule
module counterstimulus;
  reg clock,clear;
  wire [3:0] q;
  counter c1(q,clock,clear);
  initial
  begin
    $monitor($time," q=%b,clock=%b,clear=%b",q,clock,clear);
  end
  initial
  begin
    clear=1'b1;
    forever #30 clear=~clear;
  end
  initial
  begin
    clock=1'b0;
    forever #10 clock=~clock;
  end
endmodule
  
  
这是仿真结果:
      
#                    0 q=0000,clock=0,clear=1
run
run
#                   10 q=0000,clock=1,clear=1
run
run
#                   20 q=0000,clock=0,clear=1
run
run
#                   30 q=xxx0,clock=1,clear=0
run
run
#                   40 q=xxxx,clock=0,clear=0
run
run
#                   50 q=xxxx,clock=1,clear=0
run
run
#                   60 q=0000,clock=0,clear=1
run
run
#                   70 q=0000,clock=1,clear=1
run
run
#                   80 q=0000,clock=0,clear=1
run
run
#                   90 q=xxx0,clock=1,clear=0
run
run
#                  100 q=xxxx,clock=0,clear=0
run
run
#                  110 q=xxxx,clock=1,clear=0
run
q为什么会出现xxxx?

  1. module edge_dff(q, qbar, d, clk, clear);

  2. // Inputs and outputs
  3. output q,qbar;
  4. input d, clk, clear;

  5. // Internal variables
  6. wire s, sbar, r, rbar,cbar;

  7. // Data flow statements
  8. //Create a complement of signal clear
  9. assign cbar = ~clear;

  10. // Input latches
  11. assign  sbar = ~(rbar & s),
  12.         s = ~(sbar & cbar & ~clk),
  13.         r = ~(rbar & ~clk & s),
  14.         rbar = ~(r & cbar & d);

  15. // Output latch
  16. assign  q = ~(s & qbar),
  17.         qbar = ~(q & r & cbar);

  18. endmodule

复制代码


主?从?J?K?触?发?器?设?计?同?步?计?数?器:http://wenku.baidu.com/view/b1547f91195f312b3169a595.html

谢谢您的解答。

不客气

    module counter(q,clock,clear); 实现的是计数器,clear是复位信号,低有效,
仿真q出现xxxx是因为你的仿真信号中的clear一直在翻转,所以一会复位,一会无效。
仿真程序中
begin
     clear=1'b1;
     forever #30 clear=~clear;
   end
把forever #30 clear=~clear;这句话去掉,然后clear赋初值为0,先复位在置1。
程序这段改为
    begin
     clear=1'b0;
    #30 clear=1'b1;
   end
这样你在试试。

谢谢,clear翻转确实太快了,但是我不太明白,虽然翻转快了,但是还是有时间间隔的吧,难道仿真器识别不了?

因为你的时钟周期是20个单位时间,而clear周期是60个单位时间,也就是说,有效的工作时间只有30个单位时间,当clear=1时,程序还没有进行输出就被复位了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top