关于xilinx中ddr3仿真出现tRFC maximum violation during No Op问题记录

1.问题描述

 在日常的FPGA开发中,ddr常用于对大量数据的存储,在对ddr的仿真过程中,常采用的是官方提供的ddr3_model.sv模块,简单方便。前段时间采用其进行仿真时,出现了app_rdy在进行短暂的读取数据后,一直置低,并且信息窗口报错如下在这里插入图片描述
在这里插入图片描述
 因为这个问题卡了我好多天,一直得不到解决,后面直接放下,转而去解决其他问题了,近来项目整合,不得不解决问题。于是乎到处问,最后得到一位南理工的同行指点,才算是解决了问题,特此记录在此,给后人排坑。

2.解决方案

 给MIG模块的输入信号app_sr_req置零,其在官方的说明如下在这里插入图片描述
 除了app_sr_req信号常会被忽略,还有app_ref_req和app_zq_req信号也常会被忽略,最好也给这两个信号置零
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
FPGA实现DDR3需要使用DDR3控制器IP核,并编写适当的代码进行配置和控制。以下是一个简单的FPGA实现DDR3的代码示例: 首先,需要定义DDR3控制器IP核的端口和信号,这些信号包括时钟信号、数据信号、控制信号等等。 ```verilog module DDR3_Controller( // Clock input clk, // Reset input rst_n, // DDR3 Ports // Address output reg [13:0] ddra, // Command/Control output reg [1:0] ddrcs_b, output reg [1:0] ddrcke, output reg [1:0] ddrwe_b, output reg [1:0] ddrctl, output reg [1:0] ddrclk_p, output reg [1:0] ddrclk_n, // Data inout [7:0] ddrdq, output reg [1:0] ddrdm, output reg [1:0] ddrdqsn, output reg [1:0] ddrdqsp ); ``` 然后,在代码需要对DDR3控制器进行配置,设置时序、延迟和其他参数。这些参数可以在IP核的设置进行配置,也可以直接在代码进行设置。 ```verilog // Timing Parameters parameter tCK = 2.5; // Clock Period parameter tRCD = 13; // RAS to CAS Delay parameter tRP = 13; // Row Precharge Time parameter tRAS = 35; // Row Active Time parameter tWR = 15; // Write Recovery Time parameter tWTR = 7; // Write to Read Delay parameter tRRD = 6; // Row to Row Delay parameter tFAW = 30; // Four Activate Window parameter tRFC = 160; // Refresh Cycle Time parameter tREFI = 7800; // Refresh Interval parameter tCKE = 4; // Clock Enable Delay parameter tXP = 3; // Exit Powerdown Time parameter tMRD = 4; // Mode Register Set Time ... // Configuration Registers reg [2:0] mode_reg[7:0]; reg [2:0] odt_reg[7:0]; reg [2:0] drive_reg[7:0]; reg [2:0] dq_reg[7:0]; ... // DDR3 Initialization initial begin // Configure Mode Registers mode_reg[0] = 8'h43; // MR0 mode_reg[1] = 8'h18; // MR1 mode_reg[2] = 8'h0; // MR2 mode_reg[3] = 8'h40; // MR3 // Configure ODT odt_reg[0] = 3'b001; // RZQ/4 odt_reg[1] = 3'b001; // RZQ/4 odt_reg[2] = 3'b000; // RZQ/6 odt_reg[3] = 3'b000; // RZQ/6 odt_reg[4] = 3'b000; // RZQ/6 odt_reg[5] = 3'b000; // RZQ/6 odt_reg[6] = 3'b000; // RZQ/6 odt_reg[7] = 3'b000; // RZQ/6 // Configure Drive Strength drive_reg[0] = 3'b010; // RZQ/4 drive_reg[1] = 3'b010; // RZQ/4 drive_reg[2] = 3'b010; // RZQ/4 drive_reg[3] = 3'b010; // RZQ/4 drive_reg[4] = 3'b010; // RZQ/4 drive_reg[5] = 3'b010; // RZQ/4 drive_reg[6] = 3'b010; // RZQ/4 drive_reg[7] = 3'b010; // RZQ/4 // Configure DQ Delay dq_reg[0] = 3'b000; // RZQ/4 dq_reg[1] = 3'b000; // RZQ/4 dq_reg[2] = 3'b000; // RZQ/4 dq_reg[3] = 3'b000; // RZQ/4 dq_reg[4] = 3'b000; // RZQ/4 dq_reg[5] = 3'b000; // RZQ/4 dq_reg[6] = 3'b000; // RZQ/4 dq_reg[7] = 3'b000; // RZQ/4 // Initialize DDR3 Controller ddr3_init( .clk(clk), .rst_n(rst_n), .ddra(ddra), .ddrcs_b(ddrcs_b), .ddrcke(ddrcke), .ddrwe_b(ddrwe_b), .ddrctl(ddrctl), .ddrclk_p(ddrclk_p), .ddrclk_n(ddrclk_n), .ddrdq(ddrdq), .ddrdm(ddrdm), .ddrdqsn(ddrdqsn), .ddrdqsp(ddrdqsp), .mode_reg(mode_reg), .odt_reg(odt_reg), .drive_reg(drive_reg), .dq_reg(dq_reg) ); // Configure DDR3 Parameters ddr3_config( .clk(clk), .rst_n(rst_n), .ddra(ddra), .ddrcs_b(ddrcs_b), .ddrcke(ddrcke), .ddrwe_b(ddrwe_b), .ddrctl(ddrctl), .ddrclk_p(ddrclk_p), .ddrclk_n(ddrclk_n), .ddrdq(ddrdq), .ddrdm(ddrdm), .ddrdqsn(ddrdqsn), .ddrdqsp(ddrdqsp), .tCK(tCK), .tRCD(tRCD), .tRP(tRP), .tRAS(tRAS), .tWR(tWR), .tWTR(tWTR), .tRRD(tRRD), .tFAW(tFAW), .tRFC(tRFC), .tREFI(tREFI), .tCKE(tCKE), .tXP(tXP), .tMRD(tMRD) ); end ``` 最后,在代码需要实现DDR3的读取和写入操作。这些操作需要遵循DDR3时序和延迟要求,以确保正确的数据传输。 ```verilog // DDR3 Read Operation always @(posedge clk) begin // Row Activate Command if (ddr_read_req && !ddr_read_active) begin ddrcs_b <= 2'b00; ddra <= ddr_read_addr[12:0]; ddrctl <= 2'b001; ddr_read_active <= 1; end // Column Read Command else if (ddr_read_active && ddrctl[1] && !ddr_read_col_done) begin ddra <= ddr_read_addr[8:0]; ddrctl <= 2'b101; ddr_read_col_done <= 1; end // Read Data else if (ddr_read_active && ddrctl[1] && ddr_read_col_done && !ddr_read_data_done) begin ddr_read_data <= ddrdq; ddrctl <= 2'b001; ddrcs_b <= 2'b11; ddr_read_active <= 0; ddr_read_col_done <= 0; ddr_read_data_done <= 1; end end // DDR3 Write Operation always @(posedge clk) begin // Row Activate Command if (ddr_write_req && !ddr_write_active) begin ddrcs_b <= 2'b00; ddra <= ddr_write_addr[12:0]; ddrctl <= 2'b011; ddr_write_active <= 1; end // Column Write Command else if (ddr_write_active && ddrctl[1] && !ddr_write_col_done) begin ddra <= ddr_write_addr[8:0]; ddrctl <= 2'b111; ddr_write_col_done <= 1; end // Write Data else if (ddr_write_active && ddrctl[1] && ddr_write_col_done) begin ddrdq <= ddr_write_data; ddrwe_b <= 2'b00; ddrctl <= 2'b011; ddrcs_b <= 2'b11; ddr_write_active <= 0; ddr_write_col_done <= 0; end end ``` 请注意,这只是一个简单的示例代码,实际的DDR3实现可能需要更多的控制信号和更复杂的代码来确保正确的数据传输和时序要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值