想要实现以下功能:
一个RAM宽度为8,深度为22680。其中前7560存放宽度为4,深度为7560的数据。让RAM的高4位或者低4位为0。剩下15120存放宽度为8,深度为15120的数据。这两个数据来自不同的模块。简单画图描述为如下:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2020/06/15 08:53:20
// Design Name:
// Module Name: inputbuffer
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module SPAD_buffer(
input clk, //时钟
input asy_rst_n, //内码译码器复位信号,低电平有效
input i_en, //内码译码器使能信号,高电平有效
input i_rdy_SPAD, //SPAD输出标志
input i_SPAD_out, //SPAD输出的0/1数字信号
input [12:0] i_r_addr, //RAM1 PORTB读地址
output [3:0] o_r_data, //RAM1 PORTB读数据
output o_rdy1 //RAM1 PORTB ready
);
//-----------------------------------------------------------
wire [3:0] w_data; //RAM PORTA写数据
reg p0,p1,p2,p3;
reg wea; //RAM PORTA写使能
wire ena;
wire enb;
reg o_rdy1_reg;
reg [2:0] cnt_4;
reg [12:0] cnt_7560;
//assign w_data=wea?w_data_reg:4'dz;
assign w_data=(cnt_4==3'd4)?{p3,p2,p1,p0}:4'dz;
assign ena=wea||i_rdy_SPAD;
assign enb=o_rdy1;
always @(posedge clk )
begin
if(asy_rst_n)
begin
wea<=1'b0;
end
else wea<=i_rdy_SPAD;
end
always @(posedge clk )
begin
if(asy_rst_n)
begin
cnt_4<=3'd0;
cnt_7560<=13'd0;
p3<=1'b0;
p2<=1'b0;
p1<=1'b0;
p0<=1'b0;
o_rdy1_reg<=1'b0;
end
else
begin
if(ena)
begin
cnt_4<=cnt_4+3'd1;
p0<=i_SPAD_out;
p1<=p0;
p2<=p1;
p3<=p2;
if(cnt_4==3'd4)
begin
cnt_4<=3'd1;
cnt_7560<=cnt_7560+13'd1;
end
end
else if(cnt_7560==13'd7560)
begin
cnt_4<=3'd0;
cnt_7560<=13'd0;
o_rdy1_reg<=1'b1;
p2<=1'b0;
p1<=1'b0;
p0<=1'b0;
p3<=1'b0;
end
else if(!i_en)
begin
cnt_4<=3'd0;
cnt_7560<=13'd0;
o_rdy1_reg<=1'b0;
p2<=1'b0;
p1<=1'b0;
p0<=1'b0;
p3<=1'b0;
end
end
end
assign o_rdy1=o_rdy1_reg;
blk_mem_gen_spadbuffer RAM1 (
.clka(clk), // input wire clka
.ena(ena), // input wire ena
.wea(wea), // input wire [0 : 0] wea
.addra(cnt_7560), // input wire [12 : 0] addra
.dina(w_data), // input wire [3 : 0] dina
.clkb(clk), // input wire clkb
.enb(enb), // input wire ena
.addrb(i_r_addr), // input wire [12 : 0] addrb
.doutb(o_r_data) // output wire [3 : 0] doutb
);
endmodule
暂无
见图片表示
题主你想表达的是不是,一个数据位宽为14bit的ram,8个一组读写(一组数据位宽为14*8=112bit),共22680组。其中0——7559组,高4一直是0,低4为有效数据;7560-22679,8个都是有效数据;0——7559组与7560-22679数据来源不一样。
楼上的答主提出了一到个比较好的方案,把这个大ram分开访问,更简单有效,且释放了低7660组内没有用到的储存空间。
一个ram直接4个一组读写,一个ram8个一组读写,就可以了。
可以试试从地址入手使得这一个大RAM分为两个所需要的RAM。