并行输入并行输出寄存器

Parallel In Parallel Out Register

PIPO 模块实现了并行输入并行输出寄存器。它接收这些输入 (clk,reset,pipo_in,load) 和输出 (pipo_out).

如果复位信号为高电平,pipo_out = 0。

如果负载信号为高电平,则输出任何新的pipo_in。

但是,如果负载信号不高,那么pipo_out应该显示之前的输出值。现在我正在做的是 pipo_out = 0;

可以做些什么改动,让负载信号不高的时候,pipo_out应该显示之前的输出值。

module PIPO (clk,reset,pipo_in,load,pipo_out);

input clk;
input reset;
input [3:0] pipo_in;
input load;
output reg [3:0] pipo_out;


always @(posedge clk) 
begin
    if (reset) 
    begin
        pipo_out = 4'b0000;
    end
    else if (load)
    begin
        pipo_out = pipo_in;
    end
    else begin
        pipo_out = 4'b0000;
    end
end

endmodule

这是测试台:

`include "PIPO.v"

module PIPO_tb;

    reg clk;
    reg reset;
    reg  [3:0]pipo_in;
    reg load;
    wire [3:0]pipo_out;
    
    PIPO iPIPO (.*);   

    initial begin
    clk=0;
    forever
    #5 clk= ~clk;
    end 
    
    initial begin
        $monitor("Reset=%b Input=%b, load=%b output=%b",reset,pipo_in,load,pipo_out);
        $dumpfile("PIPO_tb.vcd");
        $dumpvars(0, PIPO_tb);

       
        reset=0; pipo_in =4'b1001;load=1;#10;
        reset=0; pipo_in =4'b1011;load=1;#10;
        reset=0; pipo_in =4'b1101;load=1;#10;
        reset=0; pipo_in =4'b0001;load=0;#10;
        reset=0; pipo_in =4'b1111;load=1;#10;
        reset=0; pipo_in =4'b1010;load=1;#10;

        

        #200;
        $finish;
    end
endmodule

要保留先前加载的值,只需删除 else 子句:

always @(posedge clk)
begin
    if (reset)
    begin
        pipo_out <= 4'b0000;
    end
    else if (load)
    begin
        pipo_out <= pipo_in;
    end
end

对于顺序逻辑,您应该使用非阻塞 (<=) 赋值。