47 lines
1.6 KiB
Verilog
47 lines
1.6 KiB
Verilog
`timescale 1ns / 1ps
|
||
|
||
module my_bram0 #(
|
||
parameter DATA_WIDTH = 32, // 数据位宽,默认 32 bit
|
||
parameter ADDR_WIDTH = 10 // 地址位宽 10 bit,对应深度 1024
|
||
)(
|
||
// ======== Port A (Write Only) ========
|
||
input wire clka,
|
||
input wire ena,
|
||
input wire wea,
|
||
input wire [ADDR_WIDTH-1:0] addra,
|
||
input wire [DATA_WIDTH-1:0] dina,
|
||
|
||
// ======== Port B (Read Only) ========
|
||
input wire clkb,
|
||
input wire enb,
|
||
input wire [ADDR_WIDTH-1:0] addrb,
|
||
output reg [DATA_WIDTH-1:0] doutb
|
||
);
|
||
|
||
// 声明二维数组作为存储介质
|
||
// 使用 (* ram_style = "block" *) 强制 Vivado 综合器将其映射为 BRAM 资源
|
||
(* ram_style = "block" *) reg [DATA_WIDTH-1:0] ram [0:(1<<ADDR_WIDTH)-1];
|
||
|
||
//-------------------------------------------------------
|
||
// Port A: 同步写入逻辑
|
||
//-------------------------------------------------------
|
||
always @(posedge clka) begin
|
||
// ena 是整个端口的使能,wea 是具体的写使能标志
|
||
// 在你的例化中 wea 恒为 1'b1,所以实际由 ena 控制写入
|
||
if (ena) begin
|
||
if (wea) begin
|
||
ram[addra] <= dina;
|
||
end
|
||
end
|
||
end
|
||
|
||
//-------------------------------------------------------
|
||
// Port B: 同步读出逻辑
|
||
//-------------------------------------------------------
|
||
always @(posedge clkb) begin
|
||
if (enb) begin
|
||
doutb <= ram[addrb];
|
||
end
|
||
end
|
||
|
||
endmodule |