名称:基于FPGA的EMIF总线时序设计Verilog代码ISE仿真
软件:ISE
语言:Verilog
代码功能:
读数据时,在 Lead period阶段,对应存储映射区片选信号nCSO1=0(低电平),地址信号A[14.0]有效,在Active period,读信号nRD=0读取数据总线D[15.0]上数据,在Trail period阶段,读信号nRD=1,地址信号A[14.0]保持有效,片选信号nCS01保持为低电平。其中SYSCLKOUT=120MHz。
写数据时,在 Lead period阶段,对应存储映射区片选信号nCSO1=0(低电平),地址信号A[14.0]有效;在 Active period,写信号nWE=0,数据总线D[15.0]上待写数据有效;在 Trail Period阶段,写信号nWE=1,片选信号nCSO1保持为低电平,地址信号A[14.0]保持有效,D[15.0数据写入寄存器。其中SYSCLKOUT=120MHz。
公共输入信号:
CLK10M:频率为10M的时钟信号。
nRST:异步复位信号,低电平有效。
nCS01:片选信号,低电平有效。
nWE:写信号,高电平有效。
nRD:读信号,低电平有效。
A[14.0]:地址信号
共输出信号:
D[15.0]:数据总线输出
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. Testbench
6. 仿真图
读过程,读的值存储在read_data
写过程
部分代码展示:
module?EMIF( input?clk_120M,//120MHz input?nRST,//异步复位,低电平有效 input?nCS01,//片选信号,低电平有效 input?nWE,//写信号,低电平有效 input?nRD,//读信号,低电平有效 input?[14:0]?A,//地址 inout?[15:0]?D//数据 ); wire?XTIMCLK; reg?XCLKOUT=1; assign?XTIMCLK=clk_120M;//输出120MHz always@(posedge?clk_120M?or?negedge?nRST) if(~nRST) XCLKOUT<=1; else XCLKOUT<=~XCLKOUT;//2分频 //读过程 //假设要读地址为15'b000000000000001,地址可以自行修改 reg?[15:0]?read_data=16'd0; reg?[3:0]?RD_cnt=4'd0; always@(posedge?clk_120M?or?negedge?nRST) if(~nRST) RD_cnt<=4'd0; else if(nCS01==0?&&?nRD==0)//CS低电平有效,读有效 RD_cnt<=RD_cnt+1; else RD_cnt<=4'd0; always@(posedge?clk_120M?or?negedge?nRST) if(~nRST) read_data<=16'd0; else//设读地址为15'b000000000000001,地址可以自行修改 if(RD_cnt==4'd3?&&?A==15'b000000000000001)//RD_cnt计数值为3时,去读D数据 read_data<=D; else read_data<=read_data;//否则保持 //写过程 reg?[15:0]?write_data;//写数据 //设要写地址为15'b000000000000010,地址可以自行修改,写数据为16'h01; always@(*) if(~nRST) write_data=16'd0; else if(nCS01==0?&&?nWE==0)//CS低电平有效,写有效 if(A==15'b000000000000010)//
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=835
862