verilog 中的 4 位双向计数器

4 bit Bi-Directional counter in verilog

我的作业要求设计一个4位双向计数器,从0递增到12递增,达到12后,从12递减到0递增3次(0 2 4 6 8 10 12 9 6 3 0 2 4 ...)。直到程序被用户使用 "stop" 命令终止,这个循环应该继续 本项目将采用触发器设计,必须使用D触发器

这是我的verilog代码。当我创建 textbench 文件时出现错误:

module CounterTopLevel(
input clk,
 input rst,
input stop,
output [3:0] counter_out
);

//-----------Input Ports---------------
//input clk, stop;

//-----------Output Ports---------------
//output reg [3:0] counter_out;
//initial counter_out = 4'b0000;

//------------Internal Variables--------

 wire rst;
 wire stop;
 wire clk;
 wire [3:0] counter_out;
 wire q3;
 wire q2;
 wire q1;
 wire q0;
 wire d3;
 wire d2;
 wire d1;
 wire d0;

//D3=Q3Q0' + Q2Q1Q0 
//D2= Q2Q1' + Q2Q0' + Q2'Q1Q0 
//D1= Q3'Q1'Q0 + Q1Q0'
//D0= Q0' 

//Z3=Q2
//Z2= Q3Q0' + Q2'Q1 + Q1Q0'
//Z1= Q3 + Q2'Q0
//Z0= Q3Q0 + Q2Q1Q0
assign d3 =  (q3 & ~q0) | (q2 & q1 & q0);
assign d2 =  (q2 & ~q1) | (q2 & ~q0) | (~q2 & q1 & q0);
assign d1 =  (~q3 & ~q1 & q0) | (q1 & ~q0);
assign d0 =  ~q0;
assign counter_out[3] =  q2;
assign counter_out[2] =  (q3 & ~q0) | (~q2 & q1) | (q1 & ~q0);
assign counter_out[1] =  q3 | (~q2 & q0) | (~q1 & q0);
assign counter_out[0] = (q3 & q0) | (q2 & q1 & q0);

DFF DFF0 (
    .clk(clk),
     .rst(rst),
    .d(d0),
     .stop(stop),
    .q(q0)
    );

DFF DFF1 (
    .clk(clk),
    .rst(rst),   
    .d(d1), 
     .stop(stop),
    .q(q1)
    );

DFF DFF2 (
    .clk(clk),
     .rst(rst),
    .d(d2),
     .stop(stop),    
    .q(q2)
    );

DFF DFF3 (
    .clk(clk),
    .rst(rst),   
    .d(d3),
    .stop(stop),     
    .q(q3)
    );
endmodule

module DFF(
input clk,
 input rst,
input d,
 input stop,
output reg q
);

   always @(posedge clk) begin
    if (rst == 1'b1) begin
        q <= 1'b0;
    end
    else begin
        if (stop == 1'b1) begin
            q <= q;
        end
        else begin
            q <= d;
        end
    end
   end
endmodule

这是文本台:

module test2;

// Inputs
reg clk;
reg rst;
reg stop;

// Outputs
wire [3:0] counter_out;

// Instantiate the Unit Under Test (UUT)
CounterTopLevel uut (
    .clk(clk), 
    .rst(rst), 
    .stop(stop), 
    .counter_out(counter_out)
);

initial begin
    // Initialize Inputs
    clk = 0;
    rst = 0;
    stop = 0;
    // Wait 100 ns for global reset to finish
    #100;
    rst=1;
    #100;
    clk=1; ===> line 28
    #20;
    rst=0;
    clk=0;
    #20; ===>line 32
    clk=1;
    #20;
    clk=0;
    #20;
    clk=1;
    #20;
    clk=0;
    #20;
    clk=1;
    #20;
    clk=0;
    #20;
    clk=1;
    #20;
    clk=0;
    stop=1;
    #20;
    clk=1;
    #20;
    clk=0;
    #20;
    clk=1;
    stop=0;
    #20;
    clk=0;
    #20;
    clk=1;
    #20;
    clk=0;
    #20;
    clk=1;
    #20;
    clk=0;
    #20;
    clk=1;
    #20;
    clk=0;
    #20;
    clk=1;
    #20;
    clk=0;
    #20;
    clk=1;
    #20;
    clk=0;
    #20;
    clk=1;
    #20;
    clk=0;
    #20;
    clk=1;
    #20;
    clk=0;
    #20;

    // Add stimulus here

end

endmodule

它给出了这个错误:

ERROR:HDLCompiler:806 - "C:/Users/Ahmed Yasin/Desktop/exps/cift_yonlu_sayaci/test2.v" Line 28: Syntax error near ";".
ERROR:HDLCompiler:806 - "C:/Users/Ahmed Yasin/Desktop/exps/cift_yonlu_sayaci/test2.v" Line 32: Syntax error near "(".
ERROR:ProjectMgmt - 2 error(s) found while parsing design hierarchy.

我该如何解决?

我已经在 EDA Playground 上试过了。稍作改动后效果很好。

CounterTopLevel 我不得不删除 rststopclkcounter_out.

的重新声明

对于您的测试台时钟,您可能需要考虑以下方面的一些事情:

initial begin
  clk =0;
  forever begin
    #20 clk = ~clk;
  end
end

对于测试程序,您可以执行以下操作:

initial begin
  rst =0;
  stop=0;
  @(posedge clk);
  @(posedge clk);
  rst=1;
  repeat(10) 
    @(posedge clk);  //Wait ten clock edges until setting stop
  stop=1;
end