Как я могу сделать модуль памяти, в котором ширина шины DATA
передается в качестве параметра для каждого экземпляра, и мой дизайн перенастраивается в соответствии с параметром? Например, предположим, что у меня есть память с байтовой адресацией, а ширина шины DATA-IN
составляет 32 бита (4 байта записываются в каждом цикле), а DATA-OUT
составляет 16 бит (2 байта считываются в каждом цикле). Для другого экземпляра DATA-IN
— 64 бита, а DATA-OUT
— 16 бит. Для всех таких случаев мой дизайн должен работать.
Я пробовал генерировать значения указателя записи в соответствии с параметрами проекта, например. DATA-IN
32 бита, указатель записи будет увеличиваться на 4 каждый цикл во время записи. Для 64-битных - приращение будет на 8 и так далее.
Проблема: как сделать так, чтобы 4 или 8 или 16 байт записывались за один цикл в соответствии с параметрами, переданными экземпляру?
//Something as following I want to implement. This memory instance can be considered as internal memory of FIFO having different datawidth for reading and writing in case you think of an application of such memory
module mem#(parameter DIN=16, parameter DOUT=8, parameter ADDR=4,parameter BYTE=8)
(
input [DIN-1:0] din,
output [DOUT-1:0] dout,
input wen,ren,clk
);
localparam DEPTH = (1<<ADDR);
reg [BYTE-1:0] mem [0:DEPTH-1];
reg wpointer=5'b00000;
reg rpointer=5'b00000;
reg [BYTE-1:0] tmp [0:DIN/BYTE-1];
function [ADDR:0] ptr;
input [4:0] index;
integer i;
begin
for(i=0;i<DIN/BYTE;i=i+1) begin
mem[index] = din[(BYTE*(i+1)-1):BYTE*(i)]; // something like this I want to implement, I know this line is not allowed in verilog, but is there any alternative to this?
index=index+1;
end
ptr=index;
end
endfunction
always @(posedge clk) begin
if(wen==1)
wpointer <= wptr(wpointer);
end
always @(posedge clk) begin
if(ren==1)
rpointer <= ptr(rpointer);
end
endmodule