vivado IP核调用了一个位数为32位,深度为7的伪双口RAM,请问各位怎么把7个不同时序读出的7个32位数据组合输出成一个234位的数据并输出
不考虑重置、寄存器x态传递的情况下提供一种思路,也可以使用状态机实现,更容易思考
整体思路是ram的数据是顺序输出的情况下,需要读7拍将ram的数据全部取出,每次取出需要赋值给输出的不同位宽。
reg [2:0] raddr;//addr read addr
reg [223:0] dout;//data out
reg [7:0] width_32;
wire [31:0] ram_dout;//ram读取的数据
wire read_flag;//允许读的指示位(高电平指示),需要你前面的RTL指定好,什么时候7个数据已经存好了,允许读取
wire ram_dout_valid;//ram读数据有效指示位,这里假设ram读数据只延迟一个clk,所以对read_flag打一拍
wire dout_valid;//指示拼接好的数据有效,这里指示位只持续了一个时钟
always @(posedge clk) begin
ram_dout_valid <= read_flag;
end
always @(posedge clk) begin
if (read_flag) begin
raddr <= raddr + 1'd1;
end else begin
raddr <= 3'd0;
end
end
always @(posedge clk) begin
if (ram_dout_valid) begin
width_32 <= width_32 + 5'd32;
end else begin
width_32 <= 8'd0;
end
end
always @(posedge clk) begin
if (ram_dout_valid) begin
dout[wdith_32 + 5'd31: width_32] <= ram_dout;
end
end
always @(posedge clk) begin
if (ram_dout_valid && !read_flag) begin
dout_valid <= 1'd1;
end
end
伪双口RAM有两个端口(A和B端口),但是A端口只能进行写入操作,不能进行读出操作,而B端口则只能进行读出操作,不能进行写入操作。
vivado 的读写数据宽度可以不同,可以是2.4.6.8倍。
就是说 写32位,读可以是 8x32=256位。但不能7x32=234位。
如果非要用234位,可以用一个2维可压缩数组。由于只实现伪双口,很容易就能实现