2024-04-29 06:16:36 +00:00
|
|
|
module lineram #(
|
2024-04-30 05:29:41 +00:00
|
|
|
parameter DATA_WIDTH = 9,
|
|
|
|
parameter ADDR_WIDTH = 11
|
2024-04-29 06:16:36 +00:00
|
|
|
) (
|
|
|
|
input [DATA_WIDTH - 1:0] din,
|
|
|
|
input [ADDR_WIDTH - 1:0] addr_w,
|
|
|
|
output reg [DATA_WIDTH - 1:0] dout,
|
|
|
|
input [ADDR_WIDTH - 1:0] addr_r,
|
|
|
|
input write_en,
|
|
|
|
input read_clk,
|
|
|
|
input write_clk
|
|
|
|
);
|
|
|
|
|
2024-04-30 05:29:41 +00:00
|
|
|
// `ifdef YOSYS
|
|
|
|
// // use the ECP5 primitive.
|
|
|
|
// defparam ram.PORT_W_WR_EN_WIDTH = 1;
|
|
|
|
// $__ECP5_PDPW16KD_ ram (
|
|
|
|
// .PORT_R_CLK(read_clk),
|
|
|
|
// .PORT_R_ADDR(addr_r),
|
|
|
|
// .PORT_R_RD_DATA(dout),
|
|
|
|
// .PORT_W_CLK(write_clk),
|
|
|
|
// .PORT_W_WRITE_EN(write_en),
|
|
|
|
// .PORT_W_WR_DATA(din),
|
|
|
|
// );
|
|
|
|
// // PDPW16KD ram (
|
|
|
|
// // .DI0 (din[0]),
|
|
|
|
// // .DI1 (din[1]),
|
|
|
|
// // .DI2 (din[2]),
|
|
|
|
// // .DI3 (din[3]),
|
|
|
|
// // .DI4 (din[4]),
|
|
|
|
// // .DI5 (din[5]),
|
|
|
|
// // .DI6 (din[6]),
|
|
|
|
// // .DI7 (din[7]),
|
|
|
|
// // .DI8 (din[8]),
|
|
|
|
// // .DI9 (din[9]),
|
|
|
|
// // .DI10(din[10]),
|
|
|
|
// // .DI11(din[11]),
|
|
|
|
// // .DI12(din[12]),
|
|
|
|
// // .DI13(din[13]),
|
|
|
|
// // .DI14(din[14]),
|
|
|
|
// // .DI15(din[15]),
|
|
|
|
// // .DI16(din[16]),
|
|
|
|
// // .DI17(din[17]),
|
|
|
|
// // .DI18(din[18]),
|
|
|
|
// // .DI19(din[19]),
|
|
|
|
// // .DI20(din[20]),
|
|
|
|
// // .DI21(din[21]),
|
|
|
|
// // .DI22(din[22]),
|
|
|
|
// // .DI23(din[23]),
|
|
|
|
// // .DI24(din[24]),
|
|
|
|
// // .DI25(din[25]),
|
|
|
|
// // .DI26(din[26]),
|
|
|
|
// // .DI27(din[27]),
|
|
|
|
// // .DI28(din[28]),
|
|
|
|
// // .DI29(din[29]),
|
|
|
|
// // .DI30(din[30]),
|
|
|
|
// // .DI31(din[31]),
|
|
|
|
// // .DI32(din[32]),
|
|
|
|
// // .DI33(din[33]),
|
|
|
|
// // .DI34(din[34]),
|
|
|
|
// // .DI35(din[35]),
|
|
|
|
// // .ADW0(addr_w[0]),
|
|
|
|
// // .ADW1(addr_w[1]),
|
|
|
|
// // .ADW2(addr_w[2]),
|
|
|
|
// // .ADW3(addr_w[3]),
|
|
|
|
// // .ADW4(addr_w[4]),
|
|
|
|
// // .ADW5(addr_w[5]),
|
|
|
|
// // .ADW6(addr_w[6]),
|
|
|
|
// // .ADW7(addr_w[7]),
|
|
|
|
// // .ADW8(addr_w[8]),
|
|
|
|
// //
|
|
|
|
// // );
|
|
|
|
// `else
|
2024-04-29 06:16:36 +00:00
|
|
|
reg [DATA_WIDTH - 1] ram[2**ADDR_WIDTH];
|
|
|
|
|
|
|
|
initial begin
|
2024-04-30 05:29:41 +00:00
|
|
|
for (int i = 0; i < 2 ** ADDR_WIDTH; i = i + 1) begin
|
2024-04-29 06:16:36 +00:00
|
|
|
ram[i] = 0;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
always @(posedge write_clk) begin
|
|
|
|
if (write_en) ram[addr_w] <= din;
|
|
|
|
end
|
|
|
|
always @(posedge read_clk) begin
|
|
|
|
dout <= ram[addr_r];
|
|
|
|
end
|
2024-04-30 05:29:41 +00:00
|
|
|
// `endif
|
2024-04-29 06:16:36 +00:00
|
|
|
endmodule
|