jjj 发表于 2012-12-4 14:53:09

讲讲这段学Verilog的经过,从0开始

本帖最后由 jjj 于 2012-12-4 21:34 编辑

从来没有接触过CPLD,FPGA之类的器件,因为这次项目上用,所以才有机会学习verilog,可以说是从0开始的,
现在我感觉我的水平也就是刚入门,能看懂别人写的代码了,并能在它的基础上修改修改引脚配置了,呵呵,
我学verilog的优势是,我的上学是的数字电路学的不错,对时序是怎么个回事,有深刻的理解。不过基本知识现在忘的差不多了,但是我有些东西是我这辈子都忘不了的。因为我曾经理解了。。。
这是我使用的一个CPLD开发板,黑金刚出的,我tft_lcd驱动板的verilog代码就是在这上面验证的。

fishplj2000 发表于 2012-12-4 15:16:14

我觉得纯语法而言
能独立的做个带sdram或sram的tft controller,可以算作合格水平
在往上一点就是时序约束、复杂状态机、硬件实现算法

jjj 发表于 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)?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:16:38

本帖最后由 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的普及做出了卓越的贡献。我按照视频教程上的操作,果然看到了完整的波形。下面就是激动人心的波形分析过程,

wkman 发表于 2012-12-4 21:41:45

{:handshake:}{:sweat:} 学习

xian_heping 发表于 2012-12-4 22:48:53

向楼主学习

aworker 发表于 2012-12-4 23:30:14

LZ的学习心得写得不错@

kevinstar888 发表于 2012-12-4 23:44:16

楼主不错,顶楼主

chenguanglu 发表于 2012-12-4 23:50:16

说实话verilog 看别人的代码真的很痛苦,综合出来电路又很乱。里面不光有逻辑信息还有时序,接口很重要先明白了收入输出的接口,再去看中间怎么实现的

jjj 发表于 2012-12-5 11:19:52

本帖最后由 jjj 于 2012-12-5 11:22 编辑

上传两张照片,我改造过的IHMI43
把CPLD的调试接口也引出来 了,接到了我的USB BLaster,

aworker 发表于 2012-12-5 14:51:25

"下面就是激动人心的波形分析过程",LZ写得好,静待下文。

JINBO515 发表于 2012-12-5 20:26:46

学习就是一个时间加实践积累的过程!

ALTERA_WLB 发表于 2012-12-6 09:03:37

支持!!   顶楼主   期待下文

绝对零度 发表于 2012-12-7 09:11:34

期待下文!!!!

skynet 发表于 2012-12-7 09:12:34

期待下文,千万不要太监呀{:biggrin:}{:lol:}

xi_liang 发表于 2012-12-7 09:19:29

写得不错,也学过CPLD,一直没发现有用处,现在看来用来驱动TFT确实是个不错的选择

jjj 发表于 2012-12-7 11:20:30

本帖最后由 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:22:03

怎么回事,上传不了呀

jjj 发表于 2012-12-7 11:26:41

图片发不了,程序也上传不了,唉

aworker 发表于 2012-12-7 13:18:47

jjj 发表于 2012-12-7 11:26 static/image/common/back.gif
图片发不了,程序也上传不了,唉

可以上传的,可能是你的网络有问题。

chinatz 发表于 2012-12-7 15:30:16

我到现在也一直没接触过CPLD,但又经常能看到别人用了这么个方案,一般是什么样的功能来交给CPLD做的啊

jjj 发表于 2012-12-7 17:24:14

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+吧,我也没用过

287504461 发表于 2012-12-7 18:55:21

那么快就学会了,还头头是道厉害楼主,顶起了。。

jjj 发表于 2012-12-10 13:38:09

jjj 发表于 2012-12-7 17:24 static/image/common/back.gif
CPLD从SRAM中读数据,输出到TFT显示屏上。不能停止,不能停顿,就样LCD上就有稳定的显示了......
如果不 ...

把CPLD的jtag接口引 了出来。。。

jjj 发表于 2012-12-10 13:40:35

终于可以上传上来了,V880拍的图片,不是很清楚,
iHMI43做工真的很不错,虽然是开发板,比我的产品都要精细。{:smile:}
估的仿真,时序图这两天就上传,

aureole 发表于 2012-12-10 13:50:29

本帖最后由 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

brace1108 发表于 2012-12-11 22:33:43

有时间真该好好学学

lx2233456 发表于 2012-12-12 19:16:32

非常感谢分享!支持一下!

jjj 发表于 2012-12-13 10:28:46

jjj 发表于 2012-12-4 21:16 static/image/common/back.gif
其实我对整个代码的理解更深一步,是当我运行了ModelSim-Altera仿真之后。
虽然我学习了这么长时间的verilo ...

这一段的工作,我越发发现,用示波器看波形,什么也看不出来,还不如仿真来的直观。。。

beijingqiang 发表于 2012-12-13 10:38:10

楼主,我也正想学FPGA,你说的资料视频之类的推荐点吧

jjj 发表于 2012-12-13 13:32:57

本帖最后由 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

穷折腾 发表于 2012-12-13 13:56:18

最近也要进来了,现在明显感觉MCU都不够用了

beijingqiang 发表于 2012-12-13 14:22:39

jjj 发表于 2012-12-13 13:32 static/image/common/back.gif
周立功的视频教程,特权的视频教程,书也是不能少的,就看大名鼎鼎的夏宇闻的verilog数字系统设计
http:/ ...

谢楼主,回去就下载,希望楼主也继续更新自己学习进度,勉励我们进步

yuyu87 发表于 2012-12-13 14:49:38

我也来围 观             {:smile:}{:smile:}
我一直感觉EPM240资源不够用

jjj 发表于 2012-12-13 16:42:53

本帖最后由 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开发......

steven0419 发表于 2012-12-18 09:40:13

看来得经常来看看,免得落后了!
页: [1]
查看完整版本: 讲讲这段学Verilog的经过,从0开始