江湖人称纪博大 2022-02-17 14:38 采纳率: 87.5%
浏览 91
已结题

Verilog如何实现同一个RAM中存放不同的数据?

问题遇到的现象和发生背景

想要实现以下功能:
一个RAM宽度为8,深度为22680。其中前7560存放宽度为4,深度为7560的数据。让RAM的高4位或者低4位为0。剩下15120存放宽度为8,深度为15120的数据。这两个数据来自不同的模块。简单画图描述为如下:

img


目前想在已有的代码基础上更改,已有代码是存放4个宽度,深度为7560的RAM。

问题相关代码,请勿粘贴截图
`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


运行结果及报错内容

暂无

我的解答思路和尝试过的方法

见图片表示

我想要达到的结果

img

  • 写回答

2条回答 默认 最新

  • xuxiulive 2022-02-18 10:18
    关注

    img


    图文看得我有点疑惑,ram的数据位宽明显是14位啊,8位最大数值只能到255。

    题主你想表达的是不是,一个数据位宽为14bit的ram,8个一组读写(一组数据位宽为14*8=112bit),共22680组。其中0——7559组,高4一直是0,低4为有效数据;7560-22679,8个都是有效数据;0——7559组与7560-22679数据来源不一样。

    楼上的答主提出了一到个比较好的方案,把这个大ram分开访问,更简单有效,且释放了低7660组内没有用到的储存空间。
    一个ram直接4个一组读写,一个ram8个一组读写,就可以了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月29日
  • 已采纳回答 10月21日
  • 创建了问题 2月17日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵