Как построить счетчик в Verilog - PullRequest
0 голосов
/ 03 января 2019

У меня проблема с дизайном счетчика. Я пытаюсь реализовать MIPS с одним циклом с Verilog, поэтому я пытаюсь реализовать счетчик программ.

Мне просто нужна основная идея о том, как построить счетчик и проверить его. Я новичок в Verilog, поэтому я не знаю, где я ошибся.


Это мой counter.v:

module PC (Clk, CLR, Q); 
   input Clk, CLR; 
   output [31:0] Q; 
   reg    [31:0] tmp; 

   always @(posedge Clk or posedge CLR) 
        begin 
        if (CLR) 
            tmp = 4'b0000; 
        else  
            tmp = tmp + 1'b1; 
        end
    assign Q = tmp; 
endmodule  

А это мой тестовый файл:

define DELAY 20
module PC_testbench ();
reg clk  ;
reg clr ;
wire [31:0] q;
PC exec ( clk , clr , q );

initial clk = 0;
initial clr = 0;

initial begin 

clk=~clk;

#`DELAY; 

clk=~clk;

#`DELAY; 

clk=~clk;

#`DELAY; 

clk=~clk;



end 

initial begin
$monitor("clk = %b pc_next = %b  ",clk , q );
end 


endmodule 

Я получил 32 х в качестве результата. Есть идеи?

Это мой результат:

# clk = 1 pc_next = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  
# clk = 0 pc_next = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  
# clk = 1 pc_next = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  
# clk = 0 pc_next = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  

1 Ответ

0 голосов
/ 03 января 2019

Ваша проблема в том, что счетчик tmp изначально равен 32'bx, и ему нужно видеть нарастающий фронт CLR или быть 1 во время нарастающего фронта Clk, прежде чем его сбросить на 32'b0.

...