tag 标签: 夏宇闻

相关博文
  • 热度 16
    2013-8-1 11:05
    1508 次阅读|
    0 个评论
    夏宇闻《 verilog 数字系统设计教程》语法注意事项 — 总结 第三章:数据类型及其常量和变量 1 )网络( wire )类型的变量不能存储值,而且必须受到驱动器(如门,连续赋值语句)的驱动,否则默认情况下其值为高阻 Z 。 2 )寄存器( reg )是数据存储单元的抽象,默认初始值为不定态 X 。 always 赋值语句中的每个信号都必须为 reg 类型。 Reg 的数据可以赋值为正,也可以赋值为负,当一个 reg 数据是一个表达式中的操作数时,它的值被当做无符号值,如一个 4 位的 reg ,初始化时赋值 -1 ,表达式进行计算时值被默认为 +15 。 3 )对存储器( reg mem )进行地址索引的表达式必须是常数表达式。 第四章:运算符、赋值语句和结构说明 1 )不同长度的数据进行位运算,系统会自动的将数据按右端对齐,位数少的操作数在相应高位用 0 填满,以使两个操作数据按位进行操作。 2 )一个 m 位的数左移 n 位,则移位后要用 m+n 位的数表示才可,一个 m 位的数右移 n 位后,仍可用 m 位表示。 3 )非阻塞赋值语句( = )上面的赋值语句不能被下面立即使用,块操作完后才能完成这次赋值操作,所赋值是上一次得到的,在编写可综合时序逻辑时,这是常用的赋值方法。 4 )阻塞赋值语句( = )赋值语句执行完块才结束,在赋值语句执行完立刻生变,时序逻辑中使用时会产生意想不到的结果。 Always @ ( posedge clk )             Begin                              b=a;                              End         和 Always @ ( posedge clk ) Begin b=a; End 综合结果实际上是一样的                        但是, Always @ ( posedge clk )             Begin                              b=a;     c=b;                        End         和 Always @ ( posedge clk ) Begin b=a; c=b; End 综合结果却不同,   写代码时一定要注意!! 5 ) begin end 用于标识顺序执行的语句,也就是说 begin end 内的语句是顺序执行的,被称为顺序执行块; fork_jion 语句用来标识并行执行的语句,也就是说 fork_jion 内的语句是并行执行的,被称为并行执行块。顺序执行块的起始时间是第一条语句开始执行的时间,结束时间是最后一条语句执行完的时间,并行执行块的每条语句开始时间是相同的,结束时间是按时间排序在最后结束的语句的执行时间。 第五章:条件语句、循环语句、块语句和生成语句 1 )条件语句必须在过程语句块中使用( initial , always ),其他地方不能使用。 2 ) initial 语句只执行一次, always 语句不断重复的执行。 第六章:结构语句、系统任务、函数语句和显示系统任务 1 )新版 verilog1364-2001 版的语法中 always 语句中的关键词“ or ”也可以用“,”来代替。也可以用 always@(*) 表示所有的敏感列表。 2 )函数的定义不能包含任何的时间控制语句,即任何使用 # , @ ,或 wait 来标识的语句。函数只能与主模块共用一个仿真时间,而任务可以定义自己的仿真时间。函数不能启动任务,任务能启动其他任务和函数。函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量。函数返回一个值,而任务不返回任何值。                          第十四章 深入理解阻塞与非阻塞赋值的不同 1)   在描述组合逻辑的 always 块中用阻塞赋值,则综合成组合逻辑的电路结构; 2)   在描述时序逻辑的 always 块中非阻塞赋值,则综合成时序逻辑的电路结构; 为什么一定要这样做,为的是保证综合前仿真和综合后仿真一致的缘故。如果不 按照上面的要求做,也有可能综合出正确的逻辑,但前后仿真结果不一致。 3)   阻塞赋值过程中,先计算右值,这时赋值语句不允许任何别的 verilog 语句的干扰,直到现行的赋值语句完成时刻,即把右值赋给左值时,它才允许别的赋值语句执行,所谓阻塞赋值从概念上讲后面的赋值语句是在前一句结束后才开始赋值的。 4)   非阻塞赋值过程中,在赋值操作开始的时刻计算非阻塞赋值语句的右值,赋值操作结束后才更新左值,相当于在赋值语句结束时刻将右值集体赋给左值,在计算右值期间不影响其他语句的执行(如计算右值)。 5)   Verilog 编程要点: 1 、时序电路建模时,用非阻塞赋值; 2 、锁存器电路建模时,用非阻塞电路赋值; 3 、 always 块建立组合逻辑时,用阻塞赋值; 4 、 always 块又有时序逻辑又有组合逻辑时用非阻塞; 5 、不要在多个 always 语句中对同一个变量赋值。 触发器电路: Always @(posedge clk) Begin   Q=d; End 锁存器电路: Always @(en,d) Begin   If (en)Q=d; end
  • 热度 27
    2013-4-25 13:14
    4430 次阅读|
    2 个评论
    之前因为项目中FPGA开发的需要,学习了夏宇闻教授的《Verilog数字系统设计教程》,大约在2011年底初略学习完第一遍,到现在已经一年多了。温故而知新,于我来说不一定知新,但温故肯定会更牢固。   首先,给大家说说什么是FPGA,什么是Verilog.   FPGA(现场可编程门阵列)就是可灵活的、几乎可全配置的数字芯片,能实现定制的数字体系功能。   而Verilog是是一种硬件描述语言(HDL). 通过Verilog语言和综合工具,人们可以从底层的门级电路设计彻底解放出来,目前解放到了寄存器级,以后肯定会实现在更高级的解放。   Verilog是目前最流行的数字体系设计语言。形象的比喻:Verilog相当于一门“外语”,而FPGA编译器是能听懂Verilog这门外语的“老外农民”,FPGA相当于一块有限资源,有限面积的“试验田地”。这个“老外农民”在FPGA这个田地里,能把Verilog的描述生成相应的农作物--“电路”,并能开花结果,收成可观。   1、以绪论为引,整书主体分为4部分 :Verilog数字设计基础、设计和验证部分、设计示范和实验练习题、语法篇。一本书的结构是否齐全,是否条理清晰,结构是否有机关联,是否经典实用,作者的水平及用心,往往从目录就能看出许多。夏老师的这本书的确是学习Verilog的经典教材。看目录建议从大处着手,对整个书的全局有一个初步印象。书中每一章最后都有小结,小结都是每一章的精华知识点。   2、整书的回顾。 第一部分主要是Verilog常用到的语法及结构。Verilog的特点是风格与C相似,学过C的人很快能上手。不同是:C语言是顺序执行,更加抽象,花样很多,这是因为C语言后面有一个强大的操作系统和运行环境。Verilog则不同,可以把Verilog的程序内容分为两部分:一部分是于运行软件和环境相关,如“系统任务和编译预处理”这部分对硬件出身的初学者比较复杂,可以于C接口,往往不可综合;另一部分是所要的设计对象,通过综合后有实际硬件相对应的可综合部分,这部分主要是组合逻辑和时序逻辑以及各模块及其形成的顶层结构,这部分 与硬件直接相关,是对硬件实体的描叙。   第1章:《Verilog的基本知识》,讲述了Verilog HDL的历史,与VHDL的比较,其设计的优点,设计流程。Verilog因为形成了标准化而兼容各个厂商,使用上能够与工艺具体参数等无关,加上广泛的C语言基础人群(泛C联盟),所以Verilog在数字设计中比重越来越重。System Verilog的出现更是集成了设计、验证等诸多功能,更适合于可重用的IP设计及验证。具体的知识点是要理解Top_Down的设计概念。在顶层设计中,自己的体会是有两层:1、整个顶层的行为及功能需求。2、对应的顶层硬件架构和子模块来支撑这个功能需求。Top-Down的系统难点在于Top层的规划,Down的难点在于细节的把握和算法的实现。Top层的规划,特别是大型的数字系统设计,这需要系统设计方法论的熟悉和有关系统的知识。其中一个典型的系统设计方法论的例子是:控制,输入,输出要分开来进行划分。应用系统方法的设计在扩展升级性,问题定位及维护性,设计重用性等方面上会有更好的性能。 实际设计中,自己体会到的细节工具有:流程图设计、电路结构图设计、波形时序图设计。   第2章:《Verilog语法的基本概念》,将实际电路抽象影射为5个级别2类型:行为描述类型:(1)系统级、(2)算法级、(3)RTL级;结构描述类型:(4)门级 (5)开关级。描述了模块的基本结构。基本概念如:并行性,层次结构性,可综合性及测试模块。   第3章:《模块的结构、数据类型、变量和基本运算符号》,模块分为端口I/O说明,内部信号声明和逻辑功能定义。逻辑产生的三种方式:用连续赋值assign语句、用实例元件、用always块。三种方式产生的所有逻辑均通过变量名来进行相互连接。共有19种数据类型: reg, wire, integer, parameter ; large, medium, scalared,time,small,tri,tio,tirl,triand,trior,trireg,vectored,wand,wor,memory型。最常用的是前面4种。后面15种大多与基本逻辑单元建库相关。而所有数据又可以分为常量(主要为数字和parameter)和变量(wire,reg,memory型等)。Assign或门驱动的变量主要wire型。而always模块内赋值的必须定义为reg型。Memory型用于存储器建模,如reg mema 。运算符的含义及优先顺序,运算符分算术运算、位运算、逻辑/关系运算等等。运算符分单目,双目,三目运算符。注意“=”是否是“非阻赛赋值”还是“小于等于”是取决于所在语句的位置,所以应用上不会混乱。   第4章:《运算符、赋值语句和结构说明语句》,学习的要点是赋值语句和块语句。   第5章:《条件语句、循环语句、块语句与生成语句》,这章是设计应用中最重要的语法。if_else语句,这种语句综合出来为条件判断控制的多路器Mux. else总是和上面最近的if配对。当只有if无else时,组合逻辑会综合成锁存器。Case语句是多分支选择语句,类似于C语言中的switch(表达式)-case常量N:语句N;语法上更简洁,为case(表达式)-常量N:语句N; default: 语句; endcase。不同的是Verilog中是硬件跳转。case相当于If_else语句的并行扩展。不同的是else-if是1bit控制位,2选1的选择器;而case是多bit位,多选择的多路器。同样,组合逻辑中case缺乏default项容易生成锁存器。Verilog中的循环语句有四种:forever,repeat, while, for语句。因为自己对其生成对应的硬件结构不甚清楚,往往在可综合语言中,循环语句用得很少,一般都用if-else语句来代替。顺序块begin-end和并行块fork-join、生成块generate-endgenerate。   第6章:《结构语句、系统任务、函数语句和显示系统任务》。有4种结构说明语句:initial,always,task,function.其中可综合设计中always是最常用,task及function通过封装功能和调用,能够增强程序的可读性和提高编程效率,initial在testbench中能实现初始化。注意关键词“or”“,”只能用于always@()中,而条件逻辑判断需要用”||”,有一次弄混了,编译不通过。系统任务主要用于测试模块及验证。   第7章:《调试用系统任务和常用编译预处理语句》。主要用于测试模块的编写。其中感觉用的比较多的有$random,`define,`timescale,$readmemb,`include等。   第8章:《语法概念总复习练习》。有28道练习题。   第9章:《Verilog HDL模型的不同抽象级别》,叙述了门级结构描述,行为描述建模。   第10章:《如何编写和验证简单的纯组合逻辑模块》,讲述了加法器、乘法器,比较器、多路器等的设计。介绍了总线操作和流水线。   第11章:《复杂数字系统的构成》,初步介绍数字系统的概念,如组合逻辑,时序逻辑,数据保存及流动,同步时序体系。要点在于理解同步时序逻辑的意义。同步方法有:1,建立同步机制,如采用RAM和FIFO缓存.2,同步码或同步信号线。3、异步时钟域间数据传输需要注意同步。   第12章:《同步状态机的原理、结构和设计》,这一章开始讲述状态机。简单模块往往两段或一段写完;复杂模块推荐状态机的三段式写法:“初始状态和current_state=next_state”模块,“输入及状态转移”模块,“状态及输入控制输出”模块。独热码的使用。例12.4应该好好学习,三段式的好处在于解耦了各个要素,便于查错,优化与修改。也就是:第一部分说明初始状态,current_state=next_state,第二部分是状态机的状态转化的描述,第三部分是每一步状态的组合逻辑的描述。这样写调理更加清晰,也更加利于综合器综合。   第13章:《设计可综合的状态机的指导原则》,描述能更好地可综合的实际设计要求:状态机应该由唯一时钟触发;不要使用综合工具来设计异步状态机。Always块中应该避免组合反馈回路,曾经设计遇到综合后告警combinational loop问题,就是形成了组合反馈回路。状态机的置位和复位。   第14章:《深入理解阻塞和非阻塞赋值的不同》,在可综合中,非阻塞赋值事实上是寄存器在时钟跳变沿赋值,但它本身的原值未变,可以作为其他寄存器的输入。就是寄存器的值从时钟沿到来到其值的改变需要一定的时间,而时钟沿的沿及skew肯定需要少于这个时间。而阻塞赋值是我们通常意义上的赋值,这个值变化之后,后面的句子引用它得到的也是变化后的值。往往时序逻辑采用非阻塞赋值,而组合逻辑采用阻塞赋值。   第15章:《较复杂时序逻辑电路设计实践》,开始讲叙实际设计例子。如序列检测,I2C总线接口设计,I2C例子学习对工作中深入理解I2C总线的工作原理很有帮助。   第16章:《复杂时序逻辑电路设计实践 》,是15章的继续深入和扩展。继续深入I2C总线的Verilog设计,介绍了EEprom 读写所用的I2C接口的Verilog程序。讲解了EEprom的行为模型,EEprom_WR读写器的可综合Verilog模型,内部读写总线的信号源模块,最终用顶层将这三者连接起来,形成一个可仿真的小系统。真正需要的部分为EEprom_WR读写器的可综合Verilog模型,但为了得到正确的读写器的可综合模型,需要一个环境来验证这个模型的正确性,所以有信号源和EEprom的行为模型。认真学习能有很多收获,自己在这章中收获不少,使用设计技巧自觉有两点:1、采用FF来进行标志一段程序(如任务)的完成与否。2、可以判断自己,之后的语句中又可以改变掉自己。这在后续在项目中设计SPI接口程序时得以应用。   第17章:《简化的RISC_CPU设计》,这一章更为系统,使得原来很神秘的CPU清晰地展示它的原理和基本组成,涉及的知识有计算机结构和相关体系控制。当然实际的CPU或者软核,比这个要复杂的多,但基本原理相通。系统学是一门很深的学问,涉及系统的划分和配合。划分相当于复杂问题的解耦,而配合需要可靠稳定的接口。这都需要很深的理解。一句话:系统需要模块化设计,而模块化需要稳定可靠的标准化的接口。   第18章:《虚拟仪器/接口、IP和基于平台的设计方法及其在大型数字系统设计中的应用》,介绍了复杂系统设计的手段和工具:软/硬IP核,宏单元,虚拟仪器和接口。IP分为设计IP和验证IP. 介绍了虚拟接口联盟(VSIA)的组织。主要的IP供应商。   第三部分是《设计示范与实验练习》,像练习12,利用SRAM设计一个FIFO,有一年华为海思招聘数电的一道笔试题就是考FIFO的设计,这个在对外部高速接口的同步设计中几乎是必须的。第四部分是语法篇,讲述了Verilog HDL IEEE 1364标准,Verilog语言的参考手册。其中在408页有一个有趣的算法相关的例子 Pythagoras(x,y,z)。计算平方和的开方根,采用了迭代的计算方法,让我看了好半天才看懂其原理,但这个应该是不能综合的模块没,迭代的方法是不是属于数值计算?可惜没有正式学过这方面系统的知识。   本文的最后强烈推荐一下夏教授夏老师主持的论坛:http://bbs.eeworld.com.cn/thread-222470-1-1.html,有志于学习Verilog和FPGA的同学可以上去浏览和咨询问题。夏教授是中国推广Verilog的第一人。也是一个很热心和乐于助人和做实事的老教授,现已退休,一直在为强大中国的数字系统设计事业做出无私、持续、开创性的贡献。希望大家一起来支持发展这个事业。我当初是因为项目开发的需求,买了夏老师的教材,学习了他的书的过程中,又因为一些不懂的问题,斗胆发邮件请教老师,没想到老师能抽出宝贵的时间给我作答和解惑,因为那时还不知道他的论坛(如果有技术问题,希望大家去论坛问而不是邮件,这样可以节约老师的时间,统一作答;同时论坛里有许多案例可供学习),这样我也算是老师的弟子。后来又知道夏老师在“北京至芯科技”做培训事业,有志于此而有条件的,强烈推荐可以去参加老师的培训(约三个月),当当夏老师的 最后几批关门弟子。  
相关资源
  • 所需E币: 0
    时间: 2023-5-22 15:50
    大小: 12.05MB
    上传者: Fx
    VerilogFPGA  数字设计 
  • 所需E币: 1
    时间: 2022-9-29 20:09
    大小: 8.11MB
    上传者: 西风瘦马
    Verilog数字系统设计教程(经典第二版)夏宇闻.pdf
  • 所需E币: 0
    时间: 2021-9-15 19:20
    大小: 43.78MB
    上传者: Argent
    FPGA是一个技术密集型的行业,没有坚实的技术功底,很难形成有竞争力的产品。从技术上来看FPGA未来的发展有广阔的空间,嵌入式开发需要了解不同领域的产品工作原理,包括快速读懂数据手册,搜集了部分数据手册,第三方教育机构的指导性文档,希望对您有所帮助。
  • 所需E币: 1
    时间: 2021-4-26 00:25
    大小: 44.22MB
    上传者: Argent
    电子产品日新月异,不管是硬件工程师还是软件工程师,基本的模电、数电知识也是必备的条件,从二极管到三极管,从单片机到多核MCU,3G网络到5G产品的普及,不管电子产品的集成度怎么高,其产品还是少不了电阻电容电感,每个元器件在电路中必然有其作用,有兴趣了解的网友,下载学习学习吧。
  • 所需E币: 5
    时间: 2020-10-4 10:19
    大小: 7.07MB
    上传者: Jack陈
    Verilog数字系统设计教程(第二版)夏宇闻,很好很经典的教程。
  • 所需E币: 3
    时间: 2020-1-4 23:17
    大小: 810.7KB
    上传者: givh79_163.com
    夏宇闻著作:从算法设计到硬线逻辑的实现……
  • 所需E币: 5
    时间: 2020-1-4 23:28
    大小: 340.34KB
    上传者: quw431979_163.com
    北航夏宇闻Verilog教程课件……
  • 所需E币: 5
    时间: 2019-12-25 03:06
    大小: 811.42KB
    上传者: wsu_w_hotmail.com
    从算法设计到硬线逻辑的实现……
  • 所需E币: 3
    时间: 2019-12-25 03:06
    大小: 2.51MB
    上传者: quw431979_163.com
    从算法设计到硬线逻辑的实现……
  • 所需E币: 3
    时间: 2019-12-25 02:23
    大小: 461.46KB
    上传者: rdg1993
    夏宇闻著作:从算法设计到硬线逻辑的实现Verilog_HDL的基本语法.pdf第三章VerilogHDL基本语法--------------------------------------------------------------------------------------------------------------------------------------------------第三章VerilogHDL的基本语法前言VerilogHDL是一种用于数字逻辑电路设计的语言。用VerilogHDL描述的电路设计就是该电路的VerilogHDL模型。VerilogHDL既是一种行为描述的语言也是一种结构描述的语言。这也就是说,既可以用电路的功能描述也可以用元器件和它们之间的连接来建立所设计电路的VerilogHDL模型。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们对应的模型类型共有以下五种:系统级(system):用高级语言结构实现设计模块的外部性能的模型。算法级(algorithm):用高级语言结构实现设计算法的模型。RTL级(RegisterTransferLevel):描述数据在寄存器之间流动和如何处理这些数据的模型。门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。一……
  • 所需E币: 3
    时间: 2019-12-25 02:27
    大小: 12.99MB
    上传者: 二不过三
    verilogHDL设计……