仲裁模块
1.信号优先级:自动刷新 > 写操作> 读操作
ARBIT:if(aref_req == 1'b1) //注意语句的判断顺序
state <= AREF;
else if(wr_req == 1'b1)
state <= WRITE;
else if(rd_req == 1'b1)
state <= READ;
else
state <= ARBIT;
2.使能信号的有始有终
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
aref_en <= 1'b0;
else if((state == ARBIT) && (aref_req == 1'b1)) //收到请求信号,拉高使能信号
aref_en <= 1'b1;
else if(aref_end == 1'b1) //收到操作结束信号,拉低使能信号
aref_en <= 1'b0;
3.使能信号中的优先级体现
//aref_en:自动刷新使能
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
aref_en <= 1'b0;
else if((state == ARBIT) && (aref_req == 1'b1))
aref_en <= 1'b1;
else if(aref_end == 1'b1)
aref_en <= 1'b0;
//wr_en:写数据使能
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
wr_en <= 1'b0;
else if((state == ARBIT) && (aref_req == 1'b0) && (wr_req == 1'b1)) //体现“自动刷新”最高级属性
wr_en <= 1'b1;
else if(wr_end == 1'b1)
wr_en <= 1'b0;
//rd_en:读数据使能
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
rd_en <= 1'b0;
else if((state == ARBIT) && (aref_req == 1'b0) && (rd_req == 1'b1))//体现“自动刷新”最高级属性
rd_en <= 1'b1;
else if(rd_end == 1'b1)
rd_en <= 1'b0;
4.数据总线
//SDRAM数据总线
assign sdram_dq = (wr_sdram_en == 1'b1) ? wr_data : 16'bz; //重点理解!!!!!
拼接赋值
//片选信号,行地址选通信号,列地址选通信号,写使能信号
assign {sdram_cs_n, sdram_ras_n, sdram_cas_n, sdram_we_n} = sdram_cmd;