首页 > 编程知识 正文

fpga设计实例(fpga硬件设计实例)

时间:2023-05-05 08:51:32 阅读:77171 作者:2514

mt 48 LC 128 m4a 232 Meg x4 x4 banks为512M SRAM,整体概要如下图所示

分别设计从通电到初始化、刷新、写入、读取4个部分,此外还包括主控状态机、顶级。

1 :电源接通初始化

整体架构:从控制器到控制芯片可分为20位bus总线、时钟线sdr_clk、数据总线DQ及DQM。 接通电源时主要配置总线总线的前4位,即sdr_cmd。 也就是说,这是第一步。 简单的是操作几次sdr_cmd。 其中,请注意逻辑设计时输出的sdr_clk时钟与控制器的时钟相差180。 实际上,如果不是这样的加装,就会根据有效的窗口进行调动。 通过由pll分频器2拍打稳定信号获得软复位soft_rst_n。

下图是与sdr_cmd命令功能相对应的数字。 如果您觉得打开电源阅读英文文档很无聊,请首先了解下图中的命令,而不是care。 例如,将命令INHIBIT (禁止) CS#、RAS#、CAS#、WE#设定为1xxx,进行以下3位的don’TC are。

下面的端子从CLK到DQ通过FPGA控制时使用。 关于各功能在右侧进行了说明。

下图是初始电源接通的时序图,电源接通过程设为Tp 2即可。 接通电源必须等待100us的供电和时钟稳定后再操作。 使用的时钟为100MHz,需要记住100us后发出下一个命令NOP,进行预充电,等待tRP时间后进行自动刷新。 后见下图。 tRP、Trfc、Tmrd和这些参数在文档中提供,并在以下设计文件中列出。 在该定时进行初始化的设计状态转移图可以是也可以不是。

头文件: head.v

//开关参数` define Trp2` definetrfc7` definetmrd2` definet 100u s 10000 ` definetwcd2` definetrcd2` defines L2 ` define cl 2 define nop4' b 0111 ` define act4' b 0011 ` definerd4' b 0101 ` define wr4' b 0100 ` define bt4 ' b0001 ` define lmr 4

` include ' head.v ' module init _ FSM (clk,init_en,local_wdata,local_rdata,local_write,local _ read ) inputinit_en; inputsoft_rst_n; input[31:0] local_wdata; output[31:0] local_rdata; 输入local_ready、local_write、local_ready; input[24:0] local_addr; inputlocal_rddatavalid; outputreg[12:0]sdr_a; outputreg[1:0]sdr_ba; outputreg[3:0]init_cmd; outputregsdr_cke; outputreginit_done; output[19:0]init_bus; reg[14:0]cnt; reg[2:0]state; 本地参数0=3' b000; 本地参数1=3' b001; 本地参数2=3' b010; 本地参数3=3' b011; 本地params4=3' b100; 本地参数5=3' b101; localparamidle=3'b110; assign init_bus={init_cmd,sdr_a,sdr_ba,sdr_cke}; Always@(Posedgeclk ) Beginif ) soft_rst_n==1'B0 ) beginsdr_a='d0; sdr_ba='d0; init_cmd=`INH; //inhabit禁止命令INH=4'b10008sdr_cke=1'b0; cnt='d0; init_done=1'b0; 状态=空闲; //idle=6嵌入式情况(state ) idle:if ) init_en==1'B0 ) state=idle; elsebegininit_done=1'b0; 状态=s0; ENDS0:if(CNT`t100us-1 ) begincnt=cnt 1'b1; 状态=s0; end else begincnt='d0; sdr_cke=1'b1; init_cmd=`NOP; //空操作` NOP=4'b0111 7state=s1; ends1 : begininit_cmd=`PRE; //预充电` PRE=4'b0010 2sdr_a[10]=1'b1; 状态=S2; ENDS2:if(CNT`Trp-1 )//tRP=2begincnt=cnt 1'b1; init_cmd=`NOP; //NOP=0111 7state=s2; end else begin cnt='d0; init_cmd=`REF; //REF=4'b0001 1 state=s3; ENDS3:if(CNT`trfc-1'B1 )/trfc=7beginCNT=CNT1'B1; init_cmd=`NOP; 状态=S3; endelsebegincnt='d0; init_cmd=`REF; //1state=s4; ENDS4:if(CNT`trfc-1 )/7BeginCNT=CNT1'B1; init_cmd=`NOP; end else begin cnt='d0; init_cmd=`LMR;//加载模式注册器SDR _ a=` op; 状态=S5; endS5:if(CNT`tmrd-1 )//tMRD=2begincnt=cnt 1'b1; init_cmd=`NOP; 状态=S5; end else begin cnt='d0; init_done=1'b1; 状态=空闲; endendcase endendmodule初始化的顶级文件只需实例化上面的模块以添加以下代码

always @ (posedgeclkorposedgeglobal _ reset ) /稳定的软复位信号if ) global_reset==1'B1 ) beginr0=1'b0; r1=1'b0; r2=1'b0; soft_rst_n=1'b0; endelse begin : delay _2clk r0=locked; r1=r0; r2=r1; soft_rst_n=r2; 结束

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。