【小梅哥FPGA进阶教程】串口发送图片数据到SRAM在TFT屏上显示

十五、串口发送图片数据到SRAM在TFT屏上显示

之前分享过rom存储图片数据在TFT屏上显示,该方法只能显示小点的图片,如果想显示TFT屏幕大小的图片上述方法rom内存大小不够。小梅哥给了个方案,利用串口将图片数据传给SRAM,传完后在从SRAM中读取图片数据进行显示。有了梅哥的提示后就开始动工了,首先是设计SRAM的控制程序。

SRAM(静态随机访问存储器)是一种半导体存储器。“静态”一词表明只要有电源供电,数据就会保存,而不会“动态”改变。

本实验平台是基于小梅哥出品的芯航线FPGA开发平台,该平台的SRAM芯片采用的是ISSI的IS61LV25616,它是一个256K*16位字长的高速率静态随机存取存储器。

通过查阅手册得知,除了地址总线和数据总线外,该芯片还包含五个控制信号(手册上的符号与这个有差别,手册是符号上一横线代表低电平有效)。

ce_n(芯片使能或芯片选择):禁止或使能芯片。

we_n(写使能):禁止或使能写操作。

oe_n(输出使能):禁止或使能输出。

lb_n(低字节使能):禁止或使能数据总线的低字节。

ub_n(高字节使能):禁止或使能数据总线的高字节。

所有这些信号都是低电平有效,后缀_n用于强调这一特性。功能表如表1所示:信号ce_n用于存储器扩展,信号we_n和oe_n用于写操作和读操作,lb_n和ub_n用于字节配置。

表1 SRAM控制信号的真值表

 

图片1图片2

接下来分析SRAM的读写时序图,两种类型的读操作时序如图1(a)和图1(b)所示

 

图片3

(a)地址控制的读周期时序图(ce_n=0,we_n=1,oe_n=0)

 

图片4

(b)oe_n控制的读周期时序图

图片5

(c)部分时序参数的介绍

图1 读操作的时序图和部分参数

本实验数据用的是16位,所以lb_n和ub_n控制位我们一直给低电平即可。关于ce_n控制位在复位后一直给低电平即可。

芯片手册上关于写操作时序有四种类型,这里就简单介绍其中一种,其他的类似,写操作时序如图2所示:

 

图片6

(a)写操作时序图

图片7

(b)部分时序参数的介绍

图2 读操作的时序图和部分参数

根据上面的读操作和写操作时序,结合小梅哥的芯航线开发平台,取读写周期为20ns,这样可以直接采用平台已有的50Mhz的时钟,根据上面的时间限制,在读操作时,可以在使能读操作后,采用在时钟上升沿时改变地址,这样在下个时钟上升沿到来时就可以读取该地址的数据,也就是数据相对与给的地址是有一个时钟周期的延时。在写操作时,同样也是在时钟的上升沿给地址和待写入的数据,这样可以满足参数的时间要求。

SRAM控制器的设计如下:

1   module sram_ctrl(
2       clk50M,
3       rst_n,
4       address,
5       chipselect_n,
6       read_n,
7       write_n,
8       byteenable_n,
9       writedata,
10      readdata,
11      
12      sram_addr,
13      sram_dq,
14      sram_ce_n, 
15      sram_oe_n, 
16      sram_we_n,
17      sram_lb_n,
18      sram_ub_n
19  );
20
21      input  clk50M;           //系统时钟,默认50M   
22      input  rst_n;            //异步复位,低电平有效
23      
24      input  [17:0] address;   //数据传输地址
25      input  chipselect_n;     //SRAM片选信号,低电平有效
26      input  read_n;           //数据读控制信号,低电平有效
27      input  write_n;          //数据写控制信号,低电平有效
28      input  [1:0]byteenable_n;//数据高低字节使能,低电平有效
29      input  [15:0]writedata;  //待写入RAM的数据
30      output [15:0]readdata;   //读RAM的数据
31      
32      output [17:0]sram_addr;  //操作RAM数据的地址
33      inout  [15:0]sram_dq;    //RAM的数据端口
34      output sram_ce_n;        //SRAM片选信号,低电平有效
35      output sram_oe_n;        //SRAM读数据控制信号,低电平有效
36      output sram_we_n;        //SRAM写数据控制信号,低电平有效
37      output sram_lb_n;        //数据低字节有效
38      output sram_ub_n;        //数据高字节有效
39
40      //signal declaration
41      reg [17:0]addr_reg;
42      reg [15:0]rdata_reg, wdata_reg;
43      reg ce_n_reg, lb_n_reg, ub_n_reg, oe_n_reg, we_n_reg;
44      
45      //body
46      //registers
47      always@(posedge clk50M or negedge rst_n)
48      begin
49          if(!rst_n)
50          begin
51              addr_reg <= 18'd0;
52              rdata_reg <= 16'd0;
53              wdata_reg <= 16'd0;
54              ce_n_reg <= 1'b1;
55              oe_n_reg <= 1'b1;
56              we_n_reg <= 1'b1;
57              lb_n_reg <= 1'b1;
58              ub_n_reg <= 1'b1;           
59          end 
60          else
61          begin
62              addr_reg <= address;
63              rdata_reg <= sram_dq;
64              wdata_reg <= writedata;
65              ce_n_reg <= chipselect_n;
66              oe_n_reg <= read_n;
67              we_n_reg <= write_n;
68              lb_n_reg <= byteenable_n[0];
69              ub_n_reg <= byteenable_n[1];        
70          end
71      end
72      
73      //to fpga interface
74      assign readdata = rdata_reg;
75      
76      //to SRAM
77      assign sram_addr = addr_reg;
78      assign sram_ce_n = ce_n_reg;
79      assign sram_oe_n = oe_n_reg;
80      assign sram_we_n = we_n_reg;
81      assign sram_ub_n = ub_n_reg;
82      assign sram_lb_n = lb_n_reg;
83      //SRAM tristate data bus
84      assign sram_dq = (~we_n_reg)?wdata_reg:16'bz;
85      
86  endmodule 

SRAM的数据线是输出输入数据共用的,要将其设计成三态门形式,具体如代码84行所示。接下就是编写tb文件来验证驱动程序,代码如下:

1   `timescale 1ns/1ns
2   `define PERIOD_CLK 20
3 
4   module sram_tb;
5       reg clk50M;
6       reg rst_n;
7       
8       reg [17:0]address;
9       reg read_n;
10      reg write_n;
11
12      reg [15:0]writedata;
13      wire [15:0]readdata;
14      
15      wire [17:0]sram_addr;
16      wire [15:0]sram_dq;
17      wire sram_ce_n; 
18      wire sram_oe_n; 
19      wire sram_we_n;
20      wire sram_lb_n;
21      wire sram_ub_n;
22      
23      integer i;
24
25      sram_ctrl sram_ctrl_u0( 
26          .clk50M(clk50M),
27          .rst_n(rst_n),
28          .address(address),
29          .chipselect_n(1'b0),
30          .read_n(read_n),
31          .write_n(write_n),
32          .byteenable_n(2'b00),
33          .writedata(writedata),
34          .readdata(readdata),
35          
36          .sram_addr(sram_addr),
37          .sram_dq(sram_dq),
38          .sram_ce_n(sram_ce_n), 
39          .sram_oe_n(sram_oe_n), 
40          .sram_we_n(sram_we_n),
41          .sram_lb_n(sram_lb_n),
42          .sram_ub_n(sram_ub_n)
43      );
44      
45      initial clk50M = 1'b1;
46      always #(`PERIOD_CLK/2) clk50M = ~clk50M;
47      
48      initial 
49      begin
  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
01 试看小梅哥fpga设计思想与验证方法视频:http://bbs.elecfans.com/jishu_484523_1_1.html 02 芯航线FPGA开发平台设计初衷:http://bbs.elecfans.com/jishu_514523_1_1.html 03 芯航线FPGA学习平台介绍:http://bbs.elecfans.com/jishu_514526_1_1.html 04 芯航线FPGA学习平台焊接记录:http://bbs.elecfans.com/jishu_514914_1_1.html 05 芯航线FPGA学习平台系统调试:http://bbs.elecfans.com/jishu_515169_1_1.html 06【连载视频教程(一)】科学的开发流程:http://bbs.elecfans.com/jishu_515340_1_1.html 07【连载视频教程(二)】3-8译码器设计验证:http://bbs.elecfans.com/jishu_515468_1_1.html 08【连载视频教程(三)】二进制计数器设计验证:http://bbs.elecfans.com/jishu_515476_1_1.html 09【连载视频教程(四)】高性能计数器IP核使用:http://bbs.elecfans.com/jishu_515714_1_1.html 10【连载视频教程(五)】BCD码计数器设计验证:http://bbs.elecfans.com/jishu_515893_1_1.html 11【连载视频教程(六)】例解阻塞赋值与非阻塞赋值:http://bbs.elecfans.com/jishu_516094_1_1.html 12【连载视频教程(七)】例说状态机:http://bbs.elecfans.com/jishu_516249_1_1.html 13【连载视频教程(八)】基于状态机的独立按键消抖:http://bbs.elecfans.com/jishu_516791_1_1.html 14【连载视频教程(九)】独立按键控制LED与亚稳态问题引入:http://bbs.elecfans.com/jishu_516795_1_1.html 15【连载视频教程(十)】数码管动态扫描设计与实现:http://bbs.elecfans.com/jishu_516979_1_1.html 16【连载视频教程(十一)】UART串口发送模块设计与验证:http://bbs.elecfans.com/jishu_516984_1_1.html 17【连载视频教程(十二)】UART串口接收模块设计与验证:http://bbs.elecfans.com/jishu_518308_1_1.html 18【芯航线FPGA学习平台众筹进度帖】芯航线FPGA开发板入手测试说明:http://bbs.elecfans.com/jishu_518301_1_1.html 19【芯航线FPGA学习平台众筹进度帖】芯航线FPGA学习套件配置文件固化教程 http://bbs.elecfans.com/jishu_518816_1_1.html 20【芯航线FPGA学习平台众筹进度帖】芯航线FPGA学习套件众筹回报已发放完毕,特公布运单号 http://bbs.elecfans.com/jishu_518819_1_1.html 21【芯航线FPGA学习平台众筹进度帖】芯航线FPGA学习套件众筹总结暨抽奖结果 http://bbs.elecfans.com/jishu_520454_1_1.html 22【芯航线FPGA学习平台众筹进度帖】【有奖活动】芯航线FPGA学习平台有奖活动第一季——看教程,秀笔记,赢好礼 http://bbs.elecfans.com/jishu_520463_1_1.html 23【连载视频教程(十三)】嵌入式块RAM应用之双口RAM:http://bbs.elecfans.com/jishu_520914_1_1.html 24【连载视频教程(十四)】搭建串口收发与存取双口RAM简易应用系统: http://bbs.elecfans.com/jishu_520915_1_1.html 25【连载视频教程(十五)】ROM的搭建与Signaltap II 工具使用:http://bbs.elecfans.com/jishu_522774_1_1.html 26【连载视频教程(十六)】FIFO介绍与时序验证:http://bbs.elecfans.com/jishu_522778_1_1.html 27【连载视频教程(十七)】使用PLL进行设计+Verilog参数化设计介绍: http://bbs.elecfans.com/jishu_524442_1_1.html 28【芯航线FPGA学习平台众筹进度帖】芯航线FPGA学习套件下载器驱动安装说明 http://bbs.elecfans.com/jishu_524793_1_1.html 29【芯航线FPGA学习平台众筹进度帖】Verilog语法基础讲解之参数化设计: http://bbs.elecfans.com/jishu_528770_1_1.html 30【连载视频教程(十八)】基于线性序列机设计思想的串行DAC(TLC5620)驱动: http://bbs.elecfans.com/jishu_533944_1_1.html 31【连载视频教程(十九)】基于线性序列机设计思想的串行ADC驱动: http://bbs.elecfans.com/jishu_537056_1_1.html

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值