项目任务:
本节课我们将会把 DDR3 SDRAM 内的数据读出,并通过 HDMI 接口显示在显示器上,图片的分辨率选择 1024x768@60Hz。
项目目的:
由于 DDR3 SDRAM 速度和 HDMI 传输对应分辨率的速度不匹配,因此我们需要将 DDR3 SDRAM 中的数据缓冲到对应的缓存器中,然后再将缓存后的数据发送到 HDMI 接收端。因此,本节我们需要掌握不同速度下的数据的缓存的设计方法。
缓存介绍:
在做FPGA设计中,经常会遇到不同频率、相位的时钟需要控制同一组数据, 此类不同频率、相位的时钟控制的数据,我们称为跨时钟域处理,如果跨时钟域的数据不经过处理,可能会出现数据部分丢失和增多的可能性,如图 1 所示, clk2 和 clk3 采集由时钟 clk1 产生的数据 data1,分别得到 data2 和 data3,可以看出由于产生 data2 的时钟 clk2 比 clk1 快,因此 data2 会比 data1 的每个数据保持多一个始终周期,而产生 data3 的时钟 clk3 比 clk1 慢,所以 data3 会比 data1 的 数据少。
造成上面的原因就是由于没有处理好时钟不同时数据的传输,这样的情况将会严重影响数据传输的正确性,因此为了解决此类问题,我们可以先将存储在缓 存器内,然后再由其他时钟将缓存器内的数据取走即可,这样可以保证数据在传输过程中不会出现图 1 所示的情况。
总体框架介绍:
本项目将会把 DDR3 SDRAM 中原始的数据读出,并通过 HDMI 接头显示在显示器上,由于 DDR3 SDRAM 读出的数据所在的时钟域和 HDMI 的时钟域不同,因此我们需要在 DDR3 SDRAM 和 HDMI 之间加入一个缓存器,进行数据的跨时钟域处理,具体的框架如图 2 所示。
由于缓存器的存储容量有限,因此我们不能无限制的将 DDR3 SDRAM 内的 数据传输到缓存器内,但是也需要保证 HDMI 向缓存器要数据时,不能出现缓存器内数据量无法满足 HDMI 所需数据的问题,因此我们需要合理的使用该缓存 器,使其能为 DDR3 SDRAM 和 HDMI 的数据解决跨时钟域的问题。 可以举一个现实生活的例子解释该状况,我们可以将 DDR3 SDRAM 理解成水库,缓存器理解成蓄水池,HDMI 理解成用水的市民,由于蓄水池内部存储容量有限,因此如果将水库的水大量注入蓄水池,就会出现蓄水池溢出的情况,但 是考虑到市民的用水,因此蓄水池内的水量又不能过少,最好的办法就是设定一个阈值,当蓄水池的水量低于阈值时,就开闸将水库的水注入蓄水池,当高于阈值时,就关闭水库的水闸,这样就能保证蓄水池的水量不会偏差阈值过多。根据 市民的用水情况,设定一个合适的阈值,这样蓄水池就能很好的解决水库与市民用水之间的缓存。 我们可以调取一个 fifo 作为缓存器,将 DDR3 SDRAM 中的数据输入到该缓存 fifo 中,当 HDMI 端需要数据时可以从该 fifo 中取即可。由于 HDMI 端每次至少会连续的需求一行的数据量,为了 HDMI 能够从 fifo 中取