FPGA设计——DDR2 (Altera)

  1. DDR2 IP系统框图

2. IP参数设置

1) 时钟设置

PLL reference clock freqency是参考输入时钟,一般由外部晶振或外部PLL输出提供

Memory clock freqency是DDR时钟,一般CYCLONE IV最快只能支持200M,根据不同的型号和BANK而不同

Controller data rate有Full和Half模式,选择Half模式后,Local interface width会增加一倍

2)选择Memory Presets

根据电路中DDR2的型号选择对应的presets,这里只重点介绍Full rate下地址的设置。

在Full rate下:

local_address is 25 bits wide

local_address[23:11] = row address[13:0]

local_address[10:9] = bank address  [1:0]

local_address [8:0] = column address [9:1]

local data宽度是总线data宽度的两倍,所以IP核忽略了column的最低位

3) 设置local参数

Local-to-Memory Address Mapping: 设置地址映射,需要和上面的地址映射说明一致

Local Maximum Burst Count:设置成32,提高读写效率

3. 例化IP核

ddr2_64bit ddr2_64bit_inst (
				.local_address(local_address),
				.local_write_req(local_write_req),
				.local_read_req(local_read_req),
				.local_burstbegin(local_burstbegin),
				.local_wdata(local_wdata),
				.local_be(16‘hffff),
				.local_size(BURST_LEN),
				.global_reset_n(rst_n),
				.pll_ref_clk(ref_clk),
				.soft_reset_n(rst_n),
				.local_ready(local_ready),
				.local_rdata(local_rdata),
				.local_rdata_valid(local_rdata_valid),
				.local_refresh_ack(),
				.local_init_done(local_init_done),
				.reset_phy_clk_n(),
				.phy_clk(phy_clk),
				.aux_full_rate_clk(),
				.aux_half_rate_clk(),
				.reset_request_n(),
				.mem_odt(mem_odt),
				.mem_cs_n(mem_cs_n),
				.mem_cke(mem_cke),
				.mem_addr(mem_addr),
				.mem_ba(mem_ba),
				.mem_ras_n(mem_ras_n),
				.mem_cas_n(mem_cas_n),
				.mem_we_n(mem_we_n),
				.mem_dm(mem_dm),
				.mem_clk(mem_clk),
				.mem_clk_n(mem_clk_n),
				.mem_dq(mem_dq),
				.mem_dqs(mem_dqs)
	);

4. 设计读写测试模块

//-----------ddr2 read and write operation---------
reg   [25 :0]     local_address;
reg               local_burstbegin;
reg               local_read_req;
reg               local_write_req;
reg   [127 :0]    local_wdata;

reg [2:0] local_state;
reg [7:0] local_cnt;
reg [127:0] local_readdata;

parameter IDLE			 = 0,
			 IDLE0 		 = 1,
			 BURST_WRITE = 2,
			 IDLE1		 = 3,
			 BURST_READ	 = 4,
			 END		 = 5;		 
			 
always @(posedge phy_clk)
	if(~rst_n)
	begin
		local_state <= IDLE0;
		local_cnt	<= 0;
	end
	else
		case(local_state)
		IDLE:
		begin
			if(local_init_done & local_ready)
				local_state <= IDLE0;
			else
				local_state <= IDLE;
			local_burstbegin <= 1‘b0;
			local_write_req  <= 1‘b0;
			local_cnt		  <= 0;
			local_wdata		  <= 128‘h0;
			local_address	  <= 26‘d32;
		end
		IDLE0:
		begin
			if(local_init_done & local_ready)
				local_state <= BURST_WRITE;
			else
				local_state <= IDLE0;
			local_burstbegin <= 1‘b0;
			local_write_req  <= 1‘b0;
			local_cnt		  <= local_cnt;
			local_wdata		  <= local_wdata;
			local_address	  <= local_address;
		end
		BURST_WRITE:
		begin
			if(local_cnt<=0)
				local_burstbegin <= 1‘b1;
			else
				local_burstbegin <= 1‘b0;

			local_write_req  <= 1‘b1;
			local_wdata      <= local_wdata + 1;
			local_read_req	  <= 1‘b0;
			local_address	  <= 26‘d32;

			if(local_cnt>=(BURST_LEN-1))
			begin
				local_state <= IDLE1;
				local_cnt <= 0;
			end
			else
			begin
				local_state <= BURST_WRITE;
				local_cnt <= local_cnt + 1‘b1;
			end
		end
		IDLE1:
		begin
			if(local_init_done & local_ready)
				local_state <= BURST_READ;
			else
				local_state <= IDLE1;
			local_burstbegin <= 1‘b0;
			local_write_req  <= 1‘b0;
			local_cnt		  <= local_cnt;
			local_address	  <= 26‘h0;
		end
		BURST_READ:
		begin
			local_burstbegin <= 1‘b1;
			local_write_req  <= 1‘b0;
			local_read_req	  <= 1‘b1;
			local_cnt		  <= local_cnt;
			local_state		  <= END;
			local_address	  <= 26‘d32;
		end
		END:
		begin
			local_burstbegin <= 0;
			local_write_req  <= 0;
			local_read_req   <= 0;
			local_address	  <= 0;

			if(local_cnt>=8‘h7f)
			begin
					local_state <= IDLE;
					local_cnt   <= 0;
			end
			else
			begin
					local_state <= END;
					local_cnt <= local_cnt + 1‘b1;
			end

			if(local_rdata_valid)
				local_readdata <= local_rdata;
			else
				local_readdata <= 0;

		end
		default: 
		begin
			local_burstbegin <= 1‘b0;
			local_write_req  <= 1‘b0;
			local_read_req	  <= 1‘b0;
			local_cnt		  <= 0;
			local_state		  <= IDLE0;
			local_address	  <= 26‘h0;
		end
		endcase

5.测试结果

时间: 2024-11-08 18:52:20

FPGA设计——DDR2 (Altera)的相关文章

FPGA设计——VGA (Altera)

1. VGA概述 VGA(Video Graphics Array)是IBM在1987年推出的一种视频传输,具有分辨率高.显示速率快.颜色丰富等优点,在彩色显示器领域得到了广泛的应用.不支持热插拔,不支持音频传输. 2. VGA时序 下面以640*[email protected]为例说明VGA时序和FPGA设计,其他分辨率和帧率的可参考VESA中查找. 计算像素时钟pclk = 800*525*60 = 25200000,注意这里的HSYNC和VSYNC都是低电平有效,且HSYNC在数据行无效

【小梅哥FPGA进阶学习之旅】基于Altera FPGA 的DDR2+千兆以太网电路设计

DDR2电路设计 在高速大数据的应用中,高速大容量缓存是必不可少的硬件.当前在FPGA系统中使用较为广泛的高速大容量存储器有经典速度较低的单数据速率的SDRAM存储器,以及速度较高的双速率DDR.DDR2.DDR3型SDRAM存储器,DDR系列的存储器都需要FPGA芯片有对应的硬件电路结构支持.对于Altera Cyclone IV系列的FPGA,其最高支持到DDR2存储器(不支持DDR3存储器,到了Cyclone V系列的FPGA才支持DDR3存储器).芯航线AC6102开发板作为一个高速应用

FPGA设计经验谈

从大学时代第一次接触FPGA至今已有10多年的时间.至今记得当初第一次在EDA实验平台上完成数字秒表,抢答器,密码锁等实验时,那个兴奋劲.当时由于没有接触到HDL硬件描述语言,设计都是在MAX+plus II原理图环境下用74系列逻辑器件搭建起来的.后来读研究生,工作陆陆续续也用过Quartus II,Foundation,ISE,Libero,并且学习了verilogHDL语言,学习的过程中也慢慢体会到verilog的妙用,原来一小段语言就能完成复杂的原理图设计,而且语言的移植性可操作性比原理

FPGA设计流程

FPGA设计人体分为设计输入.综合.功能仿真(前仿真).实现.时序仿真(后仿真).配置下载等六个步骤,设计流程如图2所示.下面分别介绍各个设计步骤. 1 设计输入 设计输入包括使用硬件描述语言HDL.状态图与原理图输入三种方式.HDL设计方式是现今设计大规模数字集成电路的良好形式,除IEEE标准中VHDL与Verilog HDL两种形式外,尚有各自FPGA厂家推出的专用语言,如Quartus下的AHDL.HDL语言描述在状态机.控制逻辑.总线功能方面较强,使其描述的电路能特定综合器(如Synop

转载--关于FPGA设计数字信号处理电路的心得

FPGA使用的越来越广泛,除了可用于设计控制电路以为,数字信号处理电路更是FPGA的强项和难点.个人可以说才刚刚入门FPGA设计,也做过一些数字信号处理方面的电路设计,记录下个人心得体会. (一)善用MATLAB来为设计做充分的准备和验证. 在学习EDA课程的时候,我们往往都是按照要求,直接打开QuartusII,噼里啪啦开始疯狂敲代码,然后仿真--不对--再改再仿真--还不对--再改直到仿真结果正确为止.不错,这的确是人们先入为主的一种方法.但这只是我们学习HDL语言,学习使用开发工具时候比较

影响FPGA设计中时钟因素的探讨【转】

Crazy Bingo Learn to walk first before you want to run- 影响FPGA设计中时钟因素的探讨 http://www.fpga.com.cn/advance/skill/speed.htm http://www.fpga.com.cn/advance/skill/design_skill3.htm 时钟是整个电路最重要.最特殊的信号,系统内大部分器件的动作都是在时钟的跳变沿上进行, 这就要求时钟信号时延差要非常小, 否则就可能造成时序逻辑状态出错

【转】 FPGA设计的四种常用思想与技巧

本文讨论的四种常用FPGA/CPLD设计思想与技巧:乒乓操作.串并转换.流水线操作.数据接口同步化,都是FPGA/CPLD逻辑设计的内在规律的体现,合理地采用这些设计思想能在FPGA/CPLD设计工作种取得事半功倍的效果. FPGA/CPLD的设计思想与技巧是一个非常大的话题,由于篇幅所限,本文仅介绍一些常用的设计思想与技巧,包括乒乓球操作.串并转换.流水线操作和数据接口的同步方法.希望本文能引起工程师们的注意,如果能有意识地利用这些原则指导日后的设计工作,将取得事半功倍的效果! 乒乓操作“乒乓

08-FPGA状态机设计实例——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线--普利斯队长精心奉献 ? 实验目的:1.学习状态机的相关概念 2.理解一段式.两段式以及三段式状态机的区别以及优缺点 实验平台:芯航线FPGA核心板 实验原理: 状态机全称是有限状态机(finite-state machine,缩写:FSM)是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型. 状态机分为摩尔(Moore)型有限状态机与米利(Mealy)型有限状态机.摩尔状态机输出是只由输入确定的有限状态机(不直接依赖于当前状态).米利有限状态机的输出不止与其输入有关还于它的

FPGA 设计如何进行面积优化(逻辑资源占用量优化)

FPGA面积优化 1 对于速度要求不是很高的情况下,我们可以把流水线设计成迭代的形式,从而重复利用FPGA功能相同的资源. 2 对于控制逻辑小于共享逻辑时,控制逻辑资源可以用来复用,例如FIR滤波器的实现过程中,乘法器是一个共享的资源,我们可以通过控制资源实现状态机,从而复用乘法器,当然这样也牺牲了面积. 3 对于具有类似计数单元的模块,可以采用全局的计数器,以减小面积.例如模块A需要256的循环计数,模块B需要1000的循环计数,那么我们就可以设计一个全局计数器,计数器位数为10,前八位供模块