|
楼主 |
发表于 2012-12-4 20:38:18
|
显示全部楼层
本帖最后由 jjj 于 2012-12-4 21:05 编辑
看了一堆教程,周立功的视频教程,特权的视频教程,还有大名鼎鼎的夏宇闻的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,这样一来,我就清楚的理解信号的流动方向,那个地址的计算,可是我自己揣摩出来的呀,费了我好大劲,(后来发现帖子后面的回复已经有人回答了,我看帖不认真呀!浪费时间)作者的实现方式非常巧妙,用移位实现了乘法。 |
|