从来没有接触过CPLD,FPGA之类的器件,因为这次项目上用,所以才有机会学习verilog,可以说是从0开始的,
现在我感觉我的水平也就是刚入门,能看懂别人写的代码了,并能在它的基础上修改修改引脚配置了,呵呵,
我学verilog的优势是,我的上学是的数字电路学的不错,对时序是怎么个回事,有深刻的理解。不过基本知识现在忘的差不多了,但是我有些东西是我这辈子都忘不了的。因为我曾经理解了。。。
看了一堆教程,周立功的视频教程,特权的视频教程,还有大名鼎鼎的夏宇闻的verilog数字系统设计,但是,针对 我这个项目,还是不知道从哪里下手 ,我知道这是什么原因,没有任何的实战经验,就靠看那点理念上的教程,是根本不够的,于是我在这个论坛里发现了个好东西,CPLD SRAM来驱动LCD显示屏,1,这个东西,我也比较感兴趣,2.有源代码,3,与我现在将要做的项目有关系。
真是好东西,天时地利人和占完了,说干就干,于是我把这个网站上的CPLD TFT搜集了一下,发现有很多,但最为著名的要数widesoft大侠的代码了,我很多其它人比如jobword,dzng等人发布的代码,都是在widesoft的基础上修改的,而且改动不大,可见widesoft的代码已经优化的很好了,这么多高手也没再有重大突破,(但也可能修改好直接商品化了,哈哈)。于是我决定好好研究widesoft的代码。
什么叫眼高手低,这次我算是深有体会。短短四五百行的verilog程序,研究了一周了没看明白,这对我的自信心打击很大的。但我相信我对数字电路的认识,应该不至于连几百行 代码都弄不明白,肯定是我的学习方法不对。只看代码太抽象了,于是我打开 了RTL视图,CAO,还不如看代码呢,整个RTL视图更是一团糟,更是无从下手,还不如看代码的。没办法,百无聊赖,继续看帖子,不光看widesoft,还看jobwork,dzng等人的,反正他们的程序都差不多,不光看作者本人的,连下面热心网友回复的帖子也看,看着看着,视野似乎开阔一些了,再回去看代码,有时候就看夏宇闻的书,也回头重看视频教程,。。。。什么都怕时间,时间一长,慢慢的似乎领会些那段代码的含义,于是我就一句一句的揣摩揣摩,看出点问题了,就马上在代码后面自己加上自己的“理解”,怕过一会再忘了,有时候看着后面的代码,突然发现前面自己做的注释错了,应该是另一种理解才对,于是就赶快把自已标注的东西修改成现在的理解,如此反复,终于我按照自己的理解,把代码研究了一遍,但 是感觉不够深入。
估计看过widesoft代码的同学,对这几句应该记忆犹深吧?
RGB_Q <= (SysCmdValue_Q[7])?16'd0:RamDataBus; //before posedge, RamAddrBus_Q is H V address, so output RGB data
SramAddr[12:4] = YRegValue_Q[8:0];
SramAddr[3:0] = XRegValue_Q[8:5];
RamAddrBus_Q[4:0] <= XRegValue_Q[4:0];
RamAddrBus_Q[17] <= SysCmdValue_Q[8]; //wr page control
end else begin
if (AskWr) begin
WrEn_Q <= 1'b1; //this time not write time. so WrEn_Q=1; then next time write sram enable
end
ExBusOut_Q <= RamDataBus; //RamDataBus->ExBusOut_Q->ExOutM->ExDataBus
SramAddr[12:4] = HsCount_Q[8:0];
SramAddr[3:0] = DotCount_Q[8:5];
RamAddrBus_Q[4:0] <= DotCount_Q[4:0];
RamAddrBus_Q[17] <= SelDispRam_Q; //curent display page
end
InBusOut_Q <= PrePareData; //ExDataBus->WriteRgb_Q->PrePareData->InBusOut_Q->RamDataBus
RamTriState_Q <= InRamWe;
RamWeReg_Q <= InRamWe;
SramAddr[12:0] = SramAddr[12:0] - {4'd0,SramAddr[12:4]};
RamAddrBus_Q[16:5] <= SramAddr[11:0];
/******************
Y*480+X =Y*(512-32)+X[8:5]*32+X[4:0]
=Y*16*32-Y*32+X[8:5]*32+X[4:0]
=[Y*16+X[8:5]-Y]*32+X[4:0]
**********************/
区区几行,记得我就啃了几天,还好,看明白一些。后面的英文有的是我自己加的注释,怕我一转眼又忘 了,比如这一句我加的,ExDataBus->WriteRgb_Q->PrePareData->InBusOut_Q->RamDataBus,这样一来,我就清楚的理解信号的流动方向,那个地址的计算,可是我自己揣摩出来的呀,费了我好大劲,(后来发现帖子后面的回复已经有人回答了,我看帖不认真呀!浪费时间)作者的实现方式非常巧妙,用移位实现了乘法。
其实我对整个代码的理解更深一步,是当我运行了ModelSim-Altera仿真之后。
虽然我学习了这么长时间的verilog,但是我一直没有学ModelSim。一开始,我买的开发板是教的quartus自带的一个仿真工具,叫什么来的忘了,后来安装了quartus 12 ,好象没有了这个工具,而且网上的教程都是教的ModelSim,但是我确想另辟另辟蹊径,(估计是我开发单片机的惯性...),于是我发现一个能在线看波形的工具,SignalTap_II,这个真是太好了,在线就能看到系统运行的情况,这不就是单片机呀,我对这个比较感兴趣,于是就按照说明书写的,抓了一下我的开发板上的工程的波形,果然,一目了然,上升沿下降沿,高低电平,清清楚楚。
但是针对我手上这个TFT驱动的项目,我没有开发板呀,到网上搜了一下,少的可怜,taobao上有一个人卖,280元左右吧,只有一个CPLD+SRAM的驱动板,还不带LCD显示屏,自己拈量拈量感觉不划算。于是就停了下来,直到有一天,我在看帖子的过程中发现widesoft上传的testbench测试脚本,于是我就想着,是不是应该安装个ModelSim还运行一下,看看是什么情况,于是网上下载了个ModelSim,具体安装破解过程参看地本站里这个帖子。ModelSim-Altera 10.0d (Quartus II 12.0)那位大侠有和谐文件的?? (amobbs.com 阿莫电子论坛)
安装了之后,一运行什么波形也看不到,也不知道上面那么多的按键是做什么用的,刚开始我还以为是我下载的 testbanch有问题呢,仔细想想,应该不是,于是又马上再看特权的相关的视频教程,真是好东西,特权对中国FPGA的普及做出了卓越的贡献。我按照视频教程上的操作,果然看到了完整的波形。下面就是激动人心的波形分析过程,
把这几个仿真的图上传,大家看看
先分析这仿真波形吧,就两个Pclk周期,看的还算是直观吧,
由于pclk是clk54的6分频所得,所以这段截图显示的大约为12个clk54时钟。
首先明确一个概念,无论外部总线对sram是读,还是写,都不影响LCD的刷新。LCD的数据在特定的时间内周期性输出。在6个(1-6)时钟的第五个clk54时钟上升沿输出LCD数据的扫描地址,确保一个clk54时钟的地址建立时间,在第6个clk54时钟上升沿把SRAM中的数据锁存到RGB_Q中,整个第6个clk54时钟算是LCd数据的建立时间,当第6个clk54结束,也就是一个PCLK周期完成,会产生一个PCLK的下降沿,所LCD的数据就会锁存到LCD显示屏里面。 一个PCLK周期完成了一个LCD像素的刷新,
SRAM的读写操作确切是在clk54的 2,4,6个时钟里实现的,在1,3,5时钟钟RamAddrBus输出的是LCD显示屏的扫描数据地址。只有在2,4,6个时钟周期里RamAddrBus才输出读写sram地址。
我感觉这个例子中这个地方是最难理解的,widesoft大虾已经把源码给大家了,总不至于让人家再写一篇详细的说明文档吧,哈哈
希望大家都能从这个例子中真正的入门verilog开发......