2020-10-09

秦韵FPGA 转载或原创(五)

GW FPGA DDR3 ip介绍(上)

  • ip生成介绍
  • ip信号介绍
  • ip driver 代码简单分析
  • 代码分享
  1. 打开高云云源软件,点击IP generate 选择DDR3 Memary PHY ,配置 : 主要选择时钟比例,支持1:2 和1:4 , 这里的设置与生成的输出clk,以及写入读出数据时钟有关,ddr3的时钟设置为400M,可选择533M。贴一个设置好的图片:(1) type 界面
    在这里插入图片描述(2) options 界面
    在这里插入图片描述(3) Timing 界面,暂时保持默认。点击ok ,就生成完成了。
  2. 贴一下IP的接口信号,接单的介绍一下。
    地址位宽[27:0] 数据位宽[127:0] ,支持突发模式,此时突发长度设置为64,由手册知,1:4 时钟比例下,突发长度为64,效率为90%。命令介绍:localparam write = 3’b000;
    localparam read = 3’b001;
    ddr3的刷新,包括ip自刷新和手动刷新,一般情况下,配置ip自刷新。
	DDR3_Memory_Interface_Top u_DDR3_Memory_Interface_Top (
		.clk(clk_i), //input clk
		.rst_n(rst_n_i), //input rst_n
		.app_burst_number(app_burst_number_i), //input [5:0] app_burst_number
		.cmd_ready(cmd_ready_o), //output cmd_ready
		.cmd(cmd_i), //input [2:0] cmd
		.cmd_en(cmd_en_i), //input cmd_en
		.addr(addr_i), //input [27:0] addr
		.wr_data_rdy(wr_data_rdy_o), //output wr_data_rdy
		.wr_data(wr_data_i), //input [127:0] wr_data
		.wr_data_en(wr_data_en_i), //input wr_data_en
		.wr_data_end(wr_data_end_i), //input wr_data_end
		.wr_data_mask(wr_data_mask_i), //input [15:0] wr_data_mask
		.rd_data(rd_data_o), //output [127:0] rd_data
		.rd_data_valid(rd_data_valid_o), //output rd_data_valid
		.rd_data_end(rd_data_end_o), //output rd_data_end
		.sr_req(sr_req_i), //input sr_req
		.ref_req(ref_req_i), //input ref_req
		.sr_ack(sr_ack_o), //output sr_ack
		.ref_ack(ref_ack_o), //output ref_ack
		.init_calib_complete(init_calib_complete_o), //output init_calib_complete
		.clk_out(clk_out_o), //output clk_out
		.ddr_rst(ddr_rst_o), //output ddr_rst
		.burst(burst_i), //input burst
		.O_ddr_addr(O_ddr_addr_o), //output [13:0] O_ddr_addr
		.O_ddr_ba(O_ddr_ba_o), //output [2:0] O_ddr_ba
		.O_ddr_cs_n(O_ddr_cs_n_o), //output O_ddr_cs_n
		.O_ddr_ras_n(O_ddr_ras_n_o), //output O_ddr_ras_n
		.O_ddr_cas_n(O_ddr_cas_n_o), //output O_ddr_cas_n
		.O_ddr_we_n(O_ddr_we_n_o), //output O_ddr_we_n
		.O_ddr_clk(O_ddr_clk_o), //output O_ddr_clk
		.O_ddr_clk_n(O_ddr_clk_n_o), //output O_ddr_clk_n
		.O_ddr_cke(O_ddr_cke_o), //output O_ddr_cke
		.O_ddr_odt(O_ddr_odt_o), //output O_ddr_odt
		.O_ddr_reset_n(O_ddr_reset_n_o), //output O_ddr_reset_n
		.O_ddr_dqm(O_ddr_dqm_o), //output [1:0] O_ddr_dqm
		.IO_ddr_dq(IO_ddr_dq_io), //inout [15:0] IO_ddr_dq
		.IO_ddr_dqs(IO_ddr_dqs_io), //inout [1:0] IO_ddr_dqs
		.IO_ddr_dqs_n(IO_ddr_dqs_n_io) //inout [1:0] IO_ddr_dqs_n
	);
  1. 简单介绍一下driver 部分的逻辑,对外的部分分成两部分,1)write :包括地址,数据,使能。
    2)read : 包括地址,数据,使能。 对iP部分的引脚,主要是为了对ip进行控制,因此直连到IP顶层。
module ddr3_driver
#(
    parameter ADDR_WIDTH = 28,
    parameter APP_DATA_WIDTH = 128,
    parameter APP_MASK_WIDTH = 16,
    parameter BURST_MODE = "8",
    parameter USER_REFRESH = "OFF"
)
(
	input 							clk,
	input 							rst,
	
	input 							init_calib_complete_o,
	input 							app_rdy, 
	input 							app_rd_data_valid,
	input 							wr_data_rdy,
    input [APP_DATA_WIDTH-1:0] 		app_rd_data,

    output reg 						app_en,
    output reg [2:0] 				app_cmd,
    output reg [ADDR_WIDTH-1:0] 	app_addr ,
    output reg [APP_DATA_WIDTH-1:0] app_wdf_data ,
    output reg 						app_wdf_wren,
    output reg 						app_wdf_end,
    output reg [APP_MASK_WIDTH-1:0] app_wdf_mask ,
    output reg 						app_burst,
    output reg 						sr_req,		//only wire
    output reg 						ref_req,	//only wire
    output [5:0] 					app_burst_number,

	input [17:0] 					wr_cdr_addr,
	input [127:0] 					wr_cdr_data,
	input 							wr_cdr_en,
	output 							wr_cdr_burst_end,

	input [17:0] 					rd_cdr_addr,
	input 							rd_cdr_en,
	output reg [127:0] 				rd_cdr_data,
	output 							rd_cdr_burst_end
);
  1. 贴一下driver部分代码,理解一下控制过程:主要完成对ip的控制,完成基本驱动,关于业务层的代码下篇讲解,主要包含8 channal 数据缓存,以及ddr3 内部逻辑的监测logic。
always@(posedge clk or posedge rst) begin
  	if(rst) begin
		app_en        <= 1'b0;
		app_cmd       <= 3'b000;
		app_wdf_wren  <= 1'b0;
		app_wdf_end   <= 1'b0;
		app_wdf_mask  <= {APP_MASK_WIDTH{1'b0}};
		app_burst     <= 1'b1;
		app_addr      <= {ADDR_WIDTH{1'b0}};
		app_wdf_data  <= {APP_DATA_WIDTH{1'b0}};
	end
	else if((app_rdy ) &&(wrBl_cnt == 'd1) && init_calib_complete) begin
		app_en        <= 1'b1;
		app_cmd       <= write ;
		app_wdf_wren  <= 1'b1;
		app_wdf_end   <= 1'b1;
		app_addr      <= reg_addr;
		app_wdf_mask  <= {APP_MASK_WIDTH{1'b0}};
		app_wdf_data  <= wr_cdr_data;       
		app_burst     <= 1'b1;
	end
    else if((app_rdy ) &&(wrBl_cnt >= 'd2)&&(wrBl_cnt <= app_burst_number + 1) && init_calib_complete && wr_data_rdy) begin
		app_en        <= 1'b0;
		app_cmd       <= write;
		app_wdf_wren  <= 1'b1;
		app_wdf_end   <= 1'b1;
		app_addr      <= 'd0;
		app_wdf_mask  <= {APP_MASK_WIDTH{1'b0}};
		app_wdf_data  <= wr_cdr_data;      
		app_burst     <= 1'b1;
	 end
	else if(app_rdy && rd_cdr_en_r   ) begin
		app_en        <= 1'b1;
		app_cmd       <= read;
		app_wdf_wren  <= 1'b0;
		app_wdf_end   <= 1'b0;
		app_wdf_mask  <= {APP_MASK_WIDTH{1'b0}};
		app_addr      <= reg_raddr;
		app_wdf_data  <= {APP_DATA_WIDTH{1'b0}};
    end
    else begin
		app_en        <= 1'b0;
		app_cmd       <= 3'b000;
		app_wdf_wren  <= 1'b0;
		app_wdf_end   <= 1'b0;
		app_wdf_mask  <= {APP_MASK_WIDTH{1'b0}};
		app_addr      <= 'd0;
		app_wdf_data  <= {APP_DATA_WIDTH{1'b0}};
	end
end
  1. 下篇介绍其他部分逻辑,及其框架。
  2. (这里主要在代码编写,驱动logic分析,以及框架图。如果对芯片原理,协议原理不清楚的推荐补习原理后,参照流程进行开发,后续会更新实际项目,及其项目中的问题简介,不会介绍过多的原理,会出一些关于高云的开发板,主要在18系列,可用于实际项目)。
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这是一个 SQL 语句,用于向借阅表中插入数据。该表包含以下字段:借阅编号、读者编号、书籍编号、借阅日期、归还日期、借阅状态。每条数据表示一次借阅记录。其中借阅编号、读者编号、书籍编号、借阅日期和借阅状态是必填项,归还日期为可选项,如果借阅状态为“已还”则必须填写归还日期。 具体插入的数据如下: - 借阅编号:100001,读者编号:123413,书籍编号:0001,借阅日期:2020-11-05,归还日期:NULL,借阅状态:借阅 - 借阅编号:100002,读者编号:223411,书籍编号:0002,借阅日期:2020-9-28,归还日期:2020-10-13,借阅状态:已还 - 借阅编号:100003,读者编号:321123,书籍编号:1001,借阅日期:2020-7-01,归还日期:NULL,借阅状态:过期 - 借阅编号:100004,读者编号:321124,书籍编号:2001,借阅日期:2020-10-09,归还日期:2020-10-14,借阅状态:已还 - 借阅编号:100005,读者编号:321124,书籍编号:0001,借阅日期:2020-10-15,归还日期:NULL,借阅状态:借阅 - 借阅编号:100006,读者编号:223411,书籍编号:2001,借阅日期:2020-10-16,归还日期:NULL,借阅状态:借阅 - 借阅编号:100007,读者编号:411111,书籍编号:1002,借阅日期:2020-9-01,归还日期:2020-9-24,借阅状态:已还 - 借阅编号:100008,读者编号:411111,书籍编号:0001,借阅日期:2020-9-25,归还日期:NULL,借阅状态:借阅 - 借阅编号:100009,读者编号:411111,书籍编号:1001,借阅日期:2020-10-08,归还日期:NULL,借阅状态:借阅

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值