1.如果两个双口ram数据位宽相同,则采用时钟快的ram等待时钟慢的ram来完成从一个ram中读取数据并存储到另一个ram中;例如从ram A中读取数据到ramB中,ram A的时钟为20M,而ram B的时钟为40M,可以重复读ram A来覆盖写ram B的方法,如果把ramB中的数据读取出写到ram A中,ram B需要等待ram A一个时钟后再改变地址。
2.如果两个双口ram数据位宽不同,可以通过移位或者拼凑位数来达到两个ram 之间的数据读写;例如,ram A的数据位宽为10,ram B的数据位宽为2,如果从A中读取数据写到B中,则ram A 每变动一次地址,需要有5个ram B的地址来接收数据,假如ram A B的读写时钟相同,则ram A 读取一个数据并写到ram B中至少需要5个时钟周期,考虑到ram读取的延时,对ram B 的地址addrB进行分析,一般初始化地址为0,0-4需要四次时钟累加,而4-9、9-14、......需要5次时钟累加,对于初始时第一次写入的5个时钟需要处理,方便做循环处理,可以通过延时或状态机来处理,使用6个时钟来读取1个位宽10的数据并写入到5个位宽为2的ram中。如下:A中100个数据写到B中500个地址中:
always@(posedge clk_high or negedge rst_n)
if(~rst_n)
main_state<=IDLE;
else
main_state<=next_state;
always@(posedge clk_high or negedge rst_n)
if(~rst_n)begin
q_a<=10'd0;
shift_r<=10'd0;
cnt<=4'd0;
rddr_a<=7'd0;
wddr_b<=14'd0;
next_state<=IDLE;
end
else
case (main_state)
IDLE: //0
if (start)
next_state <= READ;
else
next_state <= next_state;
READ:begin //1
shift_r<=q_a;
next_state<= wddr_b==14'd499 ? IDLE :SHIFT_W;
//地址补偿
wddr_b<= wddr_b==14'd0 ? wddr_b :(wddr_b==14'd499 ? wddr_b : wddr_b+1'b1);
end
SHIFT_W:begin //3
shift_r<={shift_r[9:8],shift_r[9:2]};
cnt <= cnt==7'd9 ? 0 :cnt +1'b1;
wddr_b<= wddr_b == 14'd499 ? wddr_b :(cnt == 7'd92 ? wddr_b : wddr_b+1'b1);
rddr_a<= cnt==7'd99 ?( rddr_a== 7'd99 ? rddr_a : rddr_a+1'b1):rddr_a;
next_state<= wddr_b==14'd499 ? IDLE : (cnt == 7'd9 ? READ : SHIFT_W);
end
endcase
assign wdatab=shift_r[1:0];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)