当前位置:网站首页>05-SDRAM:仲裁
05-SDRAM:仲裁
2022-08-01 06:27:00 【刘颜儿】
SDRAM 仲裁
- state
- sdram_cmd_reg: 初始化、写操作、读操作、自刷新模块传来的指令,需要内部用sdram_cmd接收,
然后分别输出为sdram_cs_n、sdram_ras_n、sdram_cas_n、sdram_we_n - aref_en: 当前状态为仲裁状态ARBIT,且aref_req=1 (依赖ARBIT、aref_req)
- wr_en: 当前状态为仲裁状态ARBIT,且wr_req=1 (依赖ARBIT、wr_req)
- rd_en: 当前状态为仲裁状态ARBIT,且rd_req=1 (依赖ARBIT、rd_req)
设计文件
// SDRAM 仲裁
// 1. state
// 2. sdram_cmd_reg: 初始化、写操作、读操作、自刷新模块传来的指令,需要内部用sdram_cmd接收,
// 然后分别输出为sdram_cs_n、sdram_ras_n、sdram_cas_n、sdram_we_n
// 3. aref_en: 当前状态为仲裁状态ARBIT,且aref_req=1 (依赖ARBIT、aref_req)
// 4. wr_en: 当前状态为仲裁状态ARBIT,且wr_req=1 (依赖ARBIT、wr_req)
// 5. rd_en: 当前状态为仲裁状态ARBIT,且rd_req=1 (依赖ARBIT、rd_req)
module sdram_arbit(
input clk,
input rst_n,
input init_end,
input [3:0] init_cmd,//SDRAM命令,组成{CS#,RAS#,CAS#,WE#}
input [1:0] init_bank,//BANK地址,共4个BANK
input [12:0] init_addr,//SDRAM地址总线
input auto_ref_req,
input auto_ref_end,
input [3:0] auto_ref_cmd,//SDRAM命令,组成{CS#,RAS#,CAS#,WE#}
input [1:0] auto_ref_bank,//BANK地址,共4个BANK
input [12:0] auto_ref_addr,//SDRAM地址总线
input wr_req,
input wr_end,
input [3:0] write_cmd,
input [1:0] write_bank,
input [12:0] write_addr,
input wr_sdram_en,//三态门的判断条件
input [15:0] wr_sdram_data,//如果wr_sdram_en=1,那么sdram_dq为输出端口,将写操作的数据wr_sdram_data输出给SDRAM
input rd_req,
input rd_end,
input [3:0] read_cmd,
input [1:0] read_bank,
input [12:0] read_addr,
output aref_en,
output wr_en,
output rd_en,
output sdram_cke,
output sdram_cs_n,
output sdram_ras_n,
output sdram_cas_n,
output sdram_we_n,
output reg [1:0] sdram_bank,
output reg [12:0] sdram_addr,
output reg [15:0] sdram_dq
);
//==========================================parameter===========================================================
//状态机
localparam IDLE = 5'b0_0001 , //初始状态
ARBIT = 5'b0_0010 , //仲裁状态
ATREF = 5'b0_0100 , //自动刷新状态
WRITE = 5'b0_1000 , //写状态
READ = 5'b1_0000 ; //读状态
//命令指令参数
localparam NOP = 4'b0111 ; //空操作指令
//==========================================reg=================================================================
reg [2:0] state;
reg [2:0] next_state;
reg [3:0] sdram_cmd_reg;
//==========================================wire=================================================================
//==========================================assign=================================================================
assign sdram_cke = 1'd1;
assign sdram_cs_n = sdram_cmd_reg[3];
assign sdram_ras_n = sdram_cmd_reg[2];
assign sdram_cas_n = sdram_cmd_reg[1];
assign sdram_we_n = sdram_cmd_reg[0];
//assign {sdram_cs_n, sdram_ras_n, sdram_cas_n, sdram_we_n} = sdram_cmd; 还可以这样写
assign sdram_dq = (wr_sdram_en) ? wr_sdram_data:16'bz;
//==========================================always=================================================================
[email protected](posedge clk or negedge rst_n)begin
if(!rst_n )
aref_en <= 1'd0;
else if((state == ARBIT) && auto_ref_req)
aref_en <= 1'd1;
else if(auto_ref_end)
aref_en <= 1'd0;
else
aref_en <= aref_en;
end
[email protected](posedge clk or negedge rst_n)begin
if(!rst_n )
wr_en <= 1'd0;
else if((state == ARBIT) && wr_req && (!auto_ref_req))//优先级体现
wr_en <= 1'd1;
else if(wr_end)
wr_en <= 1'd0;
else
wr_en <= wr_en;
end
[email protected](posedge clk or negedge rst_n)begin
if(!rst_n )
rd_en <= 1'd0;
else if((state == ARBIT) && rd_req && (!auto_ref_req) && (!wr_req))//优先级体现
rd_en <= 1'd1;
else if(rd_end)
rd_en <= 1'd0;
else
rd_en <= rd_en;
end
//==========================================状态机=================================================================
// 第一段
[email protected](posedge clk or negedge rst_n)begin
if(!rst_n )begin
state <= IDLE;
end
else
state <= next_state;
end
//--状态机第二段:组合逻辑判断状态转移条件,描述状态转移规律以及输出
[email protected](*)begin
case(state)
IDLE:
if(init_end)
next_state = ARBIT;
else
next_state = IDLE;
ARBIT: //优先级:自动刷新-写操作-读操作
if(auto_ref_req)
next_state = ATREF;
else if(wr_req )
next_state = WRITE;
else if(rd_req)
next_state = READ;
else
next_state = ARBIT;
ATREF:
if(auto_ref_end)
next_state = ARBIT;
else
next_state = ATREF;
WRITE:
if(wr_end)
next_state = ARBIT;
else
next_state = WRITE;
READ:
if(rd_end)
next_state = ARBIT;
else
next_state = READ;
default:next_state = IDLE;
endcase
end
// 第三段
[email protected](*)begin
case(state)
IDLE:begin
sdram_cmd_reg <= 4'd0;
sdram_bank <= 2'd0;
sdram_addr <= 13'd0;
end
ATREF:begin
sdram_cmd_reg <= auto_ref_cmd;
sdram_bank <= auto_ref_bank;
sdram_addr <= auto_ref_addr;
end
WRITE:begin
sdram_cmd_reg <= write_cmd;
sdram_bank <= write_bank;
sdram_addr <= write_addr;
end
READ:begin
sdram_cmd_reg <= read_cmd;
sdram_bank <= read_bank;
sdram_addr <= read_addr;
end
default:begin
sdram_cmd_reg <= NOP;
sdram_bank <= 2'b11;
sdram_addr <= 13'h1fff;
end;
endcase
end
endmodule
边栏推荐
- 2022年牛客多校第四场补题
- 从购买服务器到网站搭建成功保姆级教程~超详细
- 从离线到实时对客,湖仓一体释放全量数据价值
- Selenium: Dropdown Box Actions
- first unique character in characters
- datagrip 报错 “The specified database userpassword combination is rejected...”的解决方法
- 深度比较两个对象是否相同
- 信息系统项目管理师必背核心考点(五十六)配置控制委员会(CCB)的工作
- What should I do if the neural network cannot be trained?
- 可视化全链路日志追踪
猜你喜欢
leetcode43 string multiplication
Robot growth in China
Srping bean in the life cycle
从零开始—仿牛客网讨论社区项目(一)
Using FiddlerScript caught poly FiddlerScript 】 【 download
JS的运行原理
About making a progress bar for software initialization for Qt
Guest brush SQL - 2
AspNet.WebApi.Owin custom Token request parameters
WebSocket实现聊天功能
随机推荐
WebSocket implements chat function
After the image is updated, Glide loading is still the original image problem
LeetCode Question of the Day (309. Best Time to Buy and Sell Stock with Cooldown)
小白的0基础教程SQL: 安装MYSQL 03
return; represents meaning
torch
Selenium: mouse, keyboard events
matplotlib pyplot
从底层结构开始学习FPGA(6)----分布式RAM(DRAM,Distributed RAM)
测试工具(四)Jenkins环境搭建与使用
Bean的生命周期
数据湖:数据同步工具NiFi
安装SQL Server详细教程
点餐系统数据库设计--SQL Server
目标检测概述-上篇
WPF项目-初步了解数据绑定 binding
Information system project managers must recite the work of the core test site (56) Configuration Control Board (CCB)
2022.7.26 Mock Competition
leetcode43 字符串相乘
Compare two objects are the same depth