讲讲这段学Verilog的经过,从0开始
本帖最后由 jjj 于 2012-12-4 21:34 编辑从来没有接触过CPLD,FPGA之类的器件,因为这次项目上用,所以才有机会学习verilog,可以说是从0开始的,
现在我感觉我的水平也就是刚入门,能看懂别人写的代码了,并能在它的基础上修改修改引脚配置了,呵呵,
我学verilog的优势是,我的上学是的数字电路学的不错,对时序是怎么个回事,有深刻的理解。不过基本知识现在忘的差不多了,但是我有些东西是我这辈子都忘不了的。因为我曾经理解了。。。
这是我使用的一个CPLD开发板,黑金刚出的,我tft_lcd驱动板的verilog代码就是在这上面验证的。
我觉得纯语法而言
能独立的做个带sdram或sram的tft controller,可以算作合格水平
在往上一点就是时序约束、复杂状态机、硬件实现算法
本帖最后由 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)?16'd0:RamDataBus; //before posedge,RamAddrBus_Q is H V address, so output RGB data
SramAddr = YRegValue_Q;
SramAddr = XRegValue_Q;
RamAddrBus_Q <= XRegValue_Q;
RamAddrBus_Q <= SysCmdValue_Q; //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 = HsCount_Q;
SramAddr = DotCount_Q;
RamAddrBus_Q <= DotCount_Q;
RamAddrBus_Q <= SelDispRam_Q; //curent display page
end
InBusOut_Q <= PrePareData; //ExDataBus->WriteRgb_Q->PrePareData->InBusOut_Q->RamDataBus
RamTriState_Q <= InRamWe;
RamWeReg_Q <= InRamWe;
SramAddr = SramAddr - {4'd0,SramAddr};
RamAddrBus_Q <= SramAddr;
/******************
Y*480+X =Y*(512-32)+X*32+X
=Y*16*32-Y*32+X*32+X
=-Y]*32+X
**********************/
区区几行,记得我就啃了几天,还好,看明白一些。后面的英文有的是我自己加的注释,怕我一转眼又忘 了,比如这一句我加的,ExDataBus->WriteRgb_Q->PrePareData->InBusOut_Q->RamDataBus,这样一来,我就清楚的理解信号的流动方向,那个地址的计算,可是我自己揣摩出来的呀,费了我好大劲,(后来发现帖子后面的回复已经有人回答了,我看帖不认真呀!浪费时间)作者的实现方式非常巧妙,用移位实现了乘法。 本帖最后由 jjj 于 2012-12-4 21:28 编辑
其实我对整个代码的理解更深一步,是当我运行了ModelSim-Altera仿真之后。
虽然我学习了这么长时间的verilog,但是我一直没有学ModelSim。一开始,我买的开发板是教的quartus自带的一个仿真工具,叫什么来的忘了,后来安装了quartus 12 ,好象没有了这个工具,而且网上的教程都是教的ModelSim,但是我确想另辟另辟蹊径,(估计是我开发单片机的惯性...),于是我发现一个能在线看波形的工具,SignalTap_II,这个真是太好了,在线就能看到系统运行的情况,这不就是单片机呀,我对这个比较感兴趣,于是就按照说明书写的,抓了一下我的开发板上的工程的波形,果然,一目了然,上升沿下降沿,高低电平,清清楚楚。
但是针对我手上这个TFT驱动的项目,我没有开发板呀,到网上搜了一下,少的可怜,taobao上有一个人卖,280元左右吧,只有一个CPLD+SRAM的驱动板,还不带LCD显示屏,自己拈量拈量感觉不划算。于是就停了下来,直到有一天,我在看帖子的过程中发现widesoft上传的testbench测试脚本,于是我就想着,是不是应该安装个ModelSim还运行一下,看看是什么情况,于是网上下载了个ModelSim,具体安装破解过程参看地本站里这个帖子。http://www.amobbs.com/thread-5483487-1-1.html
安装了之后,一运行什么波形也看不到,也不知道上面那么多的按键是做什么用的,刚开始我还以为是我下载的 testbanch有问题呢,仔细想想,应该不是,于是又马上再看特权的相关的视频教程,真是好东西,特权对中国FPGA的普及做出了卓越的贡献。我按照视频教程上的操作,果然看到了完整的波形。下面就是激动人心的波形分析过程, {:handshake:}{:sweat:} 学习 向楼主学习 LZ的学习心得写得不错@ 楼主不错,顶楼主 说实话verilog 看别人的代码真的很痛苦,综合出来电路又很乱。里面不光有逻辑信息还有时序,接口很重要先明白了收入输出的接口,再去看中间怎么实现的 本帖最后由 jjj 于 2012-12-5 11:22 编辑
上传两张照片,我改造过的IHMI43
把CPLD的调试接口也引出来 了,接到了我的USB BLaster, "下面就是激动人心的波形分析过程",LZ写得好,静待下文。 学习就是一个时间加实践积累的过程! 支持!! 顶楼主 期待下文 期待下文!!!!
期待下文,千万不要太监呀{:biggrin:}{:lol:} 写得不错,也学过CPLD,一直没发现有用处,现在看来用来驱动TFT确实是个不错的选择 本帖最后由 jjj 于 2012-12-7 19:49 编辑
忙呀,先上传我在IHMI43上移植的widesoft的例程,驱动LCD,因为引脚定义不一样,而且有的引脚,widesoft用了,但IHMI43却没有用:
PWM亮度调节:widesoft用CPLD的内部逻辑产生的PWM信号。
而IHMI43用的是stm32的引脚,产生的PWM信号来驱动LCD的亮度的。
sram的CS信号:也不太一样,一个是直接接地,这样永远有效,一个是通过CPLD引脚控制。
等等吧,具体参考下面的程序:
怎么回事,上传不了呀 图片发不了,程序也上传不了,唉 jjj 发表于 2012-12-7 11:26 static/image/common/back.gif
图片发不了,程序也上传不了,唉
可以上传的,可能是你的网络有问题。 我到现在也一直没接触过CPLD,但又经常能看到别人用了这么个方案,一般是什么样的功能来交给CPLD做的啊 chinatz 发表于 2012-12-7 15:30 static/image/common/back.gif
我到现在也一直没接触过CPLD,但又经常能看到别人用了这么个方案,一般是什么样的功能来交给CPLD做的啊 ...
CPLD从SRAM中读数据,输出到TFT显示屏上。不能停止,不能停顿,就样LCD上就有稳定的显示了......
如果不需要更改要显示的内容的话,MCU只需要给CPLD一次数据就可以了,然后MCU就可以干其实事情了,等到要更改显示的内容了,MCU再给CPLD传一次数据,
这样就把MCU解放了出来,。。。
当然是针对不带有LCD控制器的MCU,比如stm32f1xx,stm32f2xx,stm32f4xx,lpc175x,lpc176x等等,
但是LPC1788就自己带的有LCD控制器,直接找个屏,往LCD控制器上一接就可以了,不过这样的MCU贵呀,估计应该50+吧,我也没用过 那么快就学会了,还头头是道厉害楼主,顶起了。。 jjj 发表于 2012-12-7 17:24 static/image/common/back.gif
CPLD从SRAM中读数据,输出到TFT显示屏上。不能停止,不能停顿,就样LCD上就有稳定的显示了......
如果不 ...
把CPLD的jtag接口引 了出来。。。 终于可以上传上来了,V880拍的图片,不是很清楚,
iHMI43做工真的很不错,虽然是开发板,比我的产品都要精细。{:smile:}
估的仿真,时序图这两天就上传, 本帖最后由 aureole 于 2012-12-10 13:56 编辑
支持楼主啊,楼主竟然用了我的产品,很荣幸啊!!
其实 CPLD 的性价比、用处挺大的。
这个板子上用的 EPM240 才不到 8元,解决了很多cpu很费劲才能解决的问题。。
这也是我一直推广的, arm+fpga(或者cpld)这中拓扑结构。
顺便贴个我的 iHMI43 背面图。。
贴个淘宝地址,呵呵:
http://item.taobao.com/item.htm?spm=a1z10.1.11-7543531149.20.93IrhZ&id=20508376359 有时间真该好好学学 非常感谢分享!支持一下! jjj 发表于 2012-12-4 21:16 static/image/common/back.gif
其实我对整个代码的理解更深一步,是当我运行了ModelSim-Altera仿真之后。
虽然我学习了这么长时间的verilo ...
这一段的工作,我越发发现,用示波器看波形,什么也看不出来,还不如仿真来的直观。。。 楼主,我也正想学FPGA,你说的资料视频之类的推荐点吧 本帖最后由 jjj 于 2012-12-13 13:40 编辑
beijingqiang 发表于 2012-12-13 10:38 static/image/common/back.gif
楼主,我也正想学FPGA,你说的资料视频之类的推荐点吧
周立功的视频教程,特权的视频教程,书也是不能少的,就看大名鼎鼎的夏宇闻的verilog数字系统设计
http://group.ednchina.com/GROUP_GRO_14596_1375.HTM?jumpto=view_welcomead_1355376811041 最近也要进来了,现在明显感觉MCU都不够用了 jjj 发表于 2012-12-13 13:32 static/image/common/back.gif
周立功的视频教程,特权的视频教程,书也是不能少的,就看大名鼎鼎的夏宇闻的verilog数字系统设计
http:/ ...
谢楼主,回去就下载,希望楼主也继续更新自己学习进度,勉励我们进步 我也来围 观 {:smile:}{:smile:}
我一直感觉EPM240资源不够用 本帖最后由 jjj 于 2012-12-13 17:19 编辑
把这几个仿真的图上传,大家看看
先分析这仿真波形吧,就两个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开发......
看来得经常来看看,免得落后了!
页:
[1]