ROM(Read Only Memory)

RAM(Random Access Memory)

FIFO(First In First Out) = 선입 선출

my_ram.v

`timescale 1ns / 1ps

module my_ram(
    input RST,
    input CLK,
    input [3:0] ADDR,
    input [7:0] DIN,
    output reg [7:0] DOUT,
    input RW
    );
    
reg [7:0] mem [0:15];

always @ (posedge CLK) begin
        if (RST)
                DOUT <= 8'd0;                           // if reset is on, output is 0.
        else
                DOUT <= mem[ADDR];            // if reset is off, output is address
end
always @ (posedge CLK) begin
        if (RW == 1'b1)
                DOUT <= 8'd0;
end

//always @ (negedge RW) begin
//        DOUT <= 8'd0;
//        wait (mem[ADDR] == DIN);
//end

always @ (posedge CLK) begin
        if (RW == 1'b0)
                mem[ADDR] <= DIN;
end

 
endmodule

 

my_ram_tb.v

`timescale 1ns / 1ps

module my_ram_tb();
parameter CLK_PD = 8.0;
reg rst, clk, rw;
reg [3:0] addr;
reg [7:0] din;
wire [7:0] dout;
integer i;

my_ram uut0(
.RST    (rst),
.CLK    (clk),
.ADDR   (addr),
.DIN    (din),
.DOUT   (dout),
.RW     (rw)
    );

initial begin
    rst = 1'b1;
    #(CLK_PD*10);
    rst = 1'b0;
end

initial clk = 1'b0;
always #(CLK_PD/2) clk = ~clk;

initial begin
        addr = 4'd0;
        din = 8'd0;
        rw = 1'b1;
        wait (rst == 1'b0);
        #(CLK_PD * 20);
        rw = 1'b0;
        for (i = 0; i < 16; i = i +1) begin
                addr = i;
                din = i;
                #(CLK_PD);
        end
        #(CLK_PD * 20);
        rw = 1'b1;
        for (i = 0; i < 16; i = i +1) begin
                addr = i;
                #(CLK_PD);
        end
        
        #1000;
        $finish;
end

endmodule

'Circuit Design > 🔥HDL' 카테고리의 다른 글

[Verilog] 11. UART(2)  (0) 2024.06.03
[Verilog] 10. FIFO(First In First Out)  (0) 2024.06.03
[Verilog] 8. Uart  (0) 2024.05.27
[Verilog] 7. 교통신호기 FSM  (0) 2024.04.29
[Verilog] 6.FSM Security  (0) 2024.04.29