OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 942|回复: 1

[XILINX] 达芬奇pro RMA IP核试验 读数据始终为0

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2023-9-26
在线时间
1 小时
发表于 2023-11-29 10:09:11 | 显示全部楼层 |阅读模式
1金钱
按照视频内容学习,结果在线抓取信号 读到数据全为0,其他信号正常

module IP_RAM1(
input sys_clk,
input sys_rst_n
    );
wire           ram_en     ;    //RAM使能  
wire           ram_w_r    ;    //RAM读写控制,高电平对RAM写操作(读写计数器r_w_cnt0-31),低电平对RAM读操作(读写计数器r_w_cnt32-63)
wire [4:0]     ram_addr   ;    //RAM地址
wire [7:0]     ram_wr_data;    //
wire [7:0]     ram_rd_data;    //使用wire型变量表示在顶层为例化的RAM核之间与RAM_WR之间进行传递

  ////// RAM_IP核////////  
blk_mem_gen_0 u_blk_mem_gen_0 (
  .clka(sys_clk),                // input wire clka
  .rsta(sys_rst_n),            // input wire rsta
  .ena(ram_en),                 // input wire ena
  .wea(ram_w_r),                // input wire [0 : 0] wea
  .addra(ram_addr),             // input wire [4 : 0] addra
  .dina(ram_wr_data),           // input wire [7 : 0] dina
  .douta(ram_rd_data)       // output wire [7 : 0] douta
  //.rsta_busy()                  // output wire rsta_busy RMA忙指示信号 该实验不需要可以把这行删掉
);   
//////////RAM_WR 驱动模块的例化 ///////////////
IP_RAM1_WR u_IP_RAM1_WR(
.sys_clk      (sys_clk) ,  
.sys_rst_n    (sys_rst_n) ,  
//下面的变量参数需要和RAM--IP核进行连接,因此需要在top模块里 定义wire数据      
.ram_en       (ram_en) ,
.ram_w_r      (ram_w_r) ,  
.ram_addr     (ram_addr) ,
.ram_wr_data  (ram_wr_data) ,
.ram_rd_data  (ram_rd_data)
);
endmodule


module IP_RAM1_WR(
input sys_clk,
input sys_rst_n,
input  [7:0]    ram_rd_data  ,  // 输入引脚, 用于从RAM中读出数据的寄存器,input通常为wire型
output ram_en                ,  // 输出引脚, 用于驱动RAM的 使能,
output ram_w_r               ,  // 输出引脚,用于驱动RAM的读写控制, 为1时控制 写RAM,为0时控制读RAM。
output reg [4:0] ram_addr    ,  // 输出引脚,用于驱动RAM的地址选择,RAM-IP核地址设置读写深度为32,即可寻址范围为0-31,用5位向量可覆盖全部地址
output reg [7:0] ram_wr_data   // 输出引脚, 用于往RAM中写数据的寄存器,RAM-IP核读写的数据设置为8bit,因此读写数据为8bit.
    );

reg  [5:0] r_w_cnt;            //定义读和写 控制 的计数器
assign  ram_en= sys_rst_n;     //不复位时,就控制使能RAM  
assign  ram_w_r=((ram_en==1)&&(r_w_cnt<=31))?1'b1:1'b0;  //用于驱动RAM的读写,判断条件是读写控制计数器r_w_cnt<32

    //第一个计数器 用于控制读写计数器的增加设置
   // 计数器cnt 从0-31表示用来读写控制的 写,32-63 表示用来进行 读
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)  
        r_w_cnt<=1'b0;
    else if (r_w_cnt==6'd63)  // 计数器cnt 计到63后清零,没到的话继续+1
              r_w_cnt<=1'b0;                           
         else  
             r_w_cnt<=r_w_cnt+1'b1;            
end

//第二个 计数器用于产生往RAM中写的数据,这里造了0-31的数据
always @(posedge sys_clk or negedge sys_rst_n) begin  
      if(!sys_rst_n)  
         ram_wr_data<=6'b0; //复位时,往RAM中写数据的寄存器清零,
      else if(r_w_cnt<=6'd31)
             ram_wr_data<=ram_wr_data+1'b1;
           else
             ram_wr_data<=6'b0;
end   

//第三个 计数器用于地址寄存器的控制  
  always @(posedge sys_clk or negedge sys_rst_n) begin  
      if(!sys_rst_n)
        ram_addr<=0;
        else  if( ram_addr==6'd31)
                  ram_addr<=0;
              else
                  ram_addr<=ram_addr+1'b1;
   end   

///// //ILA 模块监控///////////
ila_0 your_instance_name (
        .clk(sys_clk), // input wire clk


        .probe0(sys_rst_n), // input wire [0:0]  probe0  
        .probe1(ram_en), // input wire [0:0]  probe1
        .probe2(ram_w_r), // input wire [0:0]  probe2
        .probe3(ram_addr), // input wire [4:0]  probe3
        .probe4(ram_wr_data), // input wire [7:0]  probe4
        .probe5(ram_rd_data), // input wire [7:0]  probe5ram_read_data
        .probe6(r_w_cnt) // input wire [5:0]  probe6
);

endmodule


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2013

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5617
金钱
5617
注册时间
2018-10-21
在线时间
1591 小时
发表于 2023-11-29 13:11:19 | 显示全部楼层
例化RAM的复位信号,要取个反
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表