【问题标题】:Problem with reset Johson Counter Verilog重置 Johnson Counter Verilog 的问题
【发布时间】:2020-11-26 19:36:01
【问题描述】:

我需要为 n 位 Johnson Counter 构建测试平台和设计,但我在重置电路时遇到了问题。初始状态应该是 000,但我得到的是 xxx。这发生在所有 n 值上。在这种情况下,我使用 n = 3(3 位)进行测试。正如预期的那样,所有结果都是正确的;唯一的问题是第一个值。

设计

module johnsonCounter (clk, reset, out);
  parameter n = 3;
  input clk;
  input reset;
  output reg [n-1:0] out;
   
  
  genvar i;
  generate 
    for (i = n-1; i >= 0; i=i-1) begin: test
       always @ (posedge clk) begin
         out[i+1] <= out[i];
         if (!reset) 
           out <= 1;
         else begin
           out[0] <= ~out[n-1];   
        end
       end
    end
  endgenerate
 
endmodule

测试台

module tb;
  parameter n = 3;
  
  reg clk;
  reg reset;
  wire [n-1:0] out;
  
  //Instanciamento uut(Unity Under Test)
  johnsonCounter uut(clk, reset, out);
  
  //EPWave
  initial begin
    $dumpvars;
    $dumpfile("dump.vcd");
  end
  
  //
  always #10 clk = ~clk;
  
  initial begin
    {clk, reset} <= 0;

    $monitor ("Saidas = %b", out);
    repeat (2) @(posedge clk);
    reset <= 1;
    repeat (2*n) @(posedge clk);
    $finish;
  end
  
 
endmodule

#输出

OUTPUT: 
# KERNEL: Saidas = xxx
# KERNEL: Saidas = 001
# KERNEL: Saidas = 011
# KERNEL: Saidas = 111
# KERNEL: Saidas = 110
# KERNEL: Saidas = 100
# KERNEL: Saidas = 000

EXPECTED OUTPUT:
# KERNEL: Saidas = 000
# KERNEL: Saidas = 001
# KERNEL: Saidas = 011
# KERNEL: Saidas = 111
# KERNEL: Saidas = 110
# KERNEL: Saidas = 100
# KERNEL: Saidas = 000

【问题讨论】:

    标签: logic verilog iverilog


    【解决方案1】:

    使用异步复位而不是同步复位。变化:

    always @ (posedge clk) begin
    

    到:

    always @ (posedge clk or negedge reset) begin
    

    这摆脱了第一个xxx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多