技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 213|回复: 18
收起左侧

【FPGA】我的FPGA学习小结:用FPGA控制SDRAM,并通过VGA控制显示屏

[复制链接]

1053

主题

2413

帖子

6万

积分

用户组: 管理员

一只技术宅

UID
1
精华
220
威望
327 点
宅币
19225 个
贡献
39815 次
宅之契约
0 份
在线时间
1819 小时
注册时间
2014-1-26
发表于 2020-5-23 22:04:42 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
FPGA介绍

FPGA是一种能够运行硬件描述语言的设备。硬件描述语言是用来描述硬件行为的语言,集成电路芯片的设计,就是通过编写硬件描述语言来实现。但FPGA设备可以把硬件描述语言当成软件来运行,并具备一定的硬件性能。因此我们可以认为FPGA是实际投产生产真正的硬件芯片之前,用来帮助硬件工程师学习硬件原理,并测试硬件设计合理性的工具。

FPGA的功能实现,主要是靠它内部的大量(其实也才十几万个,连1MB的东西都存不下)的逻辑单元来实现。每个逻辑单元有多个输入(比如我的“
大风四
”,是四个输入),一个查表器,一个D触发器和一个1bit输出构成。查表器负责实现多个输入的任意逻辑运算——比如四路输入的16个逻辑结果,它都是用查表的方式得出来的。D触发器相当于一个1bit寄存器,能存储一个状态。D触发器寄存的状态通向这个逻辑单元的输出

然后,FPGA内部使用可编程内部连线来连接每一个逻辑单元,以及FPGA的可编程IO(引脚)等。给FPGA编程,相当于设计它的每个逻辑单元的查找表,以及内部连线的连接方式。整个FPGA内部的电路连接,靠它的RAM来控制其开关的开闭。

FPGA芯片的内部不仅仅是由以上的东西构成,它还有一些辅助性的外设,比如PLL锁相环、块内存、高速乘除法器等。如果没有这些外设,光靠FPGA自己的门电路阵列去实现这些功能,一方面,并不是所有的功能都可以靠逻辑门来实现,比如PLL锁相环。另一方面,像乘除法器、块内存等,如果用逻辑门阵列来实现,我们会需要消耗大量的逻辑门,但实际上FPGA内部的逻辑门数量是有限的。所以针对FPGA的硬件描述语言的设计,与实际针对ASIC芯片的设计,还是会有相当大的差异

上文提到的PLL锁相环是用于定制时钟频率的。举个例子,比如我有个 50 MHz 的时钟,我们可以把这个时钟输入给PLL,并设置PLL将这个频率提高 8 倍,再降低 3 倍,我们就可以得到约为 133.333333 MHz 频率的时钟,而这个时钟频率正好是我所使用的SDRAM芯片的工作频率。

那我们是不是可以使用PLL来生成频率很高的时钟呢?能是能,但要考虑到信号从一个逻辑门到达另一个逻辑门是有延时的(FPGA的PDF里会描述这个延时的具体数值),而且逻辑门本身的逻辑运算也是需要消耗时间的。当你把PLL输出的时钟频率调得过高,并在硬件描述语言里,使用这个时钟作为你的芯片的各种行为运行的工作时钟,那么这些语句是否都能在下一个周期到来前完成运行就无法得到保证,从而出现执行错误,导致芯片无法工作。但,我们可以优化我们的芯片逻辑设计,包括使用流水线方式提前执行一些耗时的语句,给硬件的运行留出时间;以及减少逻辑判断的层数,用寄存器来暂存复杂逻辑判断的结果,然后判断寄存器的数值等。

但FPGA的逻辑门本身的物理工作频率也有上限。我所使用的FPGA芯片是“
大风四
”的EP4CE6E22C8N,各路大佬都说“这玩意儿顶多跑到200 MHz,再高它就不行了”。虽然经过我的实测,我写了个UART模块,能让它在450 MHz的工作频率下,以45MHz的波特率进行正常工作(更高的我还没测过)。450MHz的工作频率,45MHz的波特率,相当于每10个周期发送1个bit,每个bit的Duty Cycle为50%。但我要是让它每9个周期或者每11个周期发送一个bit,它发出去的数据就有概率被对方读错,比如发送0xAA的时候有概率收到0xB5等。

SDRAM介绍

SDRAM就是我们所说的“内存”了。它是动态内存,数据要经过不断的刷新才能保留。一旦停止了刷新,它就会丢失数据。SDRAM比静态内存更廉价,但是控制起来麻烦得多。现在大家使用的DDR内存,它的前身就是SDRAM内存。

我的SDRAM模块是HY57V561620FTP-H,它长这个样子:

SDRAM模块HY57V561620FTP-H

SDRAM模块HY57V561620FTP-H


安装到我的FPGA板子上后,是这个样子的:

FPGA开发板

FPGA开发板


它的PDF在这里:
HY57V561620FTP-H_datasheet.pdf (735.66 KB, 下载次数: 0, 售价: 1 个宅币)

评分

参与人数 2威望 +10 宅币 +60 贡献 +15 收起 理由
bakaE子没人理 + 30 + 5 赞!很棒的介绍和实现方式
watermelon + 10 + 30 + 10 赞!可以说是下了相当多功夫了。.

查看全部评分

回复

使用道具 举报

1053

主题

2413

帖子

6万

积分

用户组: 管理员

一只技术宅

UID
1
精华
220
威望
327 点
宅币
19225 个
贡献
39815 次
宅之契约
0 份
在线时间
1819 小时
注册时间
2014-1-26
 楼主| 发表于 2020-5-23 22:28:26 | 显示全部楼层
帖子更新:使用了代码高亮。我差点忘了论坛还有pre代码高亮功能

0

主题

2

帖子

24

积分

用户组: 初·技术宅

UID
5429
精华
0
威望
1 点
宅币
20 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2019-12-8
发表于 2020-5-23 23:55:21 | 显示全部楼层
好厉害~
回复

使用道具 举报

1053

主题

2413

帖子

6万

积分

用户组: 管理员

一只技术宅

UID
1
精华
220
威望
327 点
宅币
19225 个
贡献
39815 次
宅之契约
0 份
在线时间
1819 小时
注册时间
2014-1-26
 楼主| 发表于 2020-5-24 01:31:14 | 显示全部楼层

谢谢你

28

主题

173

帖子

1971

积分

用户组: 版主

UID
1821
精华
6
威望
67 点
宅币
1530 个
贡献
104 次
宅之契约
0 份
在线时间
328 小时
注册时间
2016-7-12
发表于 2020-5-24 12:18:41 | 显示全部楼层
本帖最后由 Ayala 于 2020-5-24 12:45 编辑

单片机时钟这个问题 以前在群里和一个自以为是的学生争吵过,这个东西利用定点数或者分数校正下 计算出秒晶振数就好了一般2位小数点就够用了 或者使用最小公倍数
或者单独用一个准确的晶振

1053

主题

2413

帖子

6万

积分

用户组: 管理员

一只技术宅

UID
1
精华
220
威望
327 点
宅币
19225 个
贡献
39815 次
宅之契约
0 份
在线时间
1819 小时
注册时间
2014-1-26
 楼主| 发表于 2020-5-24 13:33:36 | 显示全部楼层
Ayala 发表于 2020-5-24 12:18
单片机时钟这个问题 以前在群里和一个自以为是的学生争吵过,这个东西利用定点数或者分数校正下 计算出秒晶 ...


这边用了插入一些时钟的办法解决的,而且精确到了小数后5位

顺带一提我也记得那家伙

28

主题

173

帖子

1971

积分

用户组: 版主

UID
1821
精华
6
威望
67 点
宅币
1530 个
贡献
104 次
宅之契约
0 份
在线时间
328 小时
注册时间
2016-7-12
发表于 2020-5-24 14:18:03 | 显示全部楼层
0xAA55 发表于 2020-5-24 13:33
这边用了插入一些时钟的办法解决的,而且精确到了小数后5位

顺带一提我也记得那家伙 ...

秒级的小数点5位 还是毫秒级的小数5位 一般来说毫秒级的小数2位就够了 如果为了方便计算使用4舍6入 5取偶的方式就足够精确了 运行开始的时候校准下10秒的晶振数然后取精度就好了

1053

主题

2413

帖子

6万

积分

用户组: 管理员

一只技术宅

UID
1
精华
220
威望
327 点
宅币
19225 个
贡献
39815 次
宅之契约
0 份
在线时间
1819 小时
注册时间
2014-1-26
 楼主| 发表于 2020-5-24 14:23:52 | 显示全部楼层
Ayala 发表于 2020-5-24 14:18
秒级的小数点5位 还是毫秒级的小数5位 一般来说毫秒级的小数2位就够了 如果为了方便计算使用4舍6入 5取偶 ...

“误差时钟数”后面的五位

28

主题

173

帖子

1971

积分

用户组: 版主

UID
1821
精华
6
威望
67 点
宅币
1530 个
贡献
104 次
宅之契约
0 份
在线时间
328 小时
注册时间
2016-7-12
发表于 2020-5-24 14:47:27 | 显示全部楼层
0xAA55 发表于 2020-5-24 14:23
“误差时钟数”后面的五位


这样做代码处理起来也太难看了,显示之前计算下 10秒或者30秒的 vga的吞吐量, 计算下 10秒或者30秒的晶振数 ,然后使用吞吐量和 晶振数做接下来的运算 会准确很多 ,io吞吐量和晶振数的准确性是硬件编程的基本功 吞吐量决定最高的频率和最优的频率 (最小公倍数和最大公约数,以及瓶颈值), 晶振数/秒 晶振数/毫秒 比赫兹数更方便计算,让结果符合规范化。

晶振数/毫秒 换算成一毫秒 的晶振数 n , 1us = n次 延迟基本单位
吞吐量 iops                                     操作基本单位
这些参数计算好 可以让代码不受单片机限制 代码使用前校准一次

1053

主题

2413

帖子

6万

积分

用户组: 管理员

一只技术宅

UID
1
精华
220
威望
327 点
宅币
19225 个
贡献
39815 次
宅之契约
0 份
在线时间
1819 小时
注册时间
2014-1-26
 楼主| 发表于 2020-5-24 18:14:45 | 显示全部楼层
Ayala 发表于 2020-5-24 14:47
这样做代码处理起来也太难看了,显示之前计算下 10秒或者30秒的 vga的吞吐量, 计算下 10秒或者30秒的晶 ...

我使用了PLL所以晶振数并不是合适的吞吐量计算来源,而我使用的倍频时钟是为了满足SDRAM的工作要求。

你所说的“最小公倍数和最大公约数”从概念上就是想让我使用第二个PLL。

至于为什么不使用第二个PLL,或者不使用现有PLL的第二个输出,用于VGA针对的PCLK,其实是因为最初我并不考虑使用内部的块内存作为VGA的数据源,而是只使用SDRAM打开多个Bank。不想使用更高的时钟来增加调试的难度。

28

主题

173

帖子

1971

积分

用户组: 版主

UID
1821
精华
6
威望
67 点
宅币
1530 个
贡献
104 次
宅之契约
0 份
在线时间
328 小时
注册时间
2016-7-12
发表于 2020-5-24 19:17:54 | 显示全部楼层
本帖最后由 Ayala 于 2020-5-24 21:48 编辑
0xAA55 发表于 2020-5-24 18:14
我使用了PLL所以晶振数并不是合适的吞吐量计算来源,而我使用的倍频时钟是为了满足SDRAM的工作要求。

你 ...


并不是使用第2个 PLL
上文提到的PLL锁相环是用于定制时钟频率的。举个例子,比如我有个 50 MHz 的时钟,我们可以把这个时钟输入给PLL,并设置PLL将这个频率提高 8 倍,再降低 3 倍,我们就可以得到约为 133.333333 MHz 频率的时钟,而这个时钟频率正好是我所使用的SDRAM芯片的工作频率。
  
  50 MHz  
  1us 50次
  提高8倍后降低3倍
  3us 400次
  15ns 2次
  

根据我们的时钟频率是133.333333 MHz,每个周期的时间相当于:

  1s / 133,333,333 Hz
= 1,000ms / 133,333,333 Hz
= 1,000,000us / 133,333,333 Hz
= 1,000,000,000ns / 133,333,333 Hz
≈ 7.5ns


其中tRCD为最小18ns,最大20ns,也就是最小2.4个周期到最大2.666666个周期,向上取整,我们需要等待三个周期才能算它完成了Bank的激活和Row的开启。

由于传输VGA信号需要严格的像素时钟,我们需要计算传输每个像素所需要的时间。假设分辨率为1024x768,则实际分辨率(也就是包括了消隐区域的分辨率)是1280x796,像素数共1018880。假设屏幕刷新率为60 Hz,则每秒传输的像素数是61132800个。
  这里应该是存在问题的,不同分辨率不同刷新率的消隐像素是不同的

  https://www.ibm.com/support/know ... ortedresolution.htm
  http://web.mit.edu/6.111/www/s2004/NEWKIT/vga.shtml
  1344*806*60  = 64995840
  


每个像素的传输用时是:

1,000,000,000ns / 61132800px = 16.357830820770519262981574539363 ns 约等于 16.358 纳秒。

1,000,000,000ns / 64995840px = 15.3856 ns

所以我们的FPGA要有能力可以更为精确地传输每个像素。我的做法是通过计时器的计算,每隔一定周期后延时1周期,用这种方式可以慢慢减少刷新率的误差。但有的像素可能会被稍微横向拉长。

每隔一定周期,延迟一个周期
16666666.666666666666666666666667 ns传递一个画面 1344*806 = 1083264
最慢的像素时速 15.3856 ns 只能比15ns快不能比它慢 按照 15ns每像素的速度 要考虑指令本身耗时 一个画面传递完用时  16248960 ns 空闲时间 417706.6 ns
空闲延迟直接硬性计数就好了 417706.6 / 15 * 2  = 55694 次  (55694  * (15 / 2) + 16248960 ) * 60 = 999999900 ns  还有100ns的误差 但是这个100 ns不可修正 因为没办法平分到每帧里,133,333,320 次 但是考虑实际情况 频率不可能那么精确 如果不显示时钟也不是很必要去校准 但是精益求精  肯定需要去校准 只要下误差在 55694就是允许的 如果比55694还高 那就需要在15.3856ns内传递更多像素,或者降低频率 ,如果显示时钟每天还需要去修正一次误差,市面上的廉价电子钟都不会这么做

1053

主题

2413

帖子

6万

积分

用户组: 管理员

一只技术宅

UID
1
精华
220
威望
327 点
宅币
19225 个
贡献
39815 次
宅之契约
0 份
在线时间
1819 小时
注册时间
2014-1-26
 楼主| 发表于 2020-5-24 20:35:36 | 显示全部楼层
Ayala 发表于 2020-5-24 19:17
并不是使用第2个 PLL
编辑中....

真是十分复杂的编辑呀

28

主题

173

帖子

1971

积分

用户组: 版主

UID
1821
精华
6
威望
67 点
宅币
1530 个
贡献
104 次
宅之契约
0 份
在线时间
328 小时
注册时间
2016-7-12
发表于 2020-5-24 21:05:41 | 显示全部楼层
本帖最后由 Ayala 于 2020-5-24 21:21 编辑
0xAA55 发表于 2020-5-24 20:35
真是十分复杂的编辑呀


编辑了一部分脑子不好使了 先这样啦 挑选了一些关键性的问题 一些技巧的东西想起来再继续编辑 很久不写硬件的东西了
代码里用800*600的消隐数据来处理1024*768 像素不出问题才怪呢

1053

主题

2413

帖子

6万

积分

用户组: 管理员

一只技术宅

UID
1
精华
220
威望
327 点
宅币
19225 个
贡献
39815 次
宅之契约
0 份
在线时间
1819 小时
注册时间
2014-1-26
 楼主| 发表于 2020-5-24 23:13:23 | 显示全部楼层
Ayala 发表于 2020-5-24 21:05
编辑了一部分脑子不好使了 先这样啦 挑选了一些关键性的问题 一些技巧的东西想起来再继续编辑 很久不写硬 ...

原来如此。我一直不知道消隐部分的大小和长度是怎么来的。但经过我的测试,好像我这个显示器都可以正常显示。只是我说的像素拉长,是因为我有的像素用3个时钟来显示,有的用两个。然而似乎看不太出来,就算我显示黑白交替的网格之类的

28

主题

173

帖子

1971

积分

用户组: 版主

UID
1821
精华
6
威望
67 点
宅币
1530 个
贡献
104 次
宅之契约
0 份
在线时间
328 小时
注册时间
2016-7-12
发表于 2020-5-24 23:23:41 | 显示全部楼层
0xAA55 发表于 2020-5-24 23:13
原来如此。我一直不知道消隐部分的大小和长度是怎么来的。但经过我的测试,好像我这个显示器都可以正常显 ...


不同显示器的消隐位置不一样 但是参数还是规范化的 所以有时候需要调整画面

28

主题

173

帖子

1971

积分

用户组: 版主

UID
1821
精华
6
威望
67 点
宅币
1530 个
贡献
104 次
宅之契约
0 份
在线时间
328 小时
注册时间
2016-7-12
发表于 2020-5-24 23:29:57 | 显示全部楼层
每显示一帧 然后延迟 55694 就好 实际需要校准 不同分辨率不同 但是完全没必要写一大坨代码

1053

主题

2413

帖子

6万

积分

用户组: 管理员

一只技术宅

UID
1
精华
220
威望
327 点
宅币
19225 个
贡献
39815 次
宅之契约
0 份
在线时间
1819 小时
注册时间
2014-1-26
 楼主| 发表于 7 天前 | 显示全部楼层
Ayala 发表于 2020-5-24 23:29
每显示一帧 然后延迟 55694 就好 实际需要校准 不同分辨率不同 但是完全没必要写一大坨代码 ...

经过我的测试是不能延迟的,会黑屏

28

主题

173

帖子

1971

积分

用户组: 版主

UID
1821
精华
6
威望
67 点
宅币
1530 个
贡献
104 次
宅之契约
0 份
在线时间
328 小时
注册时间
2016-7-12
发表于 7 天前 | 显示全部楼层
0xAA55 发表于 2020-5-25 01:45
经过我的测试是不能延迟的,会黑屏

显存数据丢了么!

1053

主题

2413

帖子

6万

积分

用户组: 管理员

一只技术宅

UID
1
精华
220
威望
327 点
宅币
19225 个
贡献
39815 次
宅之契约
0 份
在线时间
1819 小时
注册时间
2014-1-26
 楼主| 发表于 7 天前 | 显示全部楼层
Ayala 发表于 2020-5-25 02:03
显存数据丢了么!


显存数据很难丢的,这个SDRAM说是64ms要刷新一下,实际上等好几分钟数据都还在

以及,如果显存数据丢了,它的内容会变得以白色为主,偶尔会有几个其它颜色的点

本版积分规则

QQ|申请友链||Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图  

GMT+8, 2020-6-1 12:43 , Processed in 0.150681 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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