设置乒乓转换信号pi_pa;
片0的读信号rd0和写信号wr0,
片1的读信号rd1和写信号wr1;
片0的读地址指针addr0_rd和写地址指针addr0_wr,
片1的读地址指针addr1_rd和写地址指针addr1_wr;
片0的读结束信号rd0_over,
片1的读结束信号rd1_over。
//以下实现乒乓模式转换
always @(negedge clkin or negedge rst)
begin
if (!rst) pi_pa <= 0;
else
begin
if (wr0 == 0 && addr0_wr == ADDRLEN) pi_pa <= ~pi_pa;
//当SRAM 0写完最后一个单元后,转换
if (wr1 == 0 && addr1_wr == ADDRLEN) pi_pa <= ~pi_pa;
//当SRAM 1写完最后一个单元后,转换
end
end
//以下实现两片SRAM读写的互锁功能
assign rd0 = pi_pa; //when rd0==0, read sram 0
assign wr1 = pi_pa; //when wr1==0, write sram 1
assign rd1 = ~pi_pa; //when rd1==0, read sram 1
assign wr0 = ~pi_pa; //when wr0==0, write sram 0
//对SRAM 0的控制
assign oe[0] = slwr || rd0; //当片0位于读模式时,slwr控制片0的读
assign we[0] = clkin || wr0; //当片0位于写模式时,clkin控制片0的读
assign srmaddr0 = rd0? addr0_wr: addr0_rd;
assign srmdata0 = wr0? 16'hzzzz: {indata+1,indata};
//当片0位于读模式时,片0的地址线赋读指针,数据线赋高阻
//当片0位于写模式时,片0的地址线赋写指针,数据线赋生成数据
//对SRAM 1的控制
assign oe[1] = slwr || rd1;
assign we[1] = clkin || wr1;
assign srmaddr1 = rd1? addr1_wr: addr1_rd;
assign srmdata1 = wr1? 16'hzzzz: {indata+10,indata};
//SRAM的读结束信号
always @(negedge slwr or negedge rst)
begin
if (!rst)
begin
rd0_over <= 1;
rd1_over <= 1;
end
else
begin
if (addr0_rd == ADDRLEN) rd0_over <= 0;
else if (wr0 == 0) rd0_over <= 1;
//读完SRAM 0的最后一个单元后,片0的读结束信号置为无效,终止片0的读过程,等待SRAM 1的写过程结束,再置片0的读结束信号为有效,从而不至于影响下一次片0的读
if (addr1_rd == ADDRLEN) rd1_over <= 0;
else if (wr1 == 0) rd1_over <= 1;
end
end
//SRAM的读指针操作,即读完一个单元后指向下一单元
always @(negedge slwr or negedge rst)
begin
if (!rst)
begin
addr0_rd <= 0;
addr1_rd <= 0;
end
else
begin
if (rd0 == 0 && rd0_over == 1)
begin
addr0_rd <= addr0_rd + 1;
end
if (rd1 == 0 && rd1_over == 1)
begin
addr1_rd <= addr1_rd + 1;
end
end
end
//SRAM的写指针操作,即写完一个单元后指向下一单元
always @(negedge clkin or negedge rst)
begin
if (!rst)
begin
addr0_wr <= 0;
addr1_wr <= 0;
end
else
begin
if (wr0 == 0)
begin
addr0_wr <= addr0_wr + 1;
end
if (wr1 == 0)
begin
addr1_wr <= addr1_wr + 1;
end
end
end