OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6643|回复: 0

【开源骚客】《轻松设计SDRAM控制器》第八讲—命令解析模块讲解

[复制链接]

17

主题

23

帖子

1

精华

高级会员

Rank: 4

积分
614
金钱
614
注册时间
2016-1-16
在线时间
18 小时
发表于 2017-5-10 13:33:30 | 显示全部楼层 |阅读模式
到第七讲,我们就已经把SDRAM控制器的部分全部都完成了。

虽然SDRAM控制器的部分完成好了,但是咱们的项目还没完,我们还需要将串口部分和控制器部分联合起来,形成一个可以通过串口发送命令控制SDRAM读写的完整项目。

在第三讲中,我们已经完成了串口的收发功能。在本讲中,我们先来对串口发送过来的命令和数据进行解析和分离。

在搞定读模块之后,就相当于SDRAM控制器部分已经搭建好了,想一想还是很期待的哦,哈哈,大家先别急。在这一讲中,我们就来完成读模块,然后对这个SDRAM控制器稍加完善就可以应用到项目中了。

本讲主要内容如下:
  • 命令解析模块的作用详细介绍;
  • 命令解析模块时序设计;
  • 命令解析模块代码编写及仿真验证。
一、命令解析模块的作用详细介绍我们先回顾下在第一讲中所介绍到的项目整体框架图:

命令解析模块是将串口和SDRAM控制器联系在一起的一个桥梁,它会根据串口接收到的读/写命令产生相应的读/写命令控制(触发信号),并且也会从数据包中提取待写入到SDRAM中的数据。
二、命令解析模块时序设计
对于这种时序图,相信大家跟着Kevin的视频早就掌握了看的方法,在此就不做介绍了,也给大家留下学习的空间。
三、命令解析模块代码编写及仿真验证对于代码,Kevin还是一贯的作风,不会轻易贴出代码的,但是这个命令解析模块的功能还是相对比较简单的,为了让大家能把自己的代码和Kevin的代码进行对比,Kevin还是找了很多扯淡的理由(内心十分煎熬啊)去说服自己把代码贴出来。
  • module  cmd_decode(
  •         // system signals
  •         input                    sclk                     ,
  •         input                    s_rst_n                  ,
  •         // From UART_RX module
  •         input                    uart_flag                ,
  •         input           [ 7:0]  uart_data                ,
  •         // Others
  •         output  wire             wr_trig                  ,
  •         output  wire             rd_trig                  ,
  •         output  wire             wfifo_wr_en             ,
  •         output  wire    [ 7:0]  wfifo_data              
  • );
  • //====================================================================\
  • // ********** Define Parameter and Internal Signals *************
  • //====================================================================/
  • localparam      REC_NUM_END     =       'd4                     ;
  • reg     [ 2:0]                  rec_num                         ;
  • reg     [ 7:0]                  cmd_reg                         ;
  • //==========================================================================
  • // ***************      Main    Code    ****************
  • //==========================================================================
  • always  @(posedge sclk or negedge s_rst_n) begin
  •         if(s_rst_n == 1'b0)
  •                 rec_num <=      'd0;
  •         else if(uart_flag == 1'b1 && rec_num == 'd0 && uart_data == 8'haa)
  •                 rec_num <=      'd0;
  •         else if(uart_flag == 1'b1 && rec_num == REC_NUM_END)
  •                 rec_num <=      'd0;
  •         else if(uart_flag == 1'b1)
  •                 rec_num <=      rec_num + 1'b1;
  • end
  • always  @(posedge sclk or negedge s_rst_n) begin
  •         if(s_rst_n == 1'b0)
  •                 cmd_reg <=      8'h00;
  •         else if(rec_num == 'd0 && uart_flag == 1'b1)
  •                 cmd_reg <= uart_data;
  • end
  • assign  wr_trig = (rec_num == REC_NUM_END && cmd_reg == 8'h55) ? uart_flag : 1'b0;
  • assign  rd_trig = (rec_num == 'd0 && uart_data == 8'haa) ? uart_flag : 1'b0;
  • assign  wfifo_wr_en = (rec_num >= 'd1) ? uart_flag : 1'b0;
  • assign  wfifo_data      =       uart_data;
  • endmodule

个人FPGA博客:http://dengkanwen.com  欢迎批评指导
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-7-3 03:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表