[笔记]双口RAM(DPRAM)的实现
2013-01-09 10:44:57 周三
FPGA_4K2K_WW02.pptx 总结:
这一周我主要是在PANEL板子上调试LVDS Format Conversion。我在modelsim上进行功能仿真时,产生的信号源比较有规律,特殊化了,因此有很多Bugs没有观察出来。后来用804A信号源进行测试时就发现该信号源DE有效行固定为2160,DE有效值固定为960,而DE有效行中无效值不固定,DE无效行的行数和个数不固定。因此DPRAM的存储方式也要做相应的变化。我是将DE有效行和DE无效行分开处理。
1、数据处理模块:实现将两个时钟内的数据组合输出,需要这样处理的数据有两组。两组数据处理完后得到dout1和dout2,再通过时钟的上升沿分奇偶分别取出。取出时需要注意:由于DE有效行中有效值为960(偶数)刚好组合,而无效值不确定,当无效值为偶数时也刚好组合,当无效值为奇数时我将最后一个数据复制一次进行组合(刚好是DE有效的起点,因此我用DE有效脉冲进行判断)再取出。而DE无效行的组合,我以DE有效行的最后一个行值line_total为单位进行划分组合。需要说明的是当line_total为偶数时,dout1和dout2刚好交错取出,当line_total为奇数时,就会出现dout1重复取,但没关系,因此此时dout1和dout2中DE、V、H是一一对应,而数据RGB可能不一样。
2、DPRAM控制模块:
读控制:DE有效行中DE有效部分是分奇偶读取,这由功能需求决定,为了防止读空,读的时机是当写入数据达到de_active/2时才开始,DE有效行中DE无效部分是顺序读取。DE无效行也是顺序读取,需要注意的是DE无效行的起始点和终点,这是由写入时的地址、DE无效行数和最后一个数所决定的。
写控制:DE有效行的写入地址是从0到line_total-1。而DE无效行的地址是从de_active到de_active+DE_IN_INVALID,其中DE_IN_INVALID的取值是要由读写速度决定的,由于读取的时机是de_active/2,因此DE_IN_INVALID至少要大于de_active/2,本代码取600。DE无效行的地址不能从0开始是因为DE有效行的存储地址也是从0开始,可能会出现DE无效行的最后几个数据被DE有效行数据的前面几个数据所替换,导致结果有误。DE无效行的存储需要计算出其行数和计数器最后一个值,目的是供DPRAM读取时控制DE无效行内的切换及与DE有效行间的切换。写控制中DE有效行与DE无效行临界切换,我用de_rise进行判断。
任务:在ArriaV板子上实现松下信号源格式通过LVDS接口能在TPV的PANEL显示。
因为松下信号源LVDS格式与PANEL的LVDS格式不同,因此需要写个子模块进行转化。
4K2K@30HZ 4组LVDS分别为1,2,3,4。
TPV的PANEL中LVDS通道与像素关系如下:
1. LVDS1 will carry the pixels 0, 4, 8…..956, 960, 964, 968 …. 3836.
2. LVDS2 will carry the pixels 1, 5, 9 ….957, 961, 965, 969 …. 3837.
3. LVDS3 will carry the pixels 2, 6, 10 …..958, 962, 966, 970 …. 3838.
4. LVDS4 will carry the pixels 3, 7, 11 …..959, 963, 967, 971 …. 3839.
松下信号源中LVDS通道与像素关系如下:
1. LVDS1 will carry the pixels 0, 2, 4, 6, 8…..1916, 1918
2. LVDS2 will carry the pixels 1, 3, 5, 7, 9 ….1917, 1919
3. LVDS3 will carry the pixels 1920, 1922, 1924 …..3836, 3838
4. LVDS4 will carry the pixels 1921, 1923, 1925 …..3837, 3839
Figure 3: Arrangement of the LVDS Channels with pixel data. the relationship between the LVDS channel and the pixels carried per line. (The columns and rows start from 0 respectively. This is only for reference):
1. LVDS1 will carry the pixels 0, 4, 8…..956
2. LVDS2 will carry the pixels 1, 5, 9 ….957
3. LVDS3 will carry the pixels 2, 6, 10 …..958
4. LVDS4 will carry the pixels 3, 7, 11 …..959
5. LVDS5 will carry the pixels 960, 964, 968 …. 3836.
6. LVDS6 will carry the pixels 961, 965, 969 …. 3837.
7. LVDS7 will carry the pixels 962, 966, 970 …. 3838.
8. LVDS8 will carry the pixels 963, 967, 971 …. 3839.
初步想到通过DPRAM模块去实现,但是在做的过程中发现DPRAM中写的频率是F,而读的频率是2*F,此时会出现读空及重复读之前的数据,想请教下我应该如何处理呢?
信号源:1,2,3,...,3840 打包两个(如1和2,3和4,...,3839和3840)一组后存储到DPRAM,再读出来。打包会使时钟减半,这样导致的结果是DPRAM写入时钟是F,而读出时钟是2*F。解决方案是两组信号源A和B同时处理,这样可以保证每个时钟源都存储一组数据,时钟也就不会减半,只是必须先存储一半才可以读出,先完成A组的读取,后完成B组的读取,这样就可以保证一行正确地输出。这个方法我已经写好了,仿真通过。Ronnie的确厉害。
后来将LVDS FORMAT CONVERSION模块加载到整个工程去,通过SignalTapII工具发现DE出错,原因是在DE有效时需要分奇偶数,而在DE无效时只需顺序读取即可。而我是以一行(活动区域加隐藏区域为一行)直接整体进行奇偶读取,导致DE的有效范围和无效范围混合了。
第一个注意:其实在加载完这个模块时,我并没有将经过这个模块处理后的信号添加到SignalTapII中观察,我就直接看接收信号与PANEL的显示来判断结果没出来,还有Ronnie提示我应该针对这个模块,加载这个模块的信号进行观察分析。
第二个注意:在用SignalTapII工具观察该模块信号时,发信DE出错,我首先判断的是经模块处理DE被打乱,认为是正常的,其实我并没有深入地分析,后面也是经过Ronnie说明才明白,我觉得他在整个工程的系统设计及具体实现思想上做了非常好的分析与设计,这让我非常的佩服,我也希望自己能有系统概念,而不是一直停留在写CODE和调试这种基础上,当然目前的任务还是要强化基础,学习系统设计。。。
第三个注意:在DE超过一行的所有无效域都必须按顺序读取。但DPRAM写入时是以行为单位。而在读取时却把存储空间简单地分成前半部分为DE有效区(需要分奇偶读取),后半部分为DE无效区(需要顺序读取),这样会导致在一行全部为DE无效时,读取出错(可能导致V_SYN信号被分割)。
第四个注意:由于外部4K2K信号源很特别:DE有效部分固定为960,DE无效部分不固定。因此,在数据存入DPRAM时,DE有效部分和无效部分要分开处理,防止DE无效部分被DE有效部分覆盖了。在读取DPRAM中数据时,DE有效部分要分奇偶读取,DE无效部分要注意起始点和结束点。
在不断反复的调试中,我通过SignalTapII工具发现了很多问题,也解决了相关问题,有时遇到实在不懂、想不通的,我就请教Ronnie,发现他并不需要看代码及仿真情况,就可以一下子知道我的错误,或者说他将整个系统可能出现的情况都想到了,很厉害,我到最后才发现原来很多问题都具有共同点,只是提取公约子,就可以很快解决了。如帧中行、行中列、DE有效区域和无效区域等等的处理。在不断的修改代码中,我发现我的编程越来越规范了,也越来越大胆了。
1917 |
1915 |
… |
3 |
1 |
1918 |
1916 |
… |
4 |
2 |
3839 |
3837 |
… |
1921 |
1919 |
3840 |
3838 |
… |
1922 |
1920 |
3837 |
3833 |
… |
5 |
1 |
3838 |
3834 |
… |
6 |
2 |
3839 |
3835 |
… |
7 |
3 |
3840 |
3836 |
… |
8 |
4 |
输入数据如蓝色所示。经过数据为144位,地址为12位的DPRAM模块,其数具体存储格式如红色所示。输出数据如绿色所示。
… |
959 |
958 |
… |
3 |
2 |
1 |
0 |
地址 |
DE无效数据
|
3837 |
1915 |
… |
1923 |
5 |
1919 |
1 |
数据存储区域 |
3838 |
1916 |
… |
1924 |
6 |
1920 |
2 |
||
3839 |
1917 |
… |
1925 |
7 |
1921 |
3 |
||
3840 |
1918 |
… |
1926 |
8 |
1922 |
4 |
完成设计的第一步是将1,2,3,...,99,100。整理成每两个一组输出A。控制DPRAM读写时机。
写程序时,在看仿真结果后发现控制信号要与输入信号同步处理才能正确地输出,但控制信号又无法提前一个时钟,因此要通过逆向思维和换位思考的方法,如果改变不控制信号,那可以将输入信号延时一个时钟输出,这样控制信号就能与输入信号同步。
写程序的注意要点:在实现LVDS FORMAT CONVERSION的过程中,我一开始没有注意到自己很多处都用到的组合逻辑来编写(assign语句),因此在后面查找错误的时候花了很多时间:用SignalTapII观察信号,发现用assign语句实现的信号输出都不对。还好Ronnie看了下,很有经验地说将程序中涉及到的assign语句全部用时序逻辑去实现,本来以为修改了会造成数据信号与控制信号不一致,相差一两个时钟,后来一修改发现我的担心是多余的,居然一下子就正确地输出了。分析了下原因:可能是组合逻辑会产生众多无法想象到的行刺、竞争冒险、延时等无法控制的干扰。因此得出一个结论就是代码尽可能地用时序逻辑实现,尽量不用组合逻辑语法实现。
在实现行的动态控制中,我发现只要每次保存好计数器的最后一个值就可以了。在实现格式转化的过程中涉及行、列、帧等的控制,全部都归结为计数器的处理,要特别注意行内DE有效周期(用DE的边沿检测判断)和帧内DE无效行数(用帧的边沿检测判断)。
882E/882EA是美国Quantum Data公司推出的最新的视频测试仪器。其HDMI接口支持最新的HDMI 1。3标准,具有最大36比特/像素(12比特/分量)深色模式,完全符合CEA-861-D格式。882EA装备分析功能以测试HDMI 1.3的源设备。
804A是QD全接口高清信号源,支持,4路HDMI,VGA,YPbPr等接口,能进行HDCP,CEC,EDID测试,最新804A,能输出3D图片,能输出4K*2K解析度图片,支持最新中国国标测试图片。
特点
4 路HDMI 1.4 video/audio output
VGA,CVBS,YPbPr,LR Audio,S-Video
Multichannel Digital Audio Output (HDMI, SPDIF,TOSLink)
Compressed and uncompressed audio (LPCM, Dolby Digital,DTS)
3D Patterns
支持中国国标测试图
以上是882E/882EA/804A高清信号源的详细信息,由深圳市三经光电科技有限公司自行提供,如果您对882E/882EA/804A高清信号源的信息有什么疑问,请与该公司进行进一步联系,获取882E/882EA/804A高清信号源的更多信息。