tag 标签: 特权同学

相关博文
  • 热度 16
    2015-6-2 16:19
    931 次阅读|
    0 个评论
    这么多年过去了,现在读起来还是有很深的感慨。分享给大家。   读特权同学《深入浅出玩转FPGA 》有感 看了特权同学的这本书,感悟颇多,最终使我重新确立了目标。只是思路有些杂乱,我得慢慢道来: 初识特权同学实在EDN网站上,因为他的FPGA助学活动,在得到他的35集FPGA教学视频后,得知他已经和北京航空航天大学出版社合作出板了《深入浅出玩转FPGA》一书。对于国内格式呆板、内容互抄的教科书,我是一直没有任何兴趣的,但是对于这样一个搞过FPGA项目的工程师写出的经验之谈,而且是以随笔的形式写出的书,我是没有任何理由放过的。也许我最需要的不是一份说教的知识,而是一个可以在我最困难的时候让陪我聊天、给我动力的‘人’,而这个‘人’就隐藏在这本书点点滴滴、洋洋洒洒的文字之间,等着我去感悟。由于我个人是习惯在当当网买书的,于是当下就去当当网搜索了一下,果然有这本书,售价是31.9元,但由于最近经济的原因我始终没有点下购买的按钮,于是自己买到这本书的计划便搁浅了。 也就是昨天我和一帮兄弟们去吉大的时候,偶然在兄弟那边看到了这本书,于是很爱不释手,当时便决定从兄弟手中‘横刀夺爱’了。呵呵,于是,这本书便随我来到了理工,被我带到了实验室。对于这样一本不同于现代呆板教材的书,我是很欣赏的,于是我开始用心去读这本书,去尽量感悟这本书的精髓,破开表面的知识去追求作者要给我们表 达的深层次的意义。 很有幸的,我最后的结论是我没有选错书,在这本书中我感悟了很多,虽然我只读了第一个晚上,但这本书给我带来的感悟要比其他书籍在几周甚至几个月给我带来的感悟远远多得多...我感悟了很多,依靠串行触发是解决不了的,于是,我得用并行触发的方式来表达我的思路,首先得解释一下什么是并行触发:并行是指可以在同一时间进行响应,而没有顺序的问题。于是,在这部分,我拿并行的概念套用一下,下面的这些感悟没有刻意的进行先后排序,既没有重要程度的高低和内容高低的划分,因为我认为:每一点思考都可以带来进步。下面我就开始慢慢道来: 1:它纠正了我对FPGA的认识 说实话,我的兄弟在去年寒假就给我买好了FPGA开发板,我们分配的任务是我在理工主要攻FPGA方向,很惭愧的是当我用原来单片机的方式去学习FPGA时遇到了很大的障碍,这段学习的路进展很缓慢,于是不知不觉已经推迟到了今年暑假。暑假正式开始之前,在我打算自己的暑假生活的时候,FPGA这个小东西又很活跃的跳了出来,想到了自己的这半年在这方面基本没有任何进展,相当惭愧。于是决定暑假集中攻克FPGA,当然我也知道,FPGA这个东西和单片机、嵌入式一样,要的是长时间的点点滴滴的实践的积累,但是我可以加快我的进度,用自己最快的速度去学习FPGA,争取在本科毕业前自己主管一个FPGA的项目,尽管这个目标很难、很遥远、很不可企及。但我从不害怕,我会用自己的学习方法来换取效率,用高速可靠的效率来换时间! 接下来对比一下我原来和现在对于FPGA的认识:原来从单片机转型到FPGA时,并没有摸清这趟河水的深浅,而在不知深浅的情况下,我已经开始下水了。当时我认为FPGA和单片机一样,它是由一个超级经典的硬核架构起来的IC,通过编写程序来实现FPGA对外围的控制。但是现在想来,当初的想法是大错特错了,现在想来我的上半年FPGA学习进度基本为零也就是意料之中的事情了。我重新对FPGA的认识是这样的:首先,FPGA是纯硬件,现在我所写的‘程序’也就不能称之为程序,如果非要给它起一个名字,我感觉‘代码’也许是比较恰当的;其次,单片机和FPGA实现信息处理发出控制信号的方式不同,单片机和嵌入式是通过主函数或者操作系统实现任务调度的途径来响应各种外部条件触发,并通过‘软件’输出相应的状态来实现电子系统的正常工作,然而FPGA是通过纯硬件来实现各种激励的相应的,与单片机实现控制的根本方法不同。最后,单片机和嵌入式的软件设计会有盲点,再快的软件相应在现实应用中也会有出现盲点的时候,简单的说就是系统不能及时响应或者漏掉某些激励的现象,然而硬件不会,它以强大的并行方式来响应所有的信号激励,但硬件也不是万能的,FPGA这类的纯硬件最大的克星就是亚稳态以及竞争冒险等等,通俗的讲就是输出及其短暂的不稳定现象,虽然不稳定状态出现的时间及其短,甚至到了皮秒级别(1秒等于10的十二次方皮秒)但也就是这么短暂的不稳定也可能会给设计带来致命的危险。这是有硬件的特性决定的,是在设计中永远无法避免的,对于冒险和亚稳态,我们只能想尽一切办法去解决他们。一个信号处理逻辑机制优劣将决定一个项目的好坏。这就是我暂时对FPGA的一些认识和感悟,我相信在我深入接触FPGA后,一定会对它有更加新的、更加深刻的认识。 2:它改变了我对学习态度的认识 这是这本书给我带来的第二个改变,关于学习的。还是通过对比的方法来说明一下吧。 在读这本书之前,我的想法是这样的:现在两年已经结束了,基础已经打得差不多了,接下来便是开始改变的时候,我还依稀记得在2009年的除夕之夜,我给自己新一年的定义是‘Walker’,取义为‘步行者’,意思是想要自己在2010年步行做事,踏实做事。我的上半年还算是比较准确的执行了这一原则:踏实。尽管和理想中的状态有些差别,但是和09年相比,10年我改掉了很多浮躁,去掉了很多铅华,开始比较低调的做事了,不那么张扬,做人还是谦虚点好,于是就这样半年过去了,本来我给自己的转折点定在了暑假。暑假开始涉猎项目,主攻一些有前景的方向,比如ZIGBEE、热电转换之类的。 但是特权同学的blogs让我对这个转折点的选定进行了重新定位,最后的结论是我的转折点在时间上定的有些过早,经过多方面综合考虑后,我决定要推迟这个转折点。最主要的原因是特权同学让我看到了实实在在的差距,尽管他已经在研究所呆了几年了,阅历上比我高很多,这也许就是所谓的‘闻道有先后’,但是难得是那份甘于寂寞的心。确实,搞技术的一旦真正踏实下来,那么迎接他的注定就是寂寞和孤独,外面的繁华很好,但是在一定时间内将无法企及...呵呵..扯远了...转回来...关于转折点的定义,我是这样理解的:量变到质变的那个平衡点就可以当做我的转折点。对于我来说,这个转折点可以更加具体,那就是基础已经打好,也就是所谓的‘厚积薄发’,这样再去转型,会游刃有余,如鱼得水。特权同学的出现和最近板子出的事让我重新对‘基本功’在范围上和标准上进行了扩展,由原来的基本电路知识扩展了开来,加入了其他的几点,后面会一一讲到。于是这样看来,我的基本功还不扎实,这也算是进一步提升对自己的要求吧!可以这样说:这本书将我拉回到了原来的状态,只是起点和终点已经发生了改变,对于这点,我感觉值。 这点可以概括一句话:我要重新做回Walker ——步行VS踏实。 3:它让我忠于自己的梦想 虽然我说不上那个梦想是什么,我不确定这个梦想到底能走多远,我也不确定这个梦想最终会实现成什么样子,但我相信,这个现在还是比较模糊的东西,那就是我的梦想! 说实话,我有过迷茫期 ,有过挣扎困惑的时期,我相信每个人都会有我这样的迷茫困惑的时期,每个人也都会有一些不同的举动和决定,于是每个人的足迹也就都不相同。不过不论做什么样的决定都不是最重要的,重要的是那些决定是否让我们离那个模糊的梦想更近了一步,让我们更加清楚地去观察它,只到有一天我们会真正的站在它的面前,说:I  Have  Got  You !只不过,在国内坚持自己梦想很难,现代的社会总是让我们觉得付出就必须得有回报,没有回报的我们会感觉没有意义。很现实的问题,也很现实的事情,每个人在这种事情面前都会有自己的选择,无可厚非。只是我们也许没有看到一些细节的东西,那就是无形的回报,或许这些已经被我们物质化了,这些都不是我们情愿这样的,只是因为我们的责任摆在那里,我们背负着太多东西...于是,忠于自己的梦想变得难能可贵了。 走一条路,走到底,那就会就是光明。这是忠于梦想的力量,我是这么理解的。 4:它改变了我对资料的看法 特权同学在书中讲到了这样一件事情:他在做完几个FPGA项目后,重回理论,开始重新研究,而且用的是 Altera 和 Xilinx 官网的原版资料。这样很好,因为自家的片子自家最清楚,他们的文档资料也就是最准确的。然而现在市面上的那些所谓的汉版文档都是在原版资料上翻译过来的,一是由于译者对片子本身的了解不如原厂工程师多,难免在用词把握上有所欠缺;二是由于专业词汇和翻译水平不足的原因,造成了部分资料翻译不准确甚至上升到了错误的级别。所以,综合所有的资料,我们没有必要在XX论坛上求一些汉版资料,其实官网早就已经把那些最经典最准确的资料放上去了,提供给我们免费下载。但是为什么那么多的人不愿意去官网下载文档?这个原因其实很多人都知道,那就是官网资料是用英文写的,不是我们所熟悉的汉语编著的。还有一个现象就是国内的电子类学者英语水平普遍不高,这也就造成了很多学习者不愿意去看官网文档的现象。但是在书中,特权同学解释道:看 Datasheet 还是要看英文版的,最初开始看的时候,痛苦是注定的,因为这涉及到一个阅读习惯改变的问题,到最后搞一些比较偏的或者比较高级的IC,那么在国内寻求一版中文资料简直就是一种奢望,这个时候,看不懂英文版的Datasheet 那么就是死路一条。但是我们害怕英文,貌似已经成了国内电子开发者的一种通病(确实是这样)。特权同学最后总结到:看Datasheet 要忠于原版,翻译的只能作为参考,最后我们会发现datasheet里面的英文词汇也就那么多,翻来覆去的用,最后也就会习惯了,看起来也就像那么回事了。 这也是我加进来的第一个基本功:读原版datasheet。 还有一点,俗话说:好的开始就是成功的一半。那么在这个信息爆炸的时代,一份好的学习资料就是成功学习的一半。当我们初涉一个新的领域时,这点尤其明显。举个简单的例子:郭天祥的单片机视频,在当时来说,那就是最好的资料,一个不懂单片机的人,给他看这样的视频,那么他在一个月内开始搞简单的单片机开发是没有任何问题的,但是想想如果没有这样的资料呢?那么他会抱一本国内通用教材,在纸上研究各个寄存器和堆栈,半年都不一定能开始搞单片机开发!这就是一份好的学习给我们带来的效率问题。当然,我在这里举这个例子不是想说明郭天祥的视频是最好的,因为现在很多单片机视频已经在郭天祥的视频基础上进行了进一步改进,加进了很多其他更好的因素,当然也不能否定老郭对中国单片机的贡献,一人之力,影响至此,已经很不错了!在这里我想要表达的是当我们初涉一门新的领域时,一定要选好入门资料,这个很重要。这个我也可以拿我自己来举例子:当初初涉FPGA时的大部分资料开头都在最底层讲单片机、CPLD、PLC、FPGA等器件的区别,那我敢问哪个新手能听的懂?!但是我发现国内教材全是以这个开头的....又扯远了啊...呵呵..很感谢特权同学的资料教程,两天时间, 我已经对大概的FPGA开发流程有了印象,而且开发环境已经了解的还可以了。于是,对于现在这种效率和速度的FPGA学习,我个人感觉还是很不错的。 5:它让我对生活、学习、工作有了更深刻的理解 对我来说,这应该算是感悟很深的一部分吧!首先,让我先引用特权同学的一段话吧: ‘朋友,请原谅我一开篇就说自己是个不愿意谈论个人看法的人,其实我还是愿意说的,但是我总希望最后的结论是积极向上的,是应该让人觉得受鼓舞的。我从小就生长在一个可以说是蛮富裕的家庭里,甚至现在也不差。父母也都是基_督教徒,持家有道,从不缺乏。也许每个人都有自己理想的生活方式,当我走向社会,和我的另一半组成另一个家的时候,我就在期待着有一天我能有一份不错的薪水(至少不用为我的衣食住行忧愁),有一份可以让我很投入的工作(我喜欢的工作,需要有一些压力,因为没有压力就没有动力),生活上也是可以和另一半相互照应,在信仰上也多有一些追求,能够力所能及的帮助一些需要帮助的人,工作只应该是工作,生活也只因该是生活。’ (以上一段话引自特权同学《深入浅出玩转FPGA》) 我很欣赏这种人:工作就是工作,生活就是生活!这短短的一句话也许就是我对这部分的感悟了吧。我觉得这句话足以表达出我需要表达的含义了。 6:它改变我对基本功的理解 无论学的是什么专业,工作时做的哪行哪业,基本功都是必须的。在接触这本书之后,我感觉以前对电子的基本功理解还是不到位。原来的理解就是简单的电知识和电路的思想,在看来远远不够的。其他需要的基本功可以总结一下: a):学会阅读原版Datasheet,这个刚才已经解释过,不多讲。 b):焊接技术要强悍。把这个放进来是有原因的, 一是由于特权同学的解释很让人信服:‘虽然焊接这个活大多是工厂的工人来完成的,他们焊起来也许焊点更加漂亮、可靠。但是对于一些小公司来说,如果没有自己专门的焊接工厂(专门负责焊接的人),也许第一块样板的焊接就会落在硬件工程师的头上,或许这是一个没有选择的选择,即便如此,我们也很有必要掌握焊接这门基本功。直插的不用提,贴片的电容电阻也不算很有挑战性,也许只有当我们试着焊接SOP/TSOP/TSSOP的芯片时,尤其是0.5mm以下的间距时,才可能会感觉到焊接的重要性。扎实的焊接基本功能够给设计带来的便利就不用多说了,大家也许比我心里更加清楚。 第二个原因是最近团队暑假培训用的板子出了点问题,当初计划是PCB厂批量出板,然后经代理的转手送到焊接工厂的手中的,由他们工厂的工人进行焊接后打货到长春。这次时间上出了问题,造成了板子发货时间的推迟,弄得都有很郁闷。但也没办法,只能等着,尽量催代理让他们快一点发货。由于代理的时间不是我们能控制的,所以这样以后会很容易出问题的。于是,考虑了一下,准备自己亲自解决掉板子的一部分焊接,这就要焊接的功底了,这样的焊接以后少不了的,所以要加强焊接的功底。当然这个个基本功,是越扎实越好的。 c):开始养成写文档的习惯 很多技术员只会埋头苦干,从来都是默默无闻,一声不响,我们会对这样一个工程师群体肃然起敬,但是光干活还是不够的,我们缺少的是表达。表达最基本的两条途径就是嘴皮子和烂笔头,后者就是指文档了,我们要学会写文档,给别人看的,给自己看的。几个简单的原则:用户想知道的不是你的设计如何优秀,而是想知道如何使用这款产品,所以给用户的说明书要越简单越明了越好;给自己看的就不要需要一堆华丽的报表,只需要一些简单的总结、经验归纳就可以了。给自己看的文档不用正式,只是我们应该学会写一篇优秀的文档,擅长记录总结自己设计中的点点滴滴。   当然,这里只是举了几个简单的感悟,要想成为一个优秀的电子开发人员,需要的素质和基本功是全方面的,这几点是远远不够的,这就需要我们在平时的多多积累,不断地反思和总结了,既然我们选择了这个行业,选择了做技术,那么就应该好好奋斗,总会等到出暖花开的季节。总有那么一天,曾经的小树苗会枝繁叶茂、参天大树。 这篇感悟写到这里也就差不多了,一会还有几个代码要去看.....窗外的夜已经开始泛白了,是该结束了,只希望这段时间结束后再回头看看,又会有新的感悟...  最后写一句话,算是送给自己吧,也送给所有的迷于技术的人:  技术源于积累,成功源于执着 放下浮躁,才能摆脱困扰----------共勉
  • 热度 16
    2015-5-19 19:23
    2303 次阅读|
    0 个评论
    VGA 显示驱动子板设计 本文节选自特权同学的图书《 FPGA 设计实战演练(逻辑篇)》 配套例程下载链接: http://pan.baidu.com/s/1pJ5bCtt   SF-VGA 板载用于驱动 VGA 显示器的专用 D/A 转换芯片 AVD7123 , FPGA 通过 OUPLLN 连接器驱动 ADV7123 芯片产生供给 VGA 显示器的色彩以及同步信号。 SF-CY3 核心板与 SF-VGA 子板模块连接的系统框图如图 3.57 所示。 FPGA 产生 ADV7123 的同步信号以及 3 组供给 ADV7123 内部 3 路并行 D/A 转换的数字信号,经过 ADV7123 的这 3 组 VGA 色彩数字信号最终转换为 0~0.7V 的模拟电压送给 VGA 显示器。而 FPGA 另外会产生用于同步色彩数据的场同步信号 VSYNC 和行同步信号 HSYNC 。 (特权同学,版权所有) 图 3.57 SF-CY3 核心与 SF-VGA 子板模块连接的系统框图          SF-VGA 子板的实物图片如图 3.58 和图 3.59 所示。 (特权同学,版权所有) 图 3.58 SF-VGA 子板实物照片 1 图 3.59 SF-VGA 子板实物照片 2          ADV7123 芯片以及外围电路如图 3.60 所示。它的 3 路 D/A 信号实际上都是 8bit 位宽,但是我们只使用了 565 的 RGB (即 5bit 的 R 信号, 6bit 的 G 信号, 5bit 的 B 信号)输出,所以把不使用的 RGB 信号都统一接地。用于同步数据传输的有时钟 LCD_CLK 、转换数据有效控制信号 LCD_BLK 和补偿同步控制信号 LCD_SYN 。根据 datasheet ,实际上 LCD_SYN 我们无需使用,所以逻辑驱动给他 0 电平就可以了。而 LCD_CLK 是和输出的数据总线同步的,根据我们所需要的显示驱动分辨率和刷新率决定, LCD_BLK 信号则在数据总线有效时拉高即可。 (特权同学,版权所有)          ADV7123 的模拟输出 IOR 、 IOG 、 IOB 信号直接连接到 VGA 插座上,同时 FPGA 输出的两个同步信号 VGA_HSY 和 VGA_VSY 也直接连接到 VGA 插座上。 (特权同学,版权所有) 图 3.60ADV7125 与 VGA 接口电路          SF-VGA 子板上用于连接 SF-CY3 核心板的连接器电路如图 3.61 所示。 (特权同学,版权所有) 图 3.61 SF-VGA 子板与 FPGA 的连接插座电路          SF-VGA 子板的 OUPLLN 插座 P1 连接 SF-CY3 核心板的插座 P3 ,其实物连接如图 3.62 所示。 (特权同学,版权所有) 图 3.62 SF-VGA 子板与 SF-CY3 核心板的实物连接      
  • 热度 24
    2014-8-12 16:28
    1469 次阅读|
    1 个评论
            笔者是在看了特权同学玩转fpga入门视频之后,觉得不错,才拜读的他的《深入浅出玩转FPGA》这本书,在看到第31页对if..else和case语句进行分析时,觉得部分分析可能缺乏可比性,容易造成误解,斗胆在这里做一些讨论和补充。         该书中首先引用两段代码EX1和EX2说明if...else结构和case结构在verilog逻辑代码逻辑相同时,将导致RTL级视图不同,但最后映射资源利用和扇出却是相同的。        后来又举例两段读写控制代码,来说明case语句比if...else语句占用资源更少,但这两段代码其实没有可比性,或者说不应该像书中那样比较,因为容易导致误解。书中的两段代码如下:     第一段代码  EX3:   input clk;   input rst_n;   input close,wr,rd;   output db;     reg dbr;     always @(posedge clk or negedge rst_n)begin   if(!rst_n)begin          dbr=3'd0;   end   else begin          if(close)dbr=3'b111;          else if(rd)dbr=3'b101;          else if(wr)dbr=3'b011;          else dbr=3'd0;    end end assign db=dbr;   第二段代码EX4:  input clk;  input rst_n;  input close,wr,rd;  output db;    reg dbr;    always @(posedge clk or negedge rst_n)begin          if(!rst_n)begin                dbr=3'd0;          end         else begin                case({close,rd,wr})                3'b100:dbr=3'b111;                3'b010:dbr=3'b101;                3'b001:dbr=3'b011;               default:dbr=3'd0;              endcase        end end assign db=dbr;      书中直接对比以上两段代码的RTL视图,以及映射后的资源利用和扇出情况。但其实第二段代码,并没有将所有case列全,若想使两段代码逻辑一致,显然第二段代码需如下将所有case列出: case({close,rd,wr}) 3'b100:dbr=3'b111; 3'b110:dbr=3'b111; 3'b101:dbr=3'b111; 3'b111:dbr=3'b111; 3'b010:dbr=3'b101; 3'b011:dbr=3'b101; 3'b001:dbr=3'b011; default:dbr=3'd0; endcase         而如果第二段代码将所有case列出,则虽然RTL视图不同,但映射后的资源利用以及平均扇出其实仍是一致的。         很显然根据示例代码EX1~EX4,我们不难发现,在RTL级实现中,case语句一般是先经过译码器(decode),将所有可能的case情况译码出来,然后将最终输出相同的情况直接取或,而if-else结构的RTL级实现则与此不同,一般会采用选通器(MUX)互连的形式。         此外,最终映射优化的过程,其实类似于数字电路设计中的卡诺图优化,因此只要if...else和case的逻辑完整,其实映射后的资源利用和扇出应当是一致的,但是我们在设计中,往往有些信号或者说case情况其实是隐含不可能出现的,类似于数字电路中所说的约束项,例如上面的3'b110,3'b101,3'b111,3'b011这四种情况可能在实际中并不会出现,那么以上两段代码在功能上最终表现就会是相同的,但这隐含了以上四种情况实际上不会发生的约束。考虑到一般情况下,if...else结构较case结构可能隐含更多的约束项,因此可能导致更简化的最简逻辑表达式的产生,而一般逻辑表达式越简化,对细节的约束就越少,所使用的门也就相对要少,因而,一般所使用的逻辑资源也就少一些。        使用if...else结构,以及以上第二段完整的case语句结构,所产生的资源映射情况都将如该书中39页图2.7所示。      
  • 热度 28
    2014-8-10 10:44
    1978 次阅读|
    5 个评论
            一直很想学FPGA,去年11月份买了一套FPGA的开发板,玩了没两天,换了新的工作,那套开发板也束之高阁了。最近公司做了一个《时间管理》的培训,发现自己这一年总是在浪费时间没有什么进步,很后悔。然后决定好好学习一下特权同学的《深入浅出玩转FPGA》那套视频,因为还有些基础在,就直接跳到lesson12—乘法器设计实验。   看特权同学的视频,一直没有弄明白最关键的乘法操作的两句话(红色字体)。 else if (i 5'd0 i 5'd16) begin if(areg )   yout_r = {1'b0,yout_r +breg,yout_r }; else               yout_r = yout_r 1; end else if (i == 5'd16 areg )  yout_r = yout_r + breg; 然后自己在在草稿纸上慢慢演算,弄明白了二进制乘法是怎么相乘的。 我们以四位数乘以四位数举例:用4位二进制乘数的最高位乘以被乘数时,得出的结果最高只可能出现在第7位上(从广义上说就是结果的次高位上),所以第八位(广义上说就是最高位)只是用来准备存放进位的。 1010(被乘数) X1011(乘数) --------------------------- 乘数的最低位为1      得到0101 0000(右移累加) 乘数的次低位为1      得到0111 1000(右移累加) 乘数的第三位为0      得到0011 1100(右移) 乘数的最高位为1      得到0110 1110(右移累加) 我总结的规律就是乘数位上为1,结果先右移一位,次高位开始累加乘数。                                乘数位上为0,结果就只右移一位。 我感觉我总结的规律与特权同学的不一样,我先验证我所得到规律是否正确。 我写的乘法器的源码: module ex(               clk,rst_n,               ain,bin,start,yout,done               ); input clk,rst_n,start; input ain; input bin; output done; output yout; reg areg; reg breg; reg yout_r; reg done_r; reg i; always @(posedge clk or negedge rst_n)       if(!rst_n) i = 5'd0;            else if(start == 1 i=5'd16) i = i + 1'b1;            else if(!start) i = 5'd0;            always @(posedge clk or negedge rst_n)      if(!rst_n) done_r = 1'b0;            else if(i == 5'd16) done_r = 1'b1;            else if(i == 5'd17) done_r = 1'b0;   assign done = done_r;       always @(posedge clk or negedge rst_n) begin          if(!rst_n) begin                             areg = 16'h0000;                             breg = 16'h0000;                             yout_r = 32'h00000000;                    end          else if(start) begin                                        if(i == 5'd0) begin                                                    areg = ain;                                                breg = bin;                                      end                             else if(i 5'd0 i 5'd17) begin                                                if(areg ) yout_r = {1'b0,yout +breg,yout_r };                                                  else yout_r = yout_r1;                                             end                    end end assign yout = yout_r; endmodule   testbench: module ex_tb; reg clk; reg rst_n;         reg start; reg ain; reg bin;   wire yout; wire done;   ex i_ex (        .clk       (clk),        .rst_n     (rst_n),       .ain       (ain),       .bin       (bin),       .start      (start),       .yout      (yout),       .done      (done) );   initial begin          clk = 0;          forever          #10 clk = ~clk;  end   initial begin          rst_n = 1'b0;          start = 1'b0;          ain = 16'd0;          bin = 16'd0;          #1000;          rst_n = 1'b1;                      #1000;          ain = 16'd65535;          bin = 16'd32768;          #100;          start = 1'b1;          #4500;          start = 1'b0;          #1000_000;          $stop; end endmodule modelsim跑出来的结果: 计算器所得的结果 说明我的代码应该完全正确。 特权同学代码仿真出来的结果: 发现是错误的。 特权同学的代码错在哪儿?以下是网友的分析: 细心的读者估计已经发现{1'b0,yout +breg,yout_r }这条语句中位数怎么算都是31位啊,明明应该是32位的嘛(视频里也说是32位的啊)为什么会出现这个bug呢? 这里,有些网友是这样解释的yout +breg这两个16位数相加如果足够大,肯定是会产生进位的,所以就成了17位。呵呵,现在刚好17+14+1=32位了吧。 但是这个解释有一个很明显的bug:那要是没有进位呢?不还是16位的吗? 笔者认真考虑了一个晚上想了很多解释最终觉得以下两个解释,虽然自己也不是很有信心,但勉强可以支撑一下这个算法: 1,对于verilog语言“+”会产生一个一个加法器,而加法器都是会带进位位的,所以yout +breg会自动产生一个进位位,变成17位。 2,即使上面一个说法不成立,那么当{...}中不足32位时应该会在最高位自动补0或者X吧,这样最终依然是32位。并且不影响后面的计算结果。 对于这样两种猜想,由于本人能力有限,且刚刚接触FPGA所以不敢保证不是谬论,还希望高手们要多多指教。 上面啰嗦了这么多,其实只是对特权大哥代码的一个解读,真正有问题的是下一句: 根据上面总结出的那个规律,最高位只是用来进位用的那么这句代码: yout_r =yout_r +breg; 就明显有问题了,如果两个加数相加产生进位该怎么办呢?     暂时就写这么多,有什么不对的地方欢迎大家批评指正!!!
  • 热度 34
    2014-3-18 00:25
    3139 次阅读|
    11 个评论
    无论是加班加点,还是修修改改,我的“**”作终于结尾了,欣慰的是做完了一件事,彷徨的后面更艰巨的任务在等着我;   无论是路是自己选的,还是别人指引的,无论是站着走,还是跪着走,结果都一样,都需要走完。   无论现在是夜深人静,还是车水马龙,我依然是哪个追梦人。   无论是抄袭,还是崇拜的延续,我将一直以“ 特权同学、akuei2 ”为榜样,孜孜不倦、锲而不舍的去追梦,用特权同学的一句话概况,那就是:永远终于年轻时的梦想。   仔细一算,在EDN开博已有三年多,但真正写下第一篇博客的时间是:2012-11-12 21:17:19,内容: Verilog 和 FPGA 建模学习心得 。 那时很疯狂的畅游在FPGA的海洋里,是谁让我喜欢上FPGA的,第一人:特权同学,第二人:akuei2。两个的名著分别为:《深入浅出玩转FPGA》和《FPGA那些事儿》。   最后的最后,因为各种原因,我决定放弃FPGA之路,走单片机、STM32之路。即使放弃不搞,这不能说明我就不钟爱FPGA了,我一直会,永远会,等以后老了、闲了,自己做个FPGA玩玩,大伙别 。   就是因为对他俩的无线崇拜,我也决定写书,写作风格说的好听点,就是他俩的合体,说的不好听,就是“ 一直在模仿,从未被超越 ”.超不超越他俩没关系,超越自己才是最重要的。   书籍的写作过程即煎熬,又充满期待。书名的征订更漫长,为了有个好书名,我征求过两次,但是最后都未用,最后以425舍长为我取得《与单片机牵手的那些年》主标题,以夏雨夜魅取《迟来的幸福》为副标,我还激动的写下了这样的前言: 《与单片机牵手的那些年——迟来的幸福》,牵手——更能表达残弈悟恩对单片机的狂热;那些年——残弈悟恩自陷入单片机这块泥潭,就未曾自拔;迟来的幸福——学习单片机,没有捷径可走,需要读者多花时间和精力。虽然这种小甜蜜与成就感或许来的很迟,但只要读者坚持,牛奶和面包总会有的。 笔者曾在AET、EDN、amobbs网站征求过两次书名,征求的过程,残弈悟恩只能用欣喜和感谢两个词形容。欣喜的是热心网友给我了好多书名和一些宝贵的建议与支持,残弈悟恩恨不得全部采用,可惜书名最终只能有一个。现将未取,但依旧经典的部分书名贴到这里,以表谢意: 《单片机从入门到创意》 《单片机爱好者成长手册之浓缩版》 《仙人手指一点通——趣玩单片机》 《武功秘籍之单片机神功》 《单片机简史》 《我的单片机奋斗笔记录》 《小酌单片机》 《单片机青春》 《邂逅单片机的如期岁月》   最后,问题还是出来了,北航出版社的编辑们说这个名字:太文艺。可能学校不会建议采购这样的书,这下傻了,想啊想,一直想不出个好名来,怎一个愁子了得!   中午(确切的说,应该是昨天了)睡下,发现睡不着,“北爱”电影(陈思成正是一屌丝男,难道北京的爱情真是那样?哈哈)中一直在说谁是个光的人,我的脑海是有光的,一刹间,对“特权同学”崇拜的延续啊,有了《深入浅出玩转51单片机》;为了对akuei2的延续,讲单片机资料命名为《单片机那些事儿》。   特权同学、akuei2两位大侠,无论你们怎么“嫌弃”餐弈悟恩,餐弈悟恩还是会一直追求你们两的脚步,请不要走得太快,技术搞的太高深哈。
相关资源