搜索
bottom↓
回复: 35

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

[复制链接]

出0入0汤圆

发表于 2012-12-4 14:53:09 | 显示全部楼层 |阅读模式
本帖最后由 jjj 于 2012-12-4 21:34 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-12-4 15:16:14 | 显示全部楼层
我觉得纯语法而言
能独立的做个带sdram或sram的tft controller,可以算作合格水平
在往上一点就是时序约束、复杂状态机、硬件实现算法

出0入0汤圆

 楼主| 发表于 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,这样一来,我就清楚的理解信号的流动方向,那个地址的计算,可是我自己揣摩出来的呀,费了我好大劲,(后来发现帖子后面的回复已经有人回答了,我看帖不认真呀!浪费时间)作者的实现方式非常巧妙,用移位实现了乘法。

出0入0汤圆

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

出0入0汤圆

发表于 2012-12-4 21:41:45 | 显示全部楼层
学习

出0入0汤圆

发表于 2012-12-4 22:48:53 | 显示全部楼层
向楼主学习

出0入0汤圆

发表于 2012-12-4 23:30:14 | 显示全部楼层
LZ的学习心得写得不错@

出0入0汤圆

发表于 2012-12-4 23:44:16 | 显示全部楼层
楼主不错,顶楼主

出0入0汤圆

发表于 2012-12-4 23:50:16 来自手机 | 显示全部楼层
说实话verilog 看别人的代码真的很痛苦,  综合出来电路又很乱。  里面不光有逻辑信息还有时序,  接口很重要  先明白了收入输出的接口,再去看中间怎么实现的

出0入0汤圆

 楼主| 发表于 2012-12-5 11:19:52 | 显示全部楼层
本帖最后由 jjj 于 2012-12-5 11:22 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-12-5 14:51:25 | 显示全部楼层
"下面就是激动人心的波形分析过程",LZ写得好,静待下文。

出0入0汤圆

发表于 2012-12-5 20:26:46 | 显示全部楼层
学习就是一个时间加实践积累的过程!

出0入0汤圆

发表于 2012-12-6 09:03:37 | 显示全部楼层
支持!!   顶楼主   期待下文

出0入0汤圆

发表于 2012-12-7 09:11:34 | 显示全部楼层
期待下文!!!!

出0入12汤圆

发表于 2012-12-7 09:12:34 | 显示全部楼层
期待下文,千万不要太监呀

出0入0汤圆

发表于 2012-12-7 09:19:29 | 显示全部楼层
写得不错,也学过CPLD,一直没发现有用处,现在看来用来驱动TFT确实是个不错的选择

出0入0汤圆

 楼主| 发表于 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引脚控制。
等等吧,具体参考下面的程序:

出0入0汤圆

 楼主| 发表于 2012-12-7 11:22:03 | 显示全部楼层
怎么回事,上传不了呀

出0入0汤圆

 楼主| 发表于 2012-12-7 11:26:41 | 显示全部楼层
图片发不了,程序也上传不了,唉

出0入0汤圆

发表于 2012-12-7 13:18:47 | 显示全部楼层
jjj 发表于 2012-12-7 11:26
图片发不了,程序也上传不了,唉

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

出0入0汤圆

发表于 2012-12-7 15:30:16 | 显示全部楼层
我到现在也一直没接触过CPLD,但又经常能看到别人用了这么个方案,一般是什么样的功能来交给CPLD做的啊

出0入0汤圆

 楼主| 发表于 2012-12-7 17:24:14 | 显示全部楼层
chinatz 发表于 2012-12-7 15:30
我到现在也一直没接触过CPLD,但又经常能看到别人用了这么个方案,一般是什么样的功能来交给CPLD做的啊 ...


CPLD从SRAM中读数据,输出到TFT显示屏上。不能停止,不能停顿,就样LCD上就有稳定的显示了......
如果不需要更改要显示的内容的话,MCU只需要给CPLD一次数据就可以了,然后MCU就可以干其实事情了,  等到要更改显示的内容了,MCU再给CPLD传一次数据,
这样就把MCU解放了出来,。。。
当然是针对不带有LCD控制器的MCU,比如stm32f1xx,stm32f2xx,stm32f4xx,lpc175x,lpc176x等等,
但是LPC1788就自己带的有LCD控制器,直接找个屏,往LCD控制器上一接就可以了,不过这样的MCU贵呀,估计应该50+吧,我也没用过

出0入0汤圆

发表于 2012-12-7 18:55:21 | 显示全部楼层
那么快就学会了,还头头是道厉害楼主,顶起了。。

出0入0汤圆

 楼主| 发表于 2012-12-10 13:38:09 | 显示全部楼层
jjj 发表于 2012-12-7 17:24
CPLD从SRAM中读数据,输出到TFT显示屏上。不能停止,不能停顿,就样LCD上就有稳定的显示了......
如果不 ...


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-12-10 13:40:35 | 显示全部楼层
终于可以上传上来了,V880拍的图片,不是很清楚,
iHMI43做工真的很不错,虽然是开发板,比我的产品都要精细。
估的仿真,时序图这两天就上传,

出0入0汤圆

发表于 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? ... &id=20508376359

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-12-11 22:33:43 | 显示全部楼层
有时间真该好好学学

出0入0汤圆

发表于 2012-12-12 19:16:32 | 显示全部楼层
非常感谢分享!支持一下!

出0入0汤圆

 楼主| 发表于 2012-12-13 10:28:46 | 显示全部楼层
jjj 发表于 2012-12-4 21:16
其实我对整个代码的理解更深一步,是当我运行了ModelSim-Altera仿真之后。
虽然我学习了这么长时间的verilo ...

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

出0入0汤圆

发表于 2012-12-13 10:38:10 | 显示全部楼层
楼主,我也正想学FPGA,你说的资料视频之类的推荐点吧

出0入0汤圆

 楼主| 发表于 2012-12-13 13:32:57 | 显示全部楼层
本帖最后由 jjj 于 2012-12-13 13:40 编辑
beijingqiang 发表于 2012-12-13 10:38
楼主,我也正想学FPGA,你说的资料视频之类的推荐点吧


周立功的视频教程,特权的视频教程,书也是不能少的,就看大名鼎鼎的夏宇闻的verilog数字系统设计
http://group.ednchina.com/GROUP_ ... omead_1355376811041

出0入0汤圆

发表于 2012-12-13 13:56:18 | 显示全部楼层
最近也要进来了,现在明显感觉MCU都不够用了

出0入0汤圆

发表于 2012-12-13 14:22:39 | 显示全部楼层
jjj 发表于 2012-12-13 13:32
周立功的视频教程,特权的视频教程,书也是不能少的,就看大名鼎鼎的夏宇闻的verilog数字系统设计
http:/ ...

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

出20入186汤圆

发表于 2012-12-13 14:49:38 | 显示全部楼层
我也来围 观            
我一直感觉EPM240资源不够用

出0入0汤圆

 楼主| 发表于 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开发......

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-12-18 09:40:13 | 显示全部楼层
看来得经常来看看,免得落后了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 07:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表