认识Robei及Robei优势_FPGA攻城狮的博客-程序员信息网

技术标签: EDA工具  FPGA  教育  Robei案例  高校  Robei介绍  Robei  Robei软件  

第一章:认识工具,掌握基础

通过今天的学习,读者可以了解集成电路设计工具的历史背景情况,同时熟悉国内外的产业差距。今天的学习将为后面的操作打下基础,读者需要尽可能的熟悉软件和Verilog语法,了解Robei软件的结构和操作方式,并知道如何注册和寻找Robei资源。今天学习完成后,熟悉Verilog语言的读者可以加深记忆,刚刚开始学习FPGA设计的读者也可以轻松地掌握Verilog语言的结构和语法。

1.1 为什么要选择Robei

1.1.1. 背景介绍

提供EDA设计工具的厂家有Cadence,Synopsys,Mentor Graphics,Xilinx,Altera等公司,这些公司都是欧美的公司,中国的EDA设计工具却少的可怜。中国90%的芯片来自进口,已经引起了政府的重视和对集成电路产业的大力扶持,但是中国99%的芯片设计工具来自进口和盗版,目前政府对于集成电路设计工具支持却是凤毛麟角。集成电路产业的发展依托于集成电路设计工具的发展,设计工具是和集成电路产业的发展同步的,就像两条腿走路,缺了哪条腿都是畸形的发展。“工欲善其事,必先利其器”,在中国大力发展集成电路的大环境和氛围下,唯独缺失的是对集成电路工具的发展。当一个国家的某个产业的快速膨胀和繁荣是依赖于其他国家的利器的时候,就等于把这个产业的咽喉拱手让别的国家给掐住。这个产业的利润将会慢慢通过知识产权的诉讼形式流失进入到其他工具所有国。这种畸形的发展会导致欧美等国家顺利完成产业淘汰和升级,中国变成了集成电路产业链的最低端,只能依赖于微薄的利润生存,并准备着时不时的被掌握设计工具的国家过来“剪羊毛”。在EDA设计工具上,中国有没有可能和欧美进行抗衡和抵制?
欧美国家的EDA设计工具也联合本国的IP供应商,打造了一个知识产权产业链,对于一些常用的IP进行知识产权封锁,要求国内的的生产和设计厂商进行购买,否则就无法完成整体设计。而且国外掌握着对软件和IP更新升级的主动权,即使购买了IP,在一定时间之后,随着版本的升级,IP在不同的版本中不兼容,而且IP升级需要继续付费,同时新IP的使用方法不同,这就要求国内的产业链随着软件和IP的升级不断的更改设计,甚至重新设计,导致大量的人力、物力和财力的浪费,同时又不得不出钱购买,因为产业的依附性已经形成。我们如何能打破这个局面?
国内的高校在培养集成电路设计人才的时候,也是不求甚解,很多课时在讲IP的使用,而不是如何设计IP。如此以来,我们通过填鸭式教育培养了一批不会思考的集成电路设计工程师,这批不会思考的工程师在公司只会拿来主义, IP的封闭导致了中国集成电路产业的惰性,建立在这种惰性之上的创新都是空谈。但是随着集成电路大基金的投入,集成电路制造厂的规模扩建,新生产线的上线和产能的增加,如何快速培养更多的集成电路人才来设计和流片,用来喂饱这些新增的产能和高端工艺线?
仔细分析一下集成电路设计的历史,从最早的逻辑门搭建到原理图设计(软件化的集成电路芯片模组),再到编写Verilog或者VHDL的代码(充分灵活的设计方式),每一步都是为了让设计更方便,更简单,更抽象。未来的EDA工具会怎么样?
现在的EDA工具设计相当灵活,全部由代码实现功能并仿真。在设计中牵扯到大量的模块重用,进行例化,这个过程需要使用者清楚要进行例化的每个引脚和位宽,用户就需要在声明和设计中来回切换,不时查证引脚信号的定义,浪费了大量的时间。如何才能更方便更快速的进行例化?
在大型的设计中,需要反复的对一些细节或者模块进行修改,一旦用的多得模块被修改,用户中其他的设计就要更新,将所有用到被修改了的模块的地方进行更新牵扯到大量的时间,甚至是重新设计。如果能有一键更新,分层调整,将可以大大节约工作量。如何在软件中进行快速的自上而下和自下而上的协同设计并能实现一键更新?
集成电路的学习是一个痛苦而抽象的过程,它不像C语言软件一样,可以快速编译,所见即所得。EDA设计中语句是并行执行的,C语言中是串行执行的,如何能减小软件和硬件设计的鸿沟,让有C语言基础的人快速转变成硬件设计工程师?大多数EDA软件都是庞然巨物,要想入门EDA,首先必须把庞然巨物下载完成然后安装并熟悉使用,一旦运行巨物,就要吞噬电脑的大量内存和计算性能,有没有办法用最小的工具完成初学者的学习任务,而让电脑运行流畅不妨碍我打游戏呢?
因为缺乏竞争对手,国外的EDA公司在国内的售价高的离谱,几十万上百万一套软件已经是司空见惯。上规模的集成电路公司为了避免被起诉不得不花费天价来购买软件,而这些费用都是几年或者十几年从微薄的利润中积累出来的。小微集成电路企业无力支付天价的软件费用,只能采用盗版,这也为以后成长为大公司埋下了法律隐患。如何让中国的EDA设计工程师用得起正版EDA软件?如何让他们不再因为使用盗版而天天提心吊胆?

若贝公司推出的Robei可视化芯片设计工具是在各种现有的EDA工具的最上层加了一层,进行可视化的所见即所得的设计,同时向下跨越到设计仿真和波形查看,基本涵盖了设计前端的所有功能,实现RTL级别的设计仿真,减少了中国大部分工程师和学生对于国外EDA设计工具的依赖和减少国外EDA设计工具的进口使用量。以前,国外的EDA设计工具需要人手一个,这样的成本不是个人和中小公司能够负担的起的,现在,由于Robei的出现,我们只需要购买少量的后端设计工具,大大减小了开支。同时Robei支持的结构化和可视化设计,方便了模块重用,节省了设计公司和工程师的时间,提升了设计效率和提升了设计质量。目前的集成电路工具更多是面向设计工艺的,极少从设计者和学习者的使用方便触发,而且软件动辄上G或者几十G,对电脑性能要求也极高。Robei软件是一个以轻量决胜的软件,只有不到10M,可以减少学生学习的时间,提升学习的兴趣和效率,可以为集成电路行业培养更多的人才。
Robei打造了一个完全透明的IP平台,在这个平台上,我们将容纳更多会思考、会设计的工程师来打造更多更好的设计,所有的设计完全透明,用户在使用的时候可以随意更改和裁剪,也可以学习IP设计的相关思路。这个平台打造的是学习与贡献一体,鼓励贡献优质IP,定期公布设计项目,让更多有思想的工程师参与项目,打造IP共享社区,奖励优秀设计者。本来我们集成电路设计就落后很多,如果再采用知识自我封闭的理念,将会导致更加落后。Robei崇尚的是一种学完就分享的模式,让更多的设计者受益,让更大的设计变得方便可控。这个平台是对知识产权垄断的抗争,是兴起集成电路设计产业的的中坚力量。

1.1.2. EDA的发展史

最早的集成电路设计是依赖于逻辑门的,用74LS系列的芯片进行连接,实现一些基本的功能。随着技术的发展和演进,出现了PCB的设计,也就是板级的设计,可以让这些基本的逻辑单元器件布局到一个PCB板上实现。PCB的设计演进也单独的发展成了一个分支,一直延续使用到现在。在集成电路历史上,第一个可编程逻辑器件诞生于1985年,由硅谷的Xilinx公司推出。既然是可编程逻辑器件,自然少不了可以用于编程的EDA工具。
最早的EDA设计工具是原理图设计方式,原理图主要基于市场上常见的元器件进行组合连线设计。这种设计基本上是将逻辑门设计中的基础电路模块软件虚拟化之后提供在设计库中,用户可以用来软搭建出自己需要的系统,再写入到FPGA中。原理图的优点是设计非常直观,但是灵活性不够。如果在原理图中新增加一个不存在的设备器件,往往需要写代码、打包、更新到器件库、从器件库查找并使用等过程,一旦元器件设计有误,就会需要重新回到代码修改并重新打包。已经在设计中存在的器件需要重新更替。流程繁复浪费了设计师大量的时间,尤其是源代码不慎丢失,将会直接导致模块无法修改,设计师需要重新来过。
后来由于原理图设计中每个模块要对应于实际的芯片,设计灵活性差,导致了后来以VHDL和Verilog为主流的代码编程设计,所有的模块实现均采用代码编写实现。代码设计是目前非常流行的设计方式,无论是元器件接口定义,模块例化还是功能实现,全部用Verilog或者VHDL等语言设计实现。代码设计的优点是灵活,想写什么器件就写什么器件,缺陷是不够直观。工程师需要读完大段代码才能了解其功能和结构信息,同时在撰写例化的时候,需要依据代码进行编写例化,要反复对照和查看接口名称和数据宽度等信息,防止出错。例化的代码也是手写为主。
界面设计方式和代码设计方式各成一体,相互之间交叉很少。模块化设计体现不够完美,很多模块不公开。基于界面的设计在生成代码的过程中,掺杂了很多冗余信号,在出错后返回查看代码,增加了很多冗余信号的障碍。
21世纪之后,伴随着FPGA的越来越大,工艺越来越先进,逻辑资源使用量已经不是设计的瓶颈,这个时候出现了方便设计和使用的框图设计模式。最灵活的框图设计模式当属Robei,它采用了框图设计结构,代码设计算法的方式,让软件自动生成结构层代码并与用户输入的代码组合成完整的代码。这种设计方式既拥有原理图设计的直观,又拥有代码设计的灵活性。
在这里插入图片描述
自Xilinx公司1984年诞生到现在,其软件经历了14代以上的更新迭代。我们可以分析一下该公司的ISE设计工具的大小变化,来分析EDA软件的膨胀过程。Xilinx的ISE从最早的几十兆到现在的8个G,发展速度十分快,但是软件庞大毕竟不是好事,软件越大,问题越多,为了修复和维护这么庞大的软件,所需要的人力成本就越高,所以Xilinx公司有几千人做软件,远远超过做硬件设计的人数。在集成电路行业,软件的庞大是司空见惯,这是因为所有厂商都以芯片的结构为核心来设计软件,却忽略了用户的感受。从用户角度来说,软件的庞大就代表着下载耗费大量的时间,学习需要比较长的周期,运用的步骤复杂,每一步都要按部就班,稍有差错就要焦头烂额。Robei是一款面向用户的芯片设计工具,从诞生之日起,Robei开放软件让超过35万人试用,得到用户的体验和感受的问题,并在之后的版本中进行不断修改演进。这些意见来自美国、加拿大、中国、欧洲、韩国、日本等国家,能够让Robei快速匹配来自不同地域的用户体验感受。时至今日,Robei也在鼓励用户反馈问题,在意见采纳后,为每个用户提供奖励。
在这里插入图片描述
在这里插入图片描述

1.1.3. Robei的优势

Robei是一款可视化的跨平台EDA设计工具,提供了超级简化的设计流程,最新可视化的分层设计理念,透明的模型库以及非常友好的用户界面。Robei软件将芯片设计高度抽象化,并精简到三个基本元素,掌握这三个基本元素,就能很快地掌握Robei的使用技巧。该软件将先进的图形化与代码设计相融合,让框图与代码设计优势互补,弱势相互抵消。
在这里插入图片描述
Robei软件是在Verilog代码设计的基础上进一步抽象,让框图设计与代码设计实现完美融合。传统的原理图设计虽然看起来非常直观,但是灵活性差,用户要利用现成的模块来拼凑设计。而代码设计虽然相当灵活,但是密密麻麻的代码很不直观。Robei软件通过一种结构层面上图形化设计,算法层面上代码输入的方式使设计更加直观灵活。
在这里插入图片描述
在这里插入图片描述
目前EDA的设计首先需要工程师在脑海中设计结构,再根据结构手写代码,容易出错。现在工程师利用Robei软件可以边构思边设计结构,结构完成后工程师可以专注于写核心算法,软件自动生成结构层的代码并与工程师输入的算法代码结合仿真。这种设计可以让工程师专注在设计算法上,而不用去记任何引脚名称和数据宽度。同时该软件将模型设计、测试文件和引脚分配集成在一个超级简化的设计流程中,可以进行快速设计仿真。
在这里插入图片描述
Robei集成了先进的图形化与代码设计的优势,同时具备Verilog编译仿真和波形分析,可以实现各种系统的快速设计、仿真和测试。软件生成标准的Verilog代码,可直接与各种EDA工具相融合。Robei是最贴近用户的前端设计仿真软件,仿真后直接生成Verilog代码,可以直接在其他EDA设计工具中使用。
在这里插入图片描述
Robei也是一款跨平台的EDA仿真工具,不仅有Windows,Linux,Mac OS的版本,也有专门针对于Android平板的版本。到目前为止,Robei也是唯一一个可以在移动平台上设计仿真的EDA工具。
在这里插入图片描述

1.2 安装与注册

1.2.1. 安装

从Robei官方网站(http://robei.com)上下载最新版Robei软件。解压Robei.zip,然后双击Robei-setup.exe,在弹出的安全警告中选择“是”,如图1-2-1所示。
在这里插入图片描述
Robei安装界面会出现,如图1-2-2所示。
在这里插入图片描述
在弹出的窗口中点“Next”。
在这里插入图片描述
如需要更换路径,可以点“Browse…”按钮重新选择路径,如果不需要更改,继续在弹出的窗口中点“Next”。
在这里插入图片描述
点击Next。
在这里插入图片描述
点击“Install”。
在这里插入图片描述
等待执行完毕。
在这里插入图片描述
点击“Finish”,安装完毕。你可以从桌面上或者开始菜单栏中找到Robei,启动Robei会看到如下图1-2-8的界面。
在这里插入图片描述

1.2.2. 注册

打开Robei官方网站:http://robei.cn/register.php,注册新用户,用户名称中不能含有中文和空格。注册完成后可以登录后台购买Robei的注册码。Robei注册码分为四种不同的类型,学生版、个人版、教育版和专业版,请根据自身的需求选择购买。
获得注册码后,返回电脑上打开Robei软件,点击菜单“Help”,在下拉菜单里选择“Register”,如下图1-2-9所示。
在这里插入图片描述
在弹出的Register对话框中输入之前注册的用户名和密码,点击按钮“Get License”, 软件会弹出网页,在该网页中有相关的注册码信息。
在这里插入图片描述
在这里插入图片描述
复制Your License:后面的一串编码,并输入到Register对话框的“License*:”中,点击“Register”按钮。
在这里插入图片描述
如果看到下图1-2-13所示的对话框,恭喜你,注册成功。如果没有,请联系若贝公司:[email protected]。点击“Yes”按钮,退出注册。
在这里插入图片描述
一切准备就绪之后,关闭软件,重新启动,查看软件界面的最顶端,“Robei Trial”的字样已经消失,取而代之的是你的注册码的类型:学生版是“Robei Student”,个人版是“Robei Personal”,教育版是“Robei Education”,专业版是“Robei Professional”。无论何种版本都可以跟随本教程使用,只是能编译的设计个数受限。
在这里插入图片描述

1.3 如何使用Robei

Robei软件启动后,界面如图1-3-1所示,软件界面分为菜单,工具条,工具箱,属性栏,工作空间和输出窗口几个部分。菜单和工具条位于软件的顶部,与常见的软件工具一样,工具条上分布着一些常用的按钮。左侧的工具箱里包含设计好的模型,可以重复利用。用户可以在界面右侧的属性栏里修改当前设计模块的属性。中间的工作空间是主要设计区域,当前设计模块默认名为“module”。底部为输出窗口,用来显示错误以及警告信息。
在这里插入图片描述

1.3.1. 菜单和工具条

Robei为了方便用户使用,在顶部设有菜单和工具条。与文件相关的操作放在“File”菜单里,复制、粘贴、剪切和删除操作放置在“Edit”菜单里。与设计相关的操作比如添加模块、引脚、和连接线放在“Tools”菜单里。除了这些,还有在“Build”菜单里的执行仿真和查看波形操作,“View”菜单里的放大缩小操作。如果想恢复被错误关闭的窗口,用户可以到“Window”菜单下找出对应的窗口并打开。
在这里插入图片描述

1.3.2. 工具箱

工具箱分为两栏,第一栏“Current”对应的文件位置为当前工作文件夹,用来展示在当前目录下,用户开发的设计模型,其路径是用户当前模型所存储的文件夹。第二栏“System”是随Robei软件一起安装好的,里面的模型均由系统自带,其路径是“C:\ProgramData\Robei”。用户也可自行添加新的栏目,并给出所对应的文件夹,Robei会自动读取该文件夹里所有的Robei模型。添加方法是在“Toolbox”里点击右键,选择“Add”,系统会自动弹出添加库的对话框(如图1-2-3所示)。
在这里插入图片描述
在这里插入图片描述

1.3.3. 属性栏

属性栏窗口用来展示工作区域中被选中物体的属性。用户可以修改对应的属性,并按下回车键,修改的属性会直接展示在工作区域中。模型中有些属性是受保护的,所以不能修改。
在这里插入图片描述

1.3.4. 工作空间

工作空间是一个图形化设计区域,在这个空间,用户可以利用模块、模型、引脚和连接线来设计复杂的集成电路。工作空间由两个部分组成,一个是图形化设计视窗,一个是代码设计视窗,可以通过底端的“Graph”和“Code”选项卡进行切换。
在这里插入图片描述
在这里插入图片描述

1.3.5. 输出

输出窗口用来显示输出信息,包括错误信息和警告信息。
在这里插入图片描述
图1-3-6 输出窗口

1.4 Robei三元素

Robei用三个基本元素来代表Verilog里面的组成部分:模块、引脚和连接线。在Verilog语言里,电路用一系列模块(module)来描述。一个模块可以代表一个逻辑门,一个寄存器,一个ALU或者一个SOC系统。模块是一个抽象的芯片,在这个抽象的芯片上,又存在着抽象的引脚。引脚是模块中用来与外界通信的门户,每个引脚与其它的模块进行通信,都需要一个抽象的连接线。这个连接线可以是一根线,也可以是一个总线。

1.4.1. 模块

模块是设计流程中的基本元素,可以看作是一个黑盒子。在这个黑盒子里,设计者可以放置引脚用来做通信的门户,可以放置设计好的模型和输入实现该模块功能的算法代码。根据设计阶段分类,一个模块可以细分为不同的类型。正在开发的当前模块都是“Module”类型,但是一旦设计完毕,便会保存成“Model”,这个模型可以在其它的模块中使用,而且部分属性进行了写保护,不能随意修改。模块中还有其它的类型,包括含有激励代码,用来实现仿真的“Testbench”类型,实现FPGA引脚分配的“Constrain”类型。
在这里插入图片描述
(1)Module:Robei的基本类型,当前正在设计的集成电路模块,保存后自动变成“Model”,用户可以修改任何属性。
在这里插入图片描述
(2)Model:设计好的模块在其它模块中使用,自动变成“Model”类型。部分属性进行了写保护,但是用户还是可以修改其它的属性,如颜色、名称和参数等。
在这里插入图片描述
(3)Testbench:测试模块对于验证设计非常重要,测试模块用来给予激励,调用设计好的模块,用来验证设计结果。如果要看到仿真结果,请确保顶层激励模块的属性设置成“testbench”,否则看不到波形分析。
在这里插入图片描述
(4)Constrain:约束文件是用来对FPGA引脚进行分配的文件。因为每家FPGA厂商的引脚分配有不同的模式,所以Robei会根据不同的厂商自动生成对应于该厂商的引脚约束文件,但是在Robei软件上进行分配的方式是统一的。比如Xilinx ISE的引脚约束文件是UCF文件,Vivado的引脚约束文件是XDC文件,Altera的引脚约束文件是QSF文件。如果要分配的引脚是一个总线,用户可以在连接线上声明要分配的引脚在总线中的编号。
在这里插入图片描述
在引脚分配之前,用户需要在菜单“Settings”里面选择“FPGA”,用来选择正确的FPGA厂家。额外的约束可以用代码形式写在工作空间中的代码视窗中。
在这里插入图片描述
在菜单“View”的下拉菜单中选择“CodeView”, 就可以看到自动生成的引脚约束代码。
在这里插入图片描述

1.4.2. 引脚

引脚是一个抽象的概念,可以对应于物理芯片上的一根针,或者开发板上的一个连接口,或者芯片上的一个总线。引脚是模块的门户,是模块与外界通信的接口。引脚就如同在黑盒子上打孔,从外向内钻孔的时候,孔是外面大,里面小,这是输入。从内向外钻孔的时候,孔是里面大外面小,这就是输出。还有一种既可以输入也可以输出的,就是两个方向上同时钻孔,内外大小一样。
在这里插入图片描述
每个引脚的属性如图1-4-9所示。引脚的属性也有多种,如“reg”,“wire”,“supply”等。“Datasize”属性用来描述该引脚是单针还是总线。引脚只能在模块的边缘游走,不能进入模块也不能离开模块。当模块移动时,引脚也跟随移动。
注意:模型上的引脚的一些属性是写保护的,不能修改,但是位置和颜色信息可以随意调整。
在这里插入图片描述

1.4.3. 连接线

连接线用来连接两个引脚,并负责信号的传输。连接线就如同连接黑盒子上的两个孔的管子,两个孔之间要想水不洒出来,就需要密封的管子进行连接。集成电路也是一样,只不过集成电路使用的是导线连接,而流入流出的不再是水,而是电。
在这里插入图片描述
通常情况下,连接线会继承起始引脚的颜色和数据宽度信息,然后颜色渐变为目标引脚的颜色。根据数据宽度的不同,连接线的粗细也不尽相同。
在这里插入图片描述
模块、引脚和连接线是Robei的三元素,通过这三元素,Robei把复杂的集成电路设计简化到最简,进一步降低了对集成电路入门的要求,方便用户快速进入集成电路设计。

1.5 Verilog基础

1.5.1. 数据

(1)电路四种状态
Verilog用4个值来实现电平描述:0,1,Z和X。
在这里插入图片描述
(2)数值表示方法:位数+’+进制+值。
在这里插入图片描述
(3)数据类型
硬件的数据类型描述以驱动的方式来分类,常用的有两种:reg和wire。
在这里插入图片描述

1.5.2. 运算符

(1)逻辑运算符
在这里插入图片描述
(2)算术运算符
在这里插入图片描述
(3)比较运算符
在这里插入图片描述

1.5.3. 结构声明

由于Robei的存在,以下部分代码可以不用输入,省去用户的大量时间,但是用户需要了解这部分代码的存在。所以被省去的代码会在描述中提出。
1. 模块定义
Robei的每个框图代表一个模块,每个模块的声明都由“module”开始,然后是该模块的名称,之后的括号里面包含了输入和输出的引脚。最后要写上“endmodule”。
module dff(d,q,clk);
//这里开始编程
endmodule
在这里插入图片描述
2. 引脚定义
引脚的名称将会出现在模块定义的括号里面。模块定义完成后,在module和endmodule中间声明引脚的走向。箭头从外向内的是输入引脚,从内向外的是输出引脚,无箭头的是既可以做输入也可以做输出。有数据宽度的用中括号给出。紧接着,声明每个引脚信号的类型,一般是wire或者reg。
input p0;
inout p1;
output [3:0] p2;
wire p0;
wire p1;
reg [3:0] p2;
在这里插入图片描述
3. 连接线
连接线的定义是用连接线类型加上位宽和名称形成的,与引脚的类型定义类似,但是在Robei中,顶层模块与子模块的连接线可以不声明,直接连接引脚,所以部分连接线并不存在于代码中。
wire clkout_clk;
在这里插入图片描述
4. 例化
例化的时候根据模块的连接方式,确定每个引脚相连的引脚或者连接线,通过类似模块声明的方式进行例化。在例化的时候,有些时候需要空接一些信号,输入管脚悬空,该管脚输入为高阻 Z,输出管脚悬空,该管脚废弃不用。
Design u_2( .(端口1(u_1的端口1),
.(端口2(u_1的端口2),
.(端口3(u_1的端口3),
…… );
实际举例如DFF的例化:
DFF d1 (.Q(QS),
.Qbar ( ),
.Data (D),
.Preset ( ), // 该管脚悬空
.Clock (CK) );
在这里插入图片描述

1.5.4. 代码撰写

1. 赋值语句
常用的赋值语句如assign,assign起的作用是将一个信号与另外一个信号直接进行相连,任何信号的变化都是同步的。Assign中等号左边信号必须是wire型。
在这里插入图片描述
2. 分支语句
if else
类似于C语言中的if else 的写法。如果if else写全,就会生成寄存器,但是只有if没有else的语句,将会生成锁存器。在硬件设计中应该尽量避免锁存器的产生。当有多条语句存在于if else中间的时候,需要用begin end将多条语句进行包含,此时begin end相当于C语言中的{}。
在这里插入图片描述
Case
类似于C语言中的case 的写法。如果case写全并且default值设置好,就会生成寄存器,否则将会生成锁存器。
在这里插入图片描述
3. 循环语句
For
类似于C语言中的For 的写法。但是Verilog中,没有自加的语句,所以没有i++,只能用i=i+1。
在这里插入图片描述
While
类似于C语言中的While 的写法。While 语句在执行时,首先判断循环执行条件表达式是否为真,如果真,执行后面的语句块, 然后再重新判断循环执行条件表达式是否为真, 为真的话, 再执行一遍后面的语句块,如此不断,直到条件表达式不为真。
在这里插入图片描述
4. 初始化与重复执行
Initial

Verilog中用initial进行初始化,initial 只执行一次,在0时刻执行。主要用在仿真测试模块中。
在这里插入图片描述
Always
Verilog中always一直重复执行到程序结束。Always有自己的敏感信号列表,用[email protected](敏感信号1 or敏感信号2 or …)来表示,当敏感信号发生改变的时候更新状态。
在这里插入图片描述
只有寄存器类型的信号才可以在always和initial 语句中进行赋值,类型定义通过reg语句实现。
5. 阻塞式赋值与非阻塞式赋值
阻塞赋值( = )
在串行语句块中,阻塞赋值语句按照它们在块中的排列顺序依次执行,即前一条语句没有完成赋值之前,后面的语句不可能被执行,换言之,后面的语句被阻塞了。在always中begin…end语句块中所有语句是顺序执行的,阻塞赋值是在上一条语句完全完成之后,才开始执行下一条语句的。
在这里插入图片描述

非阻塞赋值( <= )

先计算右边表达式的值并暂存在一个暂存器中,iD的值被保存在一个寄存器中,而oQA当前的值被保存在另一个寄存器中,在begin和end之间所有语句的右边表达式都被计算并存储完后,对左边的寄存器变量的赋值才会进行。这样oQB得到的是oQA的原始值而不是iD。
在这里插入图片描述
1.5.5. 一个模块的总结
module 模块名(引脚1,引脚2,……);
input [数据宽度] 输入引脚;
output[数据宽度] 输出引脚;
parameter 参数=默认值;
reg[数据宽度] 寄存性信号;
wire[数据宽度] 非寄存性信号;
//例化写法
模型名称 #(参数1,参数2,……) 例化名 (
.模型引脚1(连接的信号1),
.模型引脚2(连接的信号2),
……
);
//其他描述算法
//assign
assign 信号1=信号2;

//if else
if (条件) begin
执行语句;
end else begin
执行语句;
end

//case
case (变量):
第一个值:执行语句;
第二个值:执行语句;
……
default:默认执行语句;
endcase

//while
while(条件)begin
执行语句;
end

//always
[email protected](敏感信号1 or 敏感信号2 or ……)
语句嵌套;

//for
for(i=0;i<10;i=i+1) begin
语句嵌套;
end

endmodule

以上只是简单的总结,学习的过程就是实践积累的过程,只有不断的练习,才能真正掌握集成电路设计。

1.6. 第一天的总结

第一天的学习任务非常的繁重也非常的基础,只有掌握好这一天的内容,才能够快速动手掌握其他的环节学习。第一天我们了解了EDA的发展历程,了解了Robei的特点和三元素,安装并注册了Robei软件和初步学习了Verilog语言,这对后续的学习打下了坚实的基础。后面的学习以动手为主,希望读者能亲自动手跟着学习。

1.5 Verilog基础
1.5.1. 数据
(1)电路四种状态
Verilog用4个值来实现电平描述:0,1,Z和X。

(2)数值表示方法:位数+’+进制+值。
进制 示例 解释
二进制 3’b101 三位二进制数101
八进制 9’o17 九位八进制数17,相当于十进制的15
十进制 12 不加任何符号代表十进制数,例子就是12
’d11 用d代表十进制,该数是十进制的11
十六进制 64’hff01 64位十六进制FF01,十进制相当于65281
表1-5-1 数值进制表示方法
(3)数据类型
硬件的数据类型描述以驱动的方式来分类,常用的有两种:reg和wire。

1.5.2. 运算符
(1)逻辑运算符
逻辑运算 运算符 例句
与 & y=a&b;
或 | y=a|b;
异或 ^ y=a^b;
非 ~ y=~a;
逻辑与 && y=a&&b;
逻辑或 || y=a||b;
逻辑非 ! y=!a;
表1-5-2 逻辑运算表
(2)算术运算符

算术运算 运算符 例句
加 + y=a+b;
减 - y=a-b;
乘 * y=a*b;
除 / y=a/b;
取余 % y=a%b;
左移 << y=a<<b;
右移 >> y=a>>b;
表1-5-3 算术运算表
(3)比较运算符
比较运算 运算符 例句
大于 > y=a>b;
小于 < y=a<b;
等于 == y=a==b;
大于等于 >= y=a>=b;
小于等于 <= y=a<=b;
不等于 != y=a!=b;
表1-5-4 比较运算表
1.5.3. 结构声明
由于Robei的存在,以下部分代码可以不用输入,省去用户的大量时间,但是用户需要了解这部分代码的存在。所以被省去的代码会在描述中提出。

  1. 模块定义
    Robei的每个框图代表一个模块,每个模块的声明都由“module”开始,然后是该模块的名称,之后的括号里面包含了输入和输出的引脚。最后要写上“endmodule”。
    module dff(d,q,clk);
    //这里开始编程
    endmodule

图1-5-1 模块的定义
2. 引脚定义
引脚的名称将会出现在模块定义的括号里面。模块定义完成后,在module和endmodule中间声明引脚的走向。箭头从外向内的是输入引脚,从内向外的是输出引脚,无箭头的是既可以做输入也可以做输出。有数据宽度的用中括号给出。紧接着,声明每个引脚信号的类型,一般是wire或者reg。
input p0;
inout p1;
output [3:0] p2;
wire p0;
wire p1;
reg [3:0] p2;

图1-5-2 引脚的定义
3. 连接线
连接线的定义是用连接线类型加上位宽和名称形成的,与引脚的类型定义类似,但是在Robei中,顶层模块与子模块的连接线可以不声明,直接连接引脚,所以部分连接线并不存在于代码中。
wire clkout_clk;

图1-5-3 连接线的定义,只有clkout_clk声明了
4. 例化
例化的时候根据模块的连接方式,确定每个引脚相连的引脚或者连接线,通过类似模块声明的方式进行例化。在例化的时候,有些时候需要空接一些信号,输入管脚悬空,该管脚输入为高阻 Z,输出管脚悬空,该管脚废弃不用。
Design u_2( .(端口1(u_1的端口1),
.(端口2(u_1的端口2),
.(端口3(u_1的端口3),
…… );
实际举例如DFF的例化:
DFF d1 (.Q(QS),
.Qbar ( ),
.Data (D),
.Preset ( ), // 该管脚悬空
.Clock (CK) );

图1-5-4 例化声明
1.5.4. 代码撰写

  1. 赋值语句
    常用的赋值语句如assign,assign起的作用是将一个信号与另外一个信号直接进行相连,任何信号的变化都是同步的。Assign中等号左边信号必须是wire型。

图1-5-5 always语句
2. 分支语句
if else
类似于C语言中的if else 的写法。如果if else写全,就会生成寄存器,但是只有if没有else的语句,将会生成锁存器。在硬件设计中应该尽量避免锁存器的产生。当有多条语句存在于if else中间的时候,需要用begin end将多条语句进行包含,此时begin end相当于C语言中的{}。

图1-5-6 if else语句
Case
类似于C语言中的case 的写法。如果case写全并且default值设置好,就会生成寄存器,否则将会生成锁存器。

图1-5-7 Case语句
3. 循环语句
For
类似于C语言中的For 的写法。但是Verilog中,没有自加的语句,所以没有i++,只能用i=i+1。

图1-5-8 For语句
While
类似于C语言中的While 的写法。While 语句在执行时,首先判断循环执行条件表达式是否为真,如果真,执行后面的语句块, 然后再重新判断循环执行条件表达式是否为真, 为真的话, 再执行一遍后面的语句块,如此不断,直到条件表达式不为真。

图1-5-9 While语句
4. 初始化与重复执行
Initial
Verilog中用initial进行初始化,initial 只执行一次,在0时刻执行。主要用在仿真测试模块中。

图1-5-10 initial语句
Always
Verilog中always一直重复执行到程序结束。Always有自己的敏感信号列表,用[email protected](敏感信号1 or敏感信号2 or …)来表示,当敏感信号发生改变的时候更新状态。

图1-5-11 always语句
只有寄存器类型的信号才可以在always和initial 语句中进行赋值,类型定义通过reg语句实现。
5. 阻塞式赋值与非阻塞式赋值
阻塞赋值( = )
在串行语句块中,阻塞赋值语句按照它们在块中的排列顺序依次执行,即前一条语句没有完成赋值之前,后面的语句不可能被执行,换言之,后面的语句被阻塞了。在always中begin…end语句块中所有语句是顺序执行的,阻塞赋值是在上一条语句完全完成之后,才开始执行下一条语句的。

图1-5-12 阻塞式赋值语句

非阻塞赋值( <= )

先计算右边表达式的值并暂存在一个暂存器中,iD的值被保存在一个寄存器中,而oQA当前的值被保存在另一个寄存器中,在begin和end之间所有语句的右边表达式都被计算并存储完后,对左边的寄存器变量的赋值才会进行。这样oQB得到的是oQA的原始值而不是iD。

图1-5-12 非阻塞式赋值语句

1.5.5. 一个模块的总结
module 模块名(引脚1,引脚2,……);
input [数据宽度] 输入引脚;
output[数据宽度] 输出引脚;
parameter 参数=默认值;
reg[数据宽度] 寄存性信号;
wire[数据宽度] 非寄存性信号;
//例化写法
模型名称 #(参数1,参数2,……) 例化名 (
.模型引脚1(连接的信号1),
.模型引脚2(连接的信号2),
……
);
//其他描述算法
//assign
assign 信号1=信号2;

//if else
if (条件) begin
执行语句;
end else begin
执行语句;
end

//case
case (变量):
第一个值:执行语句;
第二个值:执行语句;
……
default:默认执行语句;
endcase

//while
while(条件)begin
执行语句;
end

//always
[email protected](敏感信号1 or 敏感信号2 or ……)
语句嵌套;

//for
for(i=0;i<10;i=i+1) begin
语句嵌套;
end

endmodule

以上只是简单的总结,学习的过程就是实践积累的过程,只有不断的练习,才能真正掌握集成电路设计。

1.6. 第一天的总结
第一天的学习任务非常的繁重也非常的基础,只有掌握好这一天的内容,才能够快速动手掌握其他的环节学习。第一天我们了解了EDA的发展历程,了解了Robei的特点和三元素,安装并注册了Robei软件和初步学习了Verilog语言,这对后续的学习打下了坚实的基础。后面的学习以动手为主,希望读者能亲自动手跟着学习。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hanxianshengdedie/article/details/87798114

智能推荐

利用qt自带的sqlite实现log类的封装_GreenHandBruce的博客-程序员信息网

硬件:DELL insprion 14R系统:ubuntu 16.04LTS开发环境:qt creator 4.3.1 / qt 5.9.1该工程功能如下:1.封装了一个单独的类负责记录log2.该类将log保存到sqlite数据库中,数据库的表包括“id,时间戳,日期,时间,log等级,log内容”,变量类型如下:(id INTEGER PRIMARY KEY autoincremen...

图像形态学之腐蚀算子_armsnow的博客-程序员信息网_腐蚀算子

数字形态学是由一组形态学代数运算子组成的。最基本的形态学算子有:腐蚀(erosion)、膨胀(dilation)、开(opening)、闭(closing)和骨骼(skelton).HALCON的形态学运算有基于二值图区域的形态学算子和基于灰度区域的形态学算子。1、腐蚀 腐蚀在数字形态学运算的作用是消除物体边界点。如果结构元素去3*3的黑点块,腐蚀将使物体的边界沿周边减少一个像素。 腐蚀可以把小于..._1671465600

numpy 学习汇总10-dtype数据类型 ( 基础学习 tcy)_tcy23456的博客-程序员信息网_dtype参数有哪些

numpy.dtype创建    2018/6/21 修改:2018/12/6dtype属性参考本人博文 ‘dtype属性’1.函数:   class numpy.dtype(obj,[align = False,copy = False])#创建一个数据类型newbyteorder([new_order='S']) #用不同的字节...

matlab学习笔记---之fread函数_zxyhhjs2017的博客-程序员信息网_matlab中fread函数

MATLAB函数编辑功能:转载:https://baike.baidu.com/item/fread/10942353?fr=aladdinfread函数可从文件中读取二进制数据语法:A = fread(fid, count)A = fread(fid, count, precision)其中fid为指针所指文件中的当前位置,co

python_量化交易_舆情分析_百度情绪分析_分析股票利好利空比例_AI信仰者的博客-程序员信息网

1、摘要本文主要内容:使用百度情绪分析接口评估股票近半年的新闻,评估新闻属于利好还是利空,最终统计利好和利空的比例,供选股做参考本文福利:赠送百度AppID:应用的唯一标识AppKey:公匙(相当于账号)AppSecret:私匙(相当于密码)2、主要思路选择自己要评估的股票代码数组从金融界行情中心获取股票新闻信息得到页面的内容并保存调用百度云自然语言处理接口,进行情感倾向分析统计利好和利空的比例3、代码import osimport reimport lxml # 一个Py

随便推点

python脚本生成.app(Mac)或.exe(Windows)文件_superY25的博客-程序员信息网

生成mac版可执行文件.app1、安装py2apppip3 install py2app2、进入到需要转换的.py脚本文件所在目录执行如下命令py2applet --make-setup ***.py执行上面的命令后会生成build和dist目录,所以为了避免缓存造成影响,在执行上面命令之前先删除这两个文件rm -rf build dist3、最后执行下面命令python s...

C#(CSharp) 微信公众号开发一 基本配置_LKZღ木子李的博客-程序员信息网_c#微信公众号开发

准备工作:打开官网创建自己的微信公众号官网创建公众号完成打开基本配置-&gt;填写服务器配置1.说明:URL: 填写自己的服务器的地址,可以接收到微信服务器发送的信息 笔者使用腾讯云的云服务器,新手还挺便宜的腾讯云官网Token: 用来验证微信发送的信息和获得公众号的Access_TokenEncodingAESKey:加密密钥,微信回通过这个密钥把数据加密后,把数据传送给...

composer查看镜像地址_璞~的博客-程序员信息网

composer查看全局设置:composer config -gl镜像用法有两种方式启用本镜像服务:系统全局配置:即将配置信息添加到 Composer 的全局配置文件config.json中。见“方法一” 单个项目配置:将配置信息添加到某个项目的composer.json文件中。见“方法二”方法一:修改 composer 的全局配置文件(推荐方式...

Android:系统分辨率的修改_linking530的博客-程序员信息网_android7.1 分辨率设置

分辨率修改涉及两个概念:密度和尺寸 每个项目密度定义路径:customize/customer_cfg/sp8810ga/res/system.prop # 1 => add volume control in in-call screenro.sprd.volume_control_icon = 1#LCD_Density for WGVAro.sf.lcd_de

npm - npm i时提示sha512错误_小爱同学-Allen的博客-程序员信息网_npm sha512

npm ERR! code EINTEGRITYnpm ERR! sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== integrity checksum failed when using sha512: wanted sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZV

Spring Security Oauth2 如何自定义授权获取token_风雨断肠草的博客-程序员信息网_org.springframework.security.oauth2.provider.code.

Oauth2的默认授权模式有四种:授权码模式-authorization_code 密码模式-password 客户端模式-client_credentials 隐式授权模式-implicit我们先看一下获取token的运行流程:(1)在发起 URL+/oauth/token 获取token的请求后,实际上是请求 TokenEndpoint 类的postAccessToken或者g...

推荐文章

热门文章

相关标签