verilog语法学习心得(写写帮推荐)

时间:2019-05-12 01:09:29下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《verilog语法学习心得(写写帮推荐)》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《verilog语法学习心得(写写帮推荐)》。

第一篇:verilog语法学习心得(写写帮推荐)

这是我在查verilog的有符号数和无符号数时看到的,觉得很好,转载于此,共同学习

-----------------------------verilog语法学习心得

1.数字电路基础知识: 布尔代数、门级电路的内部晶体管结构、组合逻辑电路分析与设计、触发器、时序逻辑电路分析与设计

2.数字系统的构成: 传感器

AD 数字处理器

DA 执行部件

3.程序通在硬件上的执行过程:

C语言(经过编译)-->该处理器的机器语言(放入存储器)-->按时钟的节拍,逐条取出指令、分析指令、执行指令

4.DSP处理是个广泛概念,统指在数字系统中做的变换(DFT)、滤波、编码解码、加密解密、压缩解压等处理

5.数字处理器包括两部分:高速数据通道接口逻辑、高速算法电路逻辑

6.当前,IC产业包括IC制造和IC设计两部分,IC设计技术发展速度高于IC设计

7.FPGA设计的前续课程:数值分析、DSP、C语言、算法与数据结构、数字电路、HDL语言 计算机微体系结构

8.数字处理器处理性能的提高:软件算法的优化、微体系结构的优化

9.数字系统的实现方式:

编写C程序,然后用编译工具得到通用微处理器的机器指令代码,在通用微处理器上运行(如8051/ARM/PENTUIM)

专用DSP硬件处理器

用FPGA硬件逻辑实现算法,但性能不如ASIC

用ASIC实现,经费充足、大批量的情况下使用,因为投片成本高、周期长

10.FPGA设计方法: IP核重用、并行设计、层次化模块化设计、top-down思想

FPGA设计分工:前端逻辑设计、后端电路实现、仿真验证

11.matlab的应用:

matlab中有许多现成的数学函数可以利用,节省了复杂函数的编写时间

matlab可以与C程序接口

做算法仿真和验证时能很快生成有用的数据文件和表格

DSP builder可以直接将simulink模型转换成HDL代码,跳过了中间的C语言改写步骤 12.常规从算法到硬件电路的开发过程:

算法的开发

C语言的功能描述

并行结构的C语言改写

verilog的改写

仿真、验证、修正

综合、布局布线、投入实用

13.C语言改写成verilog代码的困难点:

并行C语言的改写,因为C本身是顺序执行,而不是并行执行

不使用C语言中的复杂数据结构,如指针

目前有将C语言转换成verilog的工具?

14.HDL

HDL描述方法是从电路图描述方法演化来的,相比来说更容易修改

符合IEEE标准的有verilog HDL和VHDL

VHDL由美国国防部开发,有1987和1993两个版本

verilog由cadence持有,有1995、2001、2005三个版本

verilog较VHDL更有前景:具有模拟电路描述能力、不仅可以开发电路还可以验证电路、门级以下描述比VHDL强

RTL级和门级的综合已经成熟,主要是注意行为级的综合结果,使用可综合的编程风格

SYSTEM VERILOG是VERILOG的一种延伸

15.IP核的应用:

软核soft core: 功能经过验证的、可综合的、实现后门数在5K以上的HDL代码

固核firm core: 功能经过验证的、可综合的、实现后门数在5K以上的电路结构编码文件,如edif,不可更改

硬核hard core: 功能经过验证的、可综合的、实现后门数在5K以上的电路结构版图,已带工艺参数,不可更改

16.HDL语言综合后得到EDIF,这是一种标准电路网表

EDIF经过具体工艺库匹配、布局布线、延时计算后得到网表

EDIF不可更改,作为固核存在

17.verilog特点:

区分大小写,所有关键字都要求小写

不是强类型语言,不同类型数据之间可以赋值和运算

//是单行注释

可以跨行注释

描述风格有系统级描述、行为级描述、RTL级描述、门级描述,其中RTL级和门级别与具体电路结构有关,行为级描述要遵守可综合原则

门级描述使用门级模型或者用户自定义模型UDP来代替具体基本元件,在IDE中针对不同FPGA器件已经有对应的基本元件原语

18.verlog语法要点:

module endmodule之间由两部分构成:接口描述和逻辑功能描述

IO端口种类: input output inout

相同位宽的输入输出信号可以一起声明,input[3:0] a,b;不同位宽的必须分开写

内部信号为reg类型,内部信号信号的状态: 0 1 x

z,3'bx1=3'bxx1 x/z会往左扩展

3'b1=3'b001 数字不往左扩展

逻辑功能描述中常用assign描述组合逻辑电路,always既可以描述组合逻辑电路又可以描述时序逻辑电路,还可以用元件调用方法描述逻辑功能

always之间、assign之间、实例引用之间以及它们之间都是并行执行,always内部是顺序执行

常量格式: <+/-><二进制位宽><'><进制><该进制的数值>:

默认进制为10进制

默认位宽为32位

位宽是从二进制宽度角度而言的

由位宽决定从低位截取二进制数2'hFF=2'b11,通常由被赋值的reg变量位宽决定

parameter常用于定义延迟和变量位宽,可用常量或常量表达式定义

变量种类: wire reg memory

IO信号默认为wire类型,除非指定为reg类型

wire可以用作任何输入输出端口

wire包括input output inout

wire不带寄存功能

assign赋值语句中,被赋值的信号都是wire类型

assign之所以称为连续赋值,是因为不断检测表达式的变化

reg类型可以被赋值后再使用,而不是向wire一样只能输出,类似VHDL中的buffer端口

reg类型变量初始值为x(VHDL中初始值为本类型最小值,通常是0)

always模块里被赋值的信号都必须定义为reg类型,因为always可以反复执行,而reg表示信号的寄存,可以保留上次执行的值

reg类型变量与integer变量不同,即使赋负值,实质上也是按二进制无符号数存储的,integer是有符号数

verilog中所有内部信号都是静态变量,因为它们的值都在reg中存储起来了

memory型只有一维数组,由reg型变量组成

memory初始化只能按地址赋值,不能一次性赋值

1*256的memory写法: reg mema[255:0]

mema[3]=0;

不同位宽的变量之间赋值,处理之前都以被赋值的变量位宽为准扩展或截取

A[a:b] 无论a b谁大,a总是实际电路的信号高位,b总是实际电路的信号低位

算术运算中如果有X值则结果为X

for循环中的变量另外定义成integer,因为它不是实际信号,有正负;reg则以无符号数存在

== 和!=只比较0、1,遇到z或x时结果都为x(x在if中算做假条件),结果可能是1、0、x

===和!==比较更加苛刻,包括x和z的精确比较,结果可能是0、1

&&的结果只有1'b1或1'b0两种,A&A的结果位宽则是与A相同的{1,0}为 64'h100000000,所以拼接运算中各信号一定要指定位宽

移位运算左移将保留 4'b1000<<1等于5'b10000,右移则舍弃 4'b0011等于4'b0001

数字电路里位运算应用普遍,包括按位逻辑运算、移位运算、拼接运算、缩减运算

非阻塞式赋值<=与阻塞式赋值=

阻塞:在同一个always过程中,后面的赋值语句要等待前一个赋值语句执行完,后面的语句被该赋值语句阻塞

非阻塞:在同一个always过程中,非阻塞赋值语句是同时进行的,排在后面的语句不会被该赋值语句阻塞

<=:

块结束后才能完成赋值

块内所有<=语句在always块结束时刻同时赋值

<=右边各变量的值是上一次时钟边沿时,这些变量当时的值

用于描述可综合的时序电路

=:

=语句结束之后过程always才可能结束

在always过程中,begin end块内按先后顺序立即赋值,在fork join内同时赋值(可能造成冲突)

与assign连用描述组合电路

begin end中阻塞的含义:begin...@(A)B=C...;end

如果A事件不发生则永远不能执行下去,被阻塞了

由于时钟的延时(往往在ps级),多个always(posedge)之间究竟谁先执行是个未知数

使用原则:同一个always过程块内建立时序电路用<=

纯组合逻辑电路用=,生成的电路结构最简单,执行速度最快

同一个always块内不要混用<=和=

不要在多个always块内对同一个变量赋值(多源驱动)

if else的三种形式,第三种形式适合描述优先编码器

if条件中0/x/z当成假,1当成真,非0的数值也当成真

case语句的三种: case(四种状态的比较)casez(忽略z)casex(忽略x和z,只看哪些位的信号有用)

case语句中所有表达式值的位宽必须相等,default中不能将n'bx用'bx代替

避免生成锁存器的方法: 电平触发时if后加else

case中加default

使用casex会将不必要的状态视为无关项,使得综合出来的电路最简单

两种特殊的括号: begin 顺序语句...end

fork 并行语句...join,其差别在于块内语句的起止时间、执行顺序、相对延时

块被命名后,其内部变量可以被调用,因为变量都是静态的(调用信号:对应电路中的一个信号线被引到另一处)

initial块只无条件执行一次

always块在满足条件时不断执行

initial常用来写测试文件,always块常用来写电路描述

always既可以描述组合逻辑电路又可以描述时序逻辑电路

always如果后面有敏感信号列表则不能用wait语句

always既可以描述电平触发又可以描述边沿触发,wait只能描述电平触发

assign常用于描述组合逻辑电路

测试文件中一般都是现initial 后always

生成语句:生成快的本质是使用循环内的一条语句代替多条重复的verilog语句,简化了用户的编程

genvar用于声明生成变量,生成变量只能用在生成快之间

仿真时,仿真器会将生成块中的代码展平,在确立后的方针代码中,生成变量是不存在的

最好是先想象出来循环生成语句被展平后的电路样子,再写相关的描述语句

task和function的区别:

task可以定义自己的仿真时间单位,function与主模块共用同一个仿真时间单位

函数不能启动任务,任务能够启动函数

函数至少要有一个输入变量,任务没有输入变量

函数返回一个值,任务不返回值

一个模块的设计包括3个部分: 电路模块的设计

测试模块的设计

设计文档的编写

设计者通过布局布线工具生成具有布线延迟的电路,再进行后仿真,得到时序分析报告

从时序分析报告中可以知道电路的实际延迟t,同步电路内每个时钟周期要大于t,从而可确定该运算逻辑的最高频率

综合器之所以能够实现加法器、乘法器是因为库中已经存在可配置的参数化器件模型

FPGA内总线宽度容易自定义,以便实现高速数据流,三态数据总线相当于数据流的控制阀门

数字系统内数据流的控制: 开关(或三态数据总线)、数据暂存部件(寄存器)、同步状态机控制(整个系统在一个时钟域内)

流水线操作pipe line:

K级流水线就是从组合逻辑的输入到输出恰好有K个寄存器组,上一级的输出是下一级的输入

流水线操作获得第一个结果的时间要比不用流水线操作的时间长,但以后结果获得时间都只需要一个时钟周期,提高了数据吞吐量

流水线操作的保证:Tclk>K*(组合逻辑延迟+触发器的建立保持时间/触发时间),即时间片段要长于最大路径延迟

体现了面积换速度的思想,在综合时考虑的是以面积小为主还是以速度为主

本质上是一种同步逻辑

同步时序逻辑和异步时序逻辑:

同步时序逻辑指所有寄存器组由唯一时钟触发

always@(posedge clk)或always@(negedage clk)

异步时序逻辑指触发条件不唯一,任意一个条件都会引起触发

always@(posedge clk or posedage reset)

目前的综合器是以同步时序逻辑综合的,因为同步时序逻辑较异步时序逻辑可靠

严格的同步要求时钟信号传递速度远远大于各部分的延迟,实际中clk要单独用线,而不要经过反相器等部件

always @(posedge..)begin...<=...end 表示同步时序逻辑(同时刻赋值)

不同速率数据接口的处理方法(异步数据的处理方法):帧同步

FIFO 双端口RAM

同步状态机:

包括moore和mealy型两种,及其反馈模型(是一种反馈控制系统,当前状态就是其内部状态变量)

状态机的开发步骤:

根据实际问题列出输入输出变量和状态数

画出状态图并化简

写出状态转移真值表得到逻辑表达式

用D触发器或JK触发器构建电路(目前用D触发器多)

verilog描述时只需要得到简化的状态图就可以描述

状态编码方式: 独热码

格雷码

状态机主体程序有单always描述方式和多always描述方式

采用case/casez/casex建立模型最好,因为x是无关态,生成的电路最简单

default: state='bx与实际情况更一致,效果等同于 default: state<=idle

只有同步状态机才能被目前的综合for语句会将所有变量的情况展开,占用巨量逻辑资源,替代办法是用计数器和case语句说明所有情况

有优先级的if else结构会消耗更多资源,建议用无优先级的case替代 模块的复用往往比代码上修改节省的资源多 PLL的分频、倍频、移相操作会增加设计精度

同步时序电路的延时:#x通常用于仿真测试,实际硬件延时是:长延迟用计数器,小延迟用D触发器,此方法用来取代延迟链

同步电路中,稳定的数据采用必须满足采样寄存器的建立和保持时间 reg类型在always中不一定综合成时序电路,也可能是组合逻辑电路 乒乓操作与作用

异步时钟域同步问题 延迟包括门延迟和线延迟

组合逻辑产生的时钟仅能应用在时钟频率较低、精度要求不高的情况下 增减敏感信号得到的结果一样

补充部分:

verilog HDL起初是作为写testbench而产生的 verilog 有1995进入IEEE标准,为IEEE-1364, 于2001年进行了扩展,为IEEE 1364-2001; verilog AMS可用于模拟电路和数字电路的综合,目前正在不断发展和完善中; verilog的标识符区分大小写,关键字使用小写; 用来进行单行注释,用* *来进行跨行注释;

标识符由字母、数字、下划线构成,并以字母开头; 关键字又叫保留字,只有小写的关键字才是保留字;

信号的状态有4种: 0 1 x z x和z在描述电路时不区分大小写,在仿真时大小写有不同意义;

常量表达式中: x z不区分大小写;

进制符号h o d b与H O D B不区分大小写; 十六进制中a~f不区分大小写; 下划线_用于提高可读性; ?在数中可以代替z; x和z的左端补位;

字符和字符串都以ASICII码形式存在,也可以当成电路内的信号; 字符串必须包含在同一行,不能分成多行书写;

如果表达式或者赋值语句中将字符串当成操作数,则字符串中的每个字符都被看成8位的ASCII值序列;

可综合的信号类型:wire reg memory 它们用来描述数字电路

不可综合的数据类型:integer real 它们只用仿真,位于testbench中

wire是连线的抽象模型,不能保存数据,其值由驱动元的值决定; wire不能用在always或initial块中; wire的默认值为高阻z;

wire的使用情形: 1.作为模块的输出端口

2.用连续赋值语句assign赋值; reg是1位寄存器(触发器)的抽象模型,可以保存数据; reg必须用在always或initial块中; reg的默认值为x;

reg的使用情形:1.阻塞赋值<= 2.非阻塞赋值= memory只能是一维的;

memory只能对每个单元分别初始化,方法:1.一个一个赋值

2.通过系统任务$readmem赋值

reg[3:0] fc;//一个4位寄存器

reg fc[3:0] //4个一位寄存器

parameter的作用:仿真开始以前对其进行赋值,整个仿真过程中保持其值不变;

关系运算符将以逻辑1或逻辑0返回比较的结果;

==!=的返回值有0 1 x三种情况,===!==的返回值只有0 1两种情况;

verilog由于是描述电路的,用于位的操作较多,有: 位逻辑操作,移位操作,并置操作,归约操作; 位逻辑运算的结果中,位数与原操作数一样多;

归约符是在原操作数的所有位上进行操作,并产生1位结果;

并置运算可以发生在bit与bit之间 bit与矢量之间 矢量与矢量之间

用于仿真的系统任务:

所有系统任务都必须在initial或always内; 所有系统任务都必须以$开头; 常见系统任务:

显示任务($diplay系列和$write系列)

监控任务($monitor系列)

探测任务($strobe系列)

文件打开、输入、关闭任务(&fopen &fclose &fdisplay...)

读取文件任务($readmemb $readmemh)

仿真结束控制任务($finish $stop)

随即信号任务($random)

过程块: initial块和always块

一个module内可以包含多个initial或always模块;

所有initial或always块在0时刻开始并行执行,各initial或always块内部顺序执行; initial过程块主要是面向testbench的,通常不具有可综合性;

always过程块在描述电路时既可以描述组合逻辑电路(电平敏感)又可以描述时序逻辑电路(边沿敏感);

写testbench时initial通常用于初始化以及顺序波形的描述,always通常用于重复波形的描述;

任务task与函数function: 为了描述模块中被多次执行的部分以及为了增强代码的易读性 verilog中的高级程序语句如for循环语句只用在写testbench中; begin end和fork join是两种特殊的括号

if语句的第三种形式适合描述优先编码器,case语句适合描述数据选择器和状态机;

case的条件表达式如果与分支项表达式长度不同,则在比较前将所有表达式都统一为这些表达式的最长长度;

casez忽略z,casex忽略z和x;

assign语句只在右端表达式发生变化时才重新计算并重新赋值,其余时间都是连续赋值; assign语句可以指定bit、vector或是任意拼接操作的结果;

assign语句是连续赋值的,用于驱动网线wire,reg类型不需要连续赋值,reg类型一旦被赋值就会一直保存;

过程赋值语句有两种:阻塞式=和非阻塞式<=,只能在过程块initial和always中使用; @对事件触发的控制与wait语句不能同时使用;

第二篇:Verilog学习心得

Verilog学习心得

因为Verilog是一种硬件描述语言,所以在写Verilog语言时,首先要有所要写的module在硬件上如何实现的概念,而不是去想编译器如何去解释这个module.比如在决定是否使用reg定义时,要问问自己物理上是不是真正存在这个register, 如果是,它的clock是什么? D端是什么?Q端是什么?有没有清零和置位?同步还是异步?再比如上面讨论的三态输出问题,首先想到的应该是在register的输出后面加一个三态门,而不是如何才能让编译器知道要“赋值”给一个信号为三态。同样,Verilog中没有“编译”的概念,而只有综合的概念。

写硬件描述语言的目的是为了综合,所以说要想写的好就要对综合器有很深的了解,这样写出来的代码才有效率。

曾经接触过motorola苏州设计中心的一位资深工程师,他忠告了一句:就是用verilog描述电路的时候,一定要清楚它实现的电路,很多人只顾学习verilog语言,而不熟悉它实现的电路,这是设计不出好的电路来的.一般写verilog code时,对整个硬件的结构应该是很清楚了,最好有详细的电路图画出,时序问题等都应该考虑清楚了。可以看着图直接写code。

要知道,最初Verilog是为了实现仿真而发明的.不可综合的Verilog语句也是很重要的.因为在实际设计电路时,除了要实现一个可综合的module外,你还要知道它的外围电路是怎样的,以及我的这个电路与这些外围电路能否协调工作.这些外围电路就可以用不可综合的语句来实现而不必管它是如何实现的.因为它们可能已经实际存在了,我仅是用它来模拟的.所以,在写verilog的时候应该要先明确我是用它来仿真的还是综合的.要是用来综合的话,就必须要严格地使用可综合的语句,而且不同的写法可能产生的电路会有很大差别,这时就要懂一些verilog综合方法的知识.就像前面说的,脑子里要有一个硬件的概念.特别是当综合报错时,就要想一想我这种写法能不能用硬件来实现,verilog毕竟还不是C,很多写法是不可实现的.要是这个module仅是用来仿真的,就要灵活得多了,这时你大可不必太在意硬件实现.只要满足它的语法,实现你要的功能就行了.有网友说关于#10 clk=~clk的问题,虽然这种语句是不可综合的,但是在做simulation和verification是常常用它在testbench中来产生一个clock信号。再比如常常用到的大容量memory, 一般是不会在片上实现的,这个时候也需要一个unsynthesizable module.mengxy所言切中肯罄。

我们设计的module的目的是为了可以综合出功能正确,符合标准的电路来。我想这是个反复的过程,就像我们在写design flow中总要注明前仿真,综合后的仿真,以及后仿真等。仿真是用来验证我们的设计的非常重要的手段。而verilog里那些看是无聊的语句这个时候就会发挥很大的作用。我想,用过verilog_xl的兄弟应该深有体会。verilog_xl里的操作,可以用verilog里的系统命令来完成。通过最近的应聘我也深有体会,很多公司看中你在写code时,是否考虑到timing, architecture,DFT等,这也说明verilog中的任何语句都非常重要的。要写代码前必须对具体的硬件有一个比较清晰的概念但是想一次完成可综合代码就太夸张了,verilog的自顶向下设计方法就是从行为建模开始的,功能验证了以后再转向可综合模型.太在意与可综合令初期设计变得太累

很同意这种看法,在做逻辑结构设计时,综合的因素是要考虑的,但是有很多东西不能考虑的过于细致,就是在设计的时候不能过于紧卡时延,面积等因素,因为这样以来综合后优化的余量就会很小,反而不利与设计的优化,如果在时延和面积要求不是很紧张的情况下,其实代码写的行为级,利用综合工具进行优化也是一种方法。偶就听说有一家很有名的公司,非常相信综合工具的优化能力,从来不作综合后仿真的,hehe.当然,如果面积和时延的要求很高,最好还是把代码写的底层一点,调用库单元时,也要充分考虑其面积和时延的因素。

Verilog与C++的类比

1.Verilog中的module对应C++中的class。它们都可以实例化。例如可以写一个FullAdder module,表示全加器这种器件。module FullAdder(a, b, cin, sum, cout);input a, b, cin;output sum, cout;

assign {cout, sum} = a + b + cin;endmodule

然后在执行8-bit补码加减运算的ALU module中实例化8个FullAdder,表示ALU用到了8个FullAdder。

module ALU(a, b, result, cout, is_add);input[7:0] a, b;input is_add;output[7:0] result;output cout;

wire[7:0] b_not = ~b;wire[7:0] b_in = is_add ? b : b_not;wire[7:0] carry;

assign carry[0] = is_add ? 1'b0 : 1'b1;

// module 实例化

// 8-bit ripple adder FullAdder fa0(a[0], b_in[0], carry[0], result[0], carry[1]);FullAdder fa1(a[1], b_in[1], carry[1], result[1], carry[2]);FullAdder fa2(a[2], b_in[2], carry[2], result[2], carry[3]);FullAdder fa3(a[3], b_in[3], carry[3], result[3], carry[4]);FullAdder fa4(a[4], b_in[4], carry[4], result[4], carry[5]);FullAdder fa5(a[5], b_in[5], carry[5], result[5], carry[6]);FullAdder fa6(a[6], b_in[6], carry[6], result[6], carry[7]);FullAdder fa7(a[7], b_in[7], carry[7], result[7], cout);endmodule

对应在C++中先写FullAdder class,然后在ALU class中以FullAdder作为data member。

class FullAdder { };

class ALU { FullAdder fa[8];};另外一点,moudle声明port的方式,像是从早期C语言的函数定义中学来的:

char* strcpy(dst, src)char* dst;char* src;{ //...}

2.Verilog中的模块调用时,指定端口可以使用名称绑定。C++在调用函数时,参数只能按顺序书写。例如memset()的原型是:

void *memset(void *s, int c, size_t n);

如果你想将某个buf清零,应该这么写: char buf[256];memset(buf, 0, sizeof(buf));

但是如果你不小心写成了: memset(buf, sizeof(buf), 0);

编译器不会报错,但运行的实际效果是根本没有对buf清零。(记得Richard Stevens的书里提到过这一点。)

在Verilog中,如果要写一个测试ALU的module,那么其中对ALU实例化的指令可以这么写:

module alu_test;reg[8:0] a_in, b_in;reg op_in;wire[7:0] result_out;wire carry_out;

ALU alu0(.a(a_in[7:0]),.b(b_in[7:0]),.is_add(op_in),.result(result_out),.cout(carry_out));//...endmodule 这样就比较容易检查接线错误。

另外,在C++中,如果所有参数类型不同,而且之间没有隐式类型转换,那么可以利用C++的强类型机制在编译期检查出这种调用错误。

3.Verilog中把大括弧{}用作bit的并置,因此语句块要用begin/end标示。Verilog中小括号()和中括号[]的作用与C++中类似,前者用于函数或模块调用,后者用于下标索引。我想如果Verilog把尖括号<>用作bit并置的话,就能把大括号{}解放出来,用作标示语句块,这样写起来更舒服一些。

4.Verilog本质上是测试驱动开发的。对于每个module都应该有对应的test bench(或称test fixture)。比较好的情况是,一个工程师写module,另一个工程师写对应的testbench,这样很容易检查出对电路功能需求理解不一致的地方。因此还可以说Verilog主张结对编程(pair programming)。例如对前面的ALU module的test bench可以写成: `timescale 1ns / 1ns module alu_test;

reg[8:0] a_in, b_in;reg op_in;

wire[7:0] result_out;wire carry_out;

ALU alu0(.a(a_in[7:0]),.b(b_in[7:0]),.is_add(op_in),.result(result_out),.cout(carry_out));

reg[9:0] get, expected;reg has_error;

initial begin has_error = 1'b0;

op_in = 1'b1;// test addition

for(a_in = 9'b0;a_in!= 256;a_in = a_in + 1)for(b_in = 9'b0;b_in!= 256;b_in = b_in + 1)begin #1;get = {carry_out, result_out};expected = a_in + b_in;if(get!== expected)begin $display(“a_in = %d, b_in = %d, expected %d, get %d”,a_in, b_in, expected, get);has_error = 1'b1;end end

op_in = 1'b0;// test subtraction //...if(has_error === 1'b0)begin $display(“ALL TESTS PASSED!”);end $finish;end endmodule

5.Verilog比起VHDL的不足之处在于,它只能定义concrete class,不能定义abstract class。也就是说interface和implementation不能分离。这在设计大型电路时就显得表现力不足。不过这关系不大,因为可以在编译时选择同一模块的不同实现版本,间接实现了接口与实现的分离。

在VHDL中,强制将接口与实现分离。对每个模块,你都得先写接口(定义输入输出信号),即ENTITY;然后至少写一份实现,即ARCHITECTURE。每个ENTITY可以有不止一份实现,例如可以有行为描述的,也有数据流描述的。然后在配置文件中选择该ENTITY到底用哪一份实现。举例来说(选自《VHDL入门·解惑·经典实例·经验总结》一书),分频器模块可以这么写,先定义其接口FreqDevider,然后定义两份实现Behavior和Dataflow:

LIBRARY IEEE;USE IEEE.Std_Logic_1164.All;

ENTITY FreqDevider IS PORT(Clock : IN Std_Logic;Clkout : OUT Std_Logic);END;

ARCHITECTURE Behavior OF FreqDevider IS SIGNAL Clk : Std_Logic;BEGIN PROCESS(Clock)BEGIN IF rising_edge(Clock)THEN Clk <= NOT Clk;END IF;END PROCESS;Clkout <= Clk;END;

ARCHITECTURE Dataflow OF FreqDevider IS--signal declarations BEGIN--processes END;在C++中,既可以写concrete class,也可以写abstract class。比Verilog和VHDL都方便。

6.Verilog和VHDL都有模板的概念,Verilog称为参数(parameter),VHDL称为类属(generic)。不过好像都只能用整数作为模板参数,不能像C++那样用类型作为模板参数。

7.目前来看,Verilog是硬件描述语言,不是硬件设计语言。在用Verilog设计电路的时候,我们是把脑子中想好的电路用Verilog“描述”出来:哪里是寄存器、哪里是组合逻辑、数据通路是怎样、流水线如何运作等等都要在脑子里有清晰的映象。然后用RTL代码写出来,经过综合器综合出的电路与大脑中的设想相比八九不离十。这就像说C语言是可移植的汇编语言,以前好的C程序员在写代码的时候,能够知道每条语句背后对应的汇编代码是什么。verilog设计经验点滴 1,敏感变量的描述完备性

Verilog中,用always块设计组合逻辑电路时,在赋值表达式右端参与赋值的所有信号都必须在always @(敏感电平列表)中列出,always中if语句的判断表达式必须在敏感电平列表中列出。如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,在综合时将会为没有列出的信号隐含地产生一个透明锁存器。这是因为该信号的变化不会立刻引起所赋值的变化,而必须等到敏感电平列表中的某一个信号变化时,它的作用才表现出来,即相当于存在一个透明锁存器,把该信号的变化暂存起来,待敏感电平列表中的某一个信号变化时再起作用,纯组合逻辑电路不可能作到这一点。综合器会发出警告。Example1: input a,b,c;reg e,d;always @(a or b or c)

begin

e=d&a&b;/*d没有在敏感电平列表中,d变化时e不会立刻变化,直到a,b,c中某一个变化*/

d=e |c;

end

Example2: input a,b,c;reg e,d;always @(a or b or c or d)

begin

e=d&a&b;/*d在敏感电平列表中,d变化时e立刻变化*/

d=e |c;

end

2, 条件的描述完备性

如果if语句和case语句的条件描述不完备,也会造成不必要的锁存器。Example1: if(a==1'b1)q=1'b1;//如果a==1'b0,q=? q将保持原值不变,生成锁存器!

Example2: if(a==1'b1)q=1'b1;else

q=1'b0;//q有明确的值。不会生成锁存器!Example3: reg[1:0] a,q;....case(a)

2'b00 : q=2'b00;

2'b01 : q=2'b11;//如果a==2'b10或a==2'b11,q=? q将保持原值不变,锁存器!

endcase Example4: reg[1:0] a,q;....case(a)

2'b00 : q=2'b00;

2'b01 : q=2'b11;

default: q=2'b00;//q有明确的值。不会生成锁存器!

endcase

Verilog中端口的描述

1,端口的位宽最好定义在I/O说明中,不要放在数据类型定义中; Example1: module test(addr,read,write,datain,dataout)

input[7:0] datain;input[15:0] addr;input

read,write;

output[7:0] dataout;//要这样定义端口的位宽!

wire addr,read,write,datain;

reg dataout;

Example2: module test(addr,read,write,datain,dataout)input datain,addr,read,write;output dataout;wire[15:0] addr;wire[7:0] datain;wire

read,write;reg[7:0] dataout;// 不要这样定义端口的位宽!

2,端口的I/O与数据类型的关系:

端口的I/O

端 口 的 数 据 类 型

module内部 module外部

input

wire wire或reg

output

wire或reg

wire

inout

wire

wire

3,assign语句的左端变量必须是wire;直接用“=”给变量赋值时左端变量必须是reg!Example: assign a=b;//a必须被定义为wire!******** begin a=b;//a必须被定义为reg!end

VHDL 中 STD_LOGIC_VECTOR 和 INTEGER 的区别

例如 A 是INTEGER型,范围从0到255;B是STD_LOGIC_VECTOR,定义为8位。A累加到255时,再加1就一直保持255不变,不会自动反转到0,除非令其为0;而B累加到255时,再加1就会自动反转到0。所以在使用时要特别注意!

以触发器为例说明描述的规范性 1,无置位/清零的时序逻辑

always @(posedge CLK)

begin

Q<=D;

end

2,有异步置位/清零的时序逻辑

异步置位/清零是与时钟无关的,当异步置位/清零信号到来时,触发器的输出立即被置为1或0,不需要等到时钟沿到来才置位/清零。所以,必须要把置位/清零信号列入always块的事件控制表达式。

always @(posedge CLK or negedge RESET)

begin

if(!RESET)

Q=0;

else

Q<=D;

end

3,有同步置位/清零的时序逻辑

同步置位/清零是指只有在时钟的有效跳变时刻置位/清零,才能使触发器的输出分别转换为1或0。所以,不要把置位/清零信号列入always块的事件控制表达式。但是必须在always块中首先检查置位/清零信号的电平。

always @(posedge CLK)

begin

if(!RESET)

Q=0;

else

Q<=D;

end

结构规范性

在整个芯片设计项目中,行为设计和结构设计的编码是最重要的一个步骤。它对逻辑综合和布线结果、时序测定、校验能力、测试能力甚至产品支持都有重要的影响。考虑到仿真器和真实的逻辑电路之间的差异,为了有效的进行仿真测试: 1,避免使用内部生成的时钟

内部生成的时钟称为门生时钟(gated clock)。如果外部输入时钟和门生时钟同时驱动,则不可避免的两者的步调不一致,造成逻辑混乱。而且,门生时钟将会增加测试的难度和时间。

2,绝对避免使用内部生成的异步置位/清零信号

内部生成的置位/清零信号会引起测试问题。使某些输出信号被置位或清零,无法正常测试。

3,避免使用锁存器

锁存器可能引起测试问题。对于测试向量自动生成(ATPG),为了使扫描进行,锁存器需要置为透明模式(transparent mode),反过来,测试锁存器需要构造特定的向量,这可非同一般。

4,时序过程要有明确的复位值

使触发器带有复位端,在制造测试、ATPG以及模拟初始化时,可以对整个电路进行快速复位。

5,避免模块内的三态/双向

内部三态信号在制造测试和逻辑综合过程中难于处理.补充不知你看了verilog 2001版本吗?现在的verilog在尽量往C语言的风格上靠拢。

1。敏感变量的描述完备性,我现在用always实现组合逻辑时,都是写成always@(*),这样很很好,自动把所有右端赋值信号加入。

2。module编写时这样更好: module(input [23:0] rx_data , //CRC_chk interface

output reg

CRC_en ,output reg

CRC_init , input

CRC_err);

第三篇:语法学习心得

语法学习心得

语法,是语言中的词、短语、句子的构造规律。西方传统语言学认为,语法包括两个大的方面:词法和句法。也正由于汉语的词的分类定性

都必须依靠特定的句法环境来实现,所以,汉语语法有关词类问题的讨论总是要放到句法当中去进行。

研究语法的学科叫做语法学,语法学分很多类,1宏观研究方法。2研究对象的时限。3研究者的社会目的。4研究者的教育目的。5对象范。

语法系统分为客观语法系统和主观语法系统,一种语言只有一个客观的语法系统,它是客观存在于语言当中的。但一种语言的表述系统却可以

有几个。造成表述系统多样化的原因有两个:一是语法学研究的对象自身是复杂的,要全面把握并做出科学、合理的解释并不是容易的事情。

二是语法学家的研究方法、角度、能力以及占有的材料、观察问题的方法、能力等等,都不尽相同,所以,尽管面对的是同样的研究对象,也 可能得出完全不同的或者不很相近的结论来。

语法有其作用,首先,从说和写的角度来看,语法规定着人们怎样用词造句。比如,汉语的“我看书”从排列的角度来看,可有六种顺序:我

看书、书我看、我书看、看我书、书看我、看我书。其次,从听、读、写的角度来看,语法指示人们怎正确理解汉语的意义。如:①

人类需要动物。动物需要人类。② 这本书看了三天。这本书看了三天了。两个例子都说明语法规则对于句子语义内容的影响。

我们不难发现汉语语法的几个显著特点(1)短语和句子的基本构造方式一致。

汉语的短语和句子大都是由以下几种构造方式构造而成的:

结构方式 短语 句子

主谓结构 我写 花红 灯亮 我写了。花红了。灯亮

动宾结构学汉语 写信 吃饭来人!抓住他!请用饭。

偏正结构大人 高举 我的书 你的票!快跑!高点举!

联合结构读写 高大 我和你你和她?

中补结构抬高 说清楚 放好说清楚!干得非常非常好。

这一点给我们的启示是:分析句

子的方法和分析短语的方法基本一致。汉语句子的结构可以以短语为基础,弄清短语的结构模式,就可以

基本上把握句子的结构模式。因

为短语比句子简短,影响结构构造、分析的因素少。以此为基础,把握汉

语句子的结构模式,可以收到以简驭繁的效果。

(2)词类和句子成分之间不存在简单的、一一对应关系。

由上边所说的汉语语法有关词类问题的讨论总是要放到句法当中去进行,现在来说说我感兴趣的分析句子成分部分。

句子,是具有特定语调,能表达一个相对完整意思的语言单位。所谓“句子成分”,说的是根据句子内部组成成分

之间的不同的组合关系,以及各自语法职能划分而来的 句子的结构成分。如主语、谓语等等。分析句子的两种方法

(一)句子成分分析法。句子成分分析法,是传统的分析句子的方法,它把句

子成分分别为主、谓、宾、定、状、补等六类,然后按照这些成分的搭配情况来说明句子的各种结构格局。由此可以看到句子成分有如下特点:

其一,句子成分是句子分析的结果。

句子成分是通过对句子进行语法结构的分析得到的,应该是先有句子,而后得到句子成分。

其二,句子成分具有特定的语法职能或“身份” 特征。比如: 通过上边的分析可以得到以下几组句子结构成分 这也就是所谓的汉语“十大句子成分”:主语、谓 语、动语、宾语、中心语、修饰语、定语、状语、补 语、独立语。

关于语法学习的心得就简单说到这吧,这一学期的学习懂得了很多语法的基本知识,也有了一定对语法的思辨能力了。

第四篇:关于语法的学习心得

关于语法的学习心得

山西省永济中学王碧霞

英语学习过程中最重要的一个环节就是关于语法的掌握,不管是单选题,还是完型填空,以及阅读理解,都会涉及不是的语法知识,而如果我们不能熟练掌握这部分内容的话,势必造成总体成绩不佳的结果。语法教学能让学生对英语语言规则有明确系统的认识,有利于帮助学生建立起语言规范。不过我们在语法教学中要特别注意,我们教给学生英语语法,不是为了培养他们用语法分析英语语言的能力,语法教学是为培养学生运用英语的能力服务的,语法教学从属于运用英语的能力的培养。下面就我本人在教学一线的一线工作经验对语法学习方法总结如下:。

1、总体把握语法大纲

就像刚接触英语单词一样,我们得知道英语单词都是由26个字母组成的,并且一开始就得不断积累我们的单词量。同样语法的学习也需要先进行大体把握,再让学生在较短时间内迅速掌握英语基础语法知识。这种语法教学方法需要学生具有比较强烈的语法学习兴趣和比较顽强的语法学习毅力,同时需要学生具有比较强的集中注意力的能力。这种语法教学方法在期末复习和毕业复习时应该对学生有一定帮助,但在学生学习开始时使用可能增强学生学习英语的焦虑感,严重的可能导致学生形成英语学习的心理障碍。

这种方法将语法知识学习与课文学习长时间分开,如果将一学期的语法知识在学期开始时集中教学,那么本学期最后一个单元才会学到的语法知识就可能出现语法知识学习与课文学习分离一个学期之长,这可能影响学生准确掌握语法知识的运用。这种方法同时将语法知识和语法知识的运用长时间分开,不利于学生学习掌握运用语法知识的真实语境及其真实的语用功能。

语法集中教学能有效帮助学生比较系统地学习语法知识,而且可以帮助学生对容易混淆的语法知识进行比较,如能合理使用,是可以帮助我们提高教学质量和教学效率的,但如果使用不当,则可以反而增加教学难度,影响教学质量和教学效率,影响学生形成获得运用英语的能力。同时,在运用集中方法时,如何集中,集中哪些语法知识,语法知识的集中讲授与语法知识的运用能力培养怎样有机合理地结合起来,都是应该思考的问题。盲目集中可能不利于老师们所任教班级的教学质量和教学效率的提高。

2、善于总结归纳

归纳是从感性认识到理性认识的学习方法。归纳要求我们先给学生一些含有语法教学内容的语言材料,让学生在学习语言材料中接触这些语法现象,然后引导学生从这些语言材料中归纳总结出语法规则。

归纳法能够让学生先获得语言材料,从感性认识中获得理性认识,有利于学生理解和掌握语法规则,但需要一定的教学时间,需要老师做比较多的语言材料的教学规则,而且在语言材料教学中需要从语境、语用进行教学,而不是直接从语法概念和语法规则进行教学。

3、理性的归纳再应用于实践

应用是从已经形成的概念出发,直接将概念讲授给学生,然后再用例句和语言材料来说明概念。

这种方法让学生首先接触语法规则,可以避免出现规则误差,但演绎法过于理性,需要学生具有比较强的抽象思维能力,强烈的学习兴趣和一定的学习毅力。?

总结与应用相比,总结更有利于减轻学生学习负担,降低学生学习困难,弱化学生学习焦虑,应用更有利于缩短学生学习时间,减少学生学习错误。归纳法更利于学生的学习,演绎法更利于教师的教学。

所以刚接触英语时一定要注意不断总结,当我们具备一定基础后可以将总结的理论再推广应用到学习过程。不过老师们仍然应该根据自己任教班级的动态真实的教育因素和教学因素选择教学方法。

4、参考科学实验中的对照原则

学习过程中经常会遇到容易混淆的语法知道,这时我们不防把这两个内容放在一块进行对较,多看两遍就会发现它们之间总会有这样那样的区别,这里所谓比较包括两个方面:一是对英语语法本身中的相似但不同的英语语言现象进行比较,如一般现在时与现在进行时的比较,一般过去时与现在完成时的比较,形容词性物主代词与名词性物主代词的比较等等;二是对英语和汉语两种语言中的相关的语法现象和结构规则的比较。

比较的语法教学可以在学过可比较的一种语法现象之后,学习另一种语法现象之时,就两种语法现象进行比较,如学过形容词性物主代词之后,在学习名词性物主代词之时,就已经学过的形容词性物主代词与名词性物主代词进行比较,来帮助学生学习掌握名词性物主代词。

比较的语法教学也可以用在语法总结复习之时,比如学习了五种动词基本时态之后,就五种时态在用法、语义、语用等方面的区别进行比较,以帮助学生巩固掌握。复习时,比较方法的语法教学应该是在足够真实的语言环境中运用语言的比较,而不是单纯的语法概念、术语的比较。

5、更为具体直观的语法学习方法

表格能够很明确地对语法知识进行比较和归类,因此经常出现在语法知识教学中,甚至有的语法书都是有表格形式编写的。

由于表格强调内容的一致性,因此表格只能列举英语语法知识的基本内容,对于比较特别的不一致的内容往往列举有些困难,同时语法知识的运用比较难以列举。

很多老师运用图画进行英语语法知识教学,因为图画形象直观,能让学生很容易地掌握教学内容,经常取得比较好的教学效果。

不过图画只能用于一部分英语语法知识的教学,比如方位介词、副词的教学,时态的教学等。

6、利用现代化的多媒体技术

图片与视频是人类学习过程中更容易接受的一种信息,这里同样可以应用于我们的英语学习过程中,在一些计算机辅助教学软件中经常使用计算机动画进行语法教学。计算机动画具有很强的动感,而且动画本身也很受学生欢迎,同时动画能够很明确地表现动作,并配有讲解,因此这种形式很有生命力。

随着计算机辅助英语教学的广泛开展,计算机动画形式的语法教学也会被广泛使用。由于目前的大多数计算机教学软件不是网络化的,致使计算机动画的语法教学还难以在学生之间进行教学对比,从而在一定程度上影响计算机动画的教学效果的发挥。

7、及时交流巩固

无论采取什么样的教学原则,语法知识都是必须要讲授给学生的,只是讲授的方法不同而已。现在的新教材都强调对学生运用英语进行交际的能力的培养,对语法采取了暗线的教授方式,这对于每周只有在几节英语课上才能进入英语环境的中国学生来说,难度比较大。其实,必要的语法知识讲解是不可避免的,关键是怎样在语法教授中贯彻能力教育原则。

第五篇:verilog作业题

1、以结构描述方式实现下列逻辑:

F=AB+ACD(CD的非)

2、以连续赋值语句设计8位总线驱动器。

3、以always语句设计8位总线驱动器。

4、以always语句设计8位双向总线驱动器。

1、设计一个具有低电平使能端和高电平使能端的2-4译码器。

2、设计一个JK触发器。

3、设计一个24分频期,要求输出信号占空比为1:1。

4、一个挂在总线上的16位寄存器。

5、设计一个8位线编码器,输入为D7 - D0,D7优先级最高,D0最低。当Di为高电平输入时,F=1,OUT为其编码,否则F=0。

1、以结构描述方式实现下列逻辑:

Y=ABC(BC的非)+DE+ CFG(CFG的非)

2、试设计一个具有使能端ncs的2-4译码器。

3、试设计一个4位加减运算器,输入为A、B、CIN、M,输出为OUT和COUT。当M=0时执行加法运算,M=1时,执行减法运算。

4、试设计一个14分频器,要求占空比1:1。

5、试设计一个具有三态输出缓冲的8位数据寄存器。

6、试设计一个具有清0和置数功能的8位二进制加1计数器。

7、设计一个16位移位寄存器。

8、设计一个16位双向移位寄存器,当d=0时右移, d=1时左移。

1设中断请求有效电平为高电平,中断请求输入线INTR0—INTR15中INTR15优先权最高。试设计一个中断优先权编码器。当有中断请求时,INT=1,同时输出中断请求输入线的编码V;否则INT=0,V的输出任意。

2试设计一个具有同步清0和同步置数功能的8位二进制加1计数器。

3试设计一个“11010100”序列检测器.4设计一个8位双向移位寄存器。其I/O端口和控制端口包括d(移位方向控制,当d=0时右移, d=1时左移)、数据串行输入din、数据并行输入data(8位)、dout数据串行输出、数据并行输出q(8位)、同步时钟clk、并行置数load等。

5设计每周期8个采样点的锯齿波信号发生器。

6设计每周期8个采样点的正弦波信号发生器。

下载verilog语法学习心得(写写帮推荐)word格式文档
下载verilog语法学习心得(写写帮推荐).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    学verilog小结

    学习verilog一段时间 小结 学习verilog, verilog, verilog小结 一:基本 Verilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发......

    TCL学习心得 语法整理笔记

    TCL 一行有多个语句的时候要使用“;”隔开。 TCL的注释是“#”,一行中#之后内容全是注释内容。 在交互模式中用source 命令,可以执行TCL脚本文件。Ps: Source 1.tcl #1.tcl......

    雅思阅读和语法学习心得分享

    牛学教育 雅思SAT 托福www.xiexiebang.com 雅思阅读和语法学习心得分享 大家好,我叫王奕丹,是师大附中高二的一名学生。我是5月份来到牛学教育的,我报的是精品班B+C阶段的课程......

    verilog学习日志

    1. 解决xilinx的仿真库的编辑问题 2. 模块的做法和调用方法,带参数模块的应用:两种方法modelname # (value)madelcase;二、用defparam 改变参数。 3. Begin ……end之间是串行执......

    古代汉语词汇语法专题课程学习心得

    古代汉语词汇语法专题课程学习心得 一、课程简介: 作为对外汉语的专业选修课,古代汉语词汇语法专题是在系统学习语言学基础课程的基础上,为进一步深入学习古代汉语词汇和语法......

    verilog简易数字频率计报告

    一、实验原理 根据原理图,将计数器模块、显示模块、扫描模块、译码器模块等分别做出。其原理是在1S内用待测信号给计数器计数,并在一秒结束时给计数器清零,计出来用缓存器缓存,......

    EDA技术Verilog密码锁

    电 子 科 技 大 学 实 验 报 告 学生姓名:吴成峰学 号:2014070906016 指导教师:黄志奇 一、实验室名称: 主楼C2-514 二、实验项目名称: 密码锁 三、实验原理: 利用FPGA开发班上......

    学习verilog后的总结

    关于这个学期学习verilog hdl语言后的小结 在完成本次verilog大作业的过程中,我不仅学到了很多只靠看书本学不到的知识,而且体会到了团队协作的力量, 在团队成员的合作下,经历了......