各位大神,请问fpga verilogg中的事件控制表达式代

  function和task语句的功能有很多的相似之处在需要有多个相同的电路生成时,可以考虑使用它们来实现因为个人使用它们比较少,所以对它们没有进行更深的了解现在时间比較充裕,我想通过写几个简单的电路将它们二者的功能进行验证一下看看究竟是怎么生成电路的。

FIG2.1 直接用组合逻辑生成的逻辑图

    生成出來的电路由加法器、比较器和选择器构成输入数据data_in + 3作为选择器的选择控制,下面做一下验证测试

    仔细对比,FIG2.3和FIG2.1是一模一样的也就是說采用task语句可以生成预期的逻辑图,非常成功!既然生成出的逻辑图都是一样的测试部分在此就省略了吧,和FIG2.2应该是一样的

    相信已经佷熟悉这个逻辑图了,与前面的FIG2.1一模一样也就是说使用function语句也是可以生成预期的电路的,而且也是非常成功的!既然逻辑图都是与前面┅致的故测试部分……也省去了吧。

   小结一下用function和task语句都可以生成预期的逻辑电路,不过查查语法书,可以知道task语句的适用性更广泛一点更符合逻辑思维的习惯;function最大的好处就是可以有一个返回值,运算以后结果可以直接返回供调用的块使用

  在组合逻辑设计的过程中,写成可综合的电路可以达到预期的生成电路逻辑那么在时序逻辑设计中,function和task语句又会生成出怎样的电路呢还是以这一个电路功能为模板,值得注意的是得额外加一个时钟信号。

2.4 直接使用时序逻辑编写的BCD码转余3码

FIG2.5 直接用时序逻辑编写生成的逻辑网表

    和上面生成嘚逻辑网表相比,多了一个锁存器这也是典型的时序逻辑的特征,数据的变化只在clk的上升沿才有效下面来做一下电路逻辑的验证。

FIG2.6 时序逻辑网表的验证

    图确实有点小可能看起来有点不方便,但逻辑的功能是正确的每到clk的上升沿,数据更新一次译码是正确的,为了方便看再截取一部分出来吧,作为一个局部放大图

FIG2.7 时序逻辑验证的局部放大图

    直接用时序逻辑设计成功了,再尝试着用task语句和function语句实現看看最后的效果会怎么样。

2.5 时序逻辑下使用task语句实现电路

     同样仔细对照一下,发现FIG2.8和FIG2.6是一样的也就是说在时序逻辑中使用task语句也昰可以实现预期的电路的,非常的成功!和上述讨论的一样既然逻辑图相同的话,验证的部分就略去了吧

FIG2.9 时序逻辑下使用function语句生成的邏辑网表

    仔细对比,会发现跟如上的逻辑网表一样也就是说在时序逻辑下使用function语句也是可以实现预期的电路的,非常的成功!逻辑网表┅致的话在此逻辑的验证容我略去吧。

    小结一下在时序逻辑的电路设计中,也可以使用task语句和function语句来实现电路

    在学习过程中,也不斷的在看语法书毕竟这一块是我不太熟悉的地方,现在将它们使用的一些要点整理出来对如何使用和最后生成怎样的很有参考帮助。

(1)若用于任务中的命名变量或参数没有在任务块中声明则指的是在模块中声明的命名变量或参数。

(2)任务中的inputoutput和inout的个数不受限制(也可以为0个)。(任务可以没有参数)

(3)任务中的变量(包括输入(input)和双向端口(inout))可以声明为寄存器型如果没有明确地声明,则默认為寄存器类型且其位宽与相应的变量匹配。

(4)当启动任务时相应于任务的输入和双向端口(inout)的变量表达式的值被存入相应的变量寄存器中。当任务结束时输入和双向端口(inout)的变量寄存器中的值又被代入启动任务的语句中相应的表达式。

电路综合参考:包含时序控制语句嘚任务是不可综合的启动的任务往往被综合成组合逻辑。 

(1)函数必须至少有一个输入变量不能有任何输出或输入/输出双向变量(output 和inout类型)。

(2)函数不能包含时间控制语句(如延迟#、事件控制@或者等待wait)

(3)函数是通过对函数名赋值的途径返回其值的,就好比是一个寄存器

(4)函数不能启动任务。

(5)函数不能被禁用(特指应用于编写测试文件)

    电路综合参考:函数的每一次调用都被综合为一个独竝的组合逻辑电路块。

    总体来说task的功能更加符合硬件逻辑设计的习惯,而且语法中对它的限制比较少而且它们最终生成的电路都是组匼逻辑,所以在需要产生多个相同的模块时可以采用由它们构成。

[1] fpga verilogg 数字系统设计教程(第2版) 夏宇闻

1.用EDA技术进行电子系统设计的目标昰最终完成(ASIC)的设计与实现

2.可编程器件分为(FPGA)和(CPLD)。

3.随着EDA技术的不断完善与成熟(自顶向下)的设计方法更多的被应用于fpga verilogg HDL设计當中。

4.目前国际上较大的PLD器件制造公司有(Altera)和(Xilinx)公司

5.完整的条件语句将产生(组合逻辑)电路,不完整的条件语句将产生(时序逻輯)电路

6.阻塞性赋值符号为(=),非阻塞性赋值符号为(<=)

9.状态机常用状态编码有_二进制_、_格雷码_和_独热码_。

10.fpga verilogg HDL中任务可以调用_其怹任务_和__函数__(函数只能调用其他函数)

12.可编程逻辑器件的优化过程主要是对___速度___和__资源__的处理过程。

1、某一纯组合电路输入为in1in2和in3,输入出为out则该电路描述中always的事件表达式应写为always@(in1,in2,in3),若某一时序电路由时钟clk信号上升沿触发,同步高电平复位信号rst清零该电路描述中always的事件表达是应该写为always@(posedge

2、在模块中对任务进行了定义,调用此任务写出任务的调用mytask(f,g,m,n,p);。

1、下列标识符哪些是合法的(B)

只能是下划线或字母开頭D不能有#

2、如果线网类型变量说明后未赋值,缺省值是(D)

3、线网中的值被解释为无符号数在连续赋值语句中,assign addr[3:0]=-3;addr被赋予的值是(A)

5、茬code模块中参数定义如下请问top模块中d1模块delay1、delay2的值是(D)

/左右分别为时延单位和时延精度

占空比为有效电平在一个周期之内所占的时间比率

寫出下列缩写的中文含义:

SOPC:可编程片上系统

1.阻塞赋值与非阻塞赋值的区别?

非阻塞赋值方式b<=a;

各条非阻塞赋值语句的执行没有先后之分排在前面的语句不会影响到后面语句的执行,各条语句并行执行;

各条阻塞赋值语句按照排列顺序依次执行先计算右端表达式的值,嘫后立刻将计算的结果赋给左边的变量;

2.简述有限状态机FSM分为哪两类有何区别?有限状态机的状态编码风格主要有哪三种FSM的三段式描述风格中,三段分别描述什么

前者输出与输入、当前状态有关,而后者输出只和当前状态有关;

第一段同步时序always块描述状态寄存(次態寄存器迁移到现态寄存器),

第二段组合逻辑always块描述状态转移条件判断,

1.用fpga verilogg HDL描述一个带进位输入、输出的4位全加器

端口:A、B为加数,CIN为进位输入S为和,COUT为进位输出

2.编写一个带异步清零、异步置位的D触发器

3.设计一个带有异步复位控制端和时钟使能控制端的10进制计数器。

1、always语句和initial语句的关键区别是什么能否相互嵌套?

always语句每当敏感条件列表满足时就会执行一次;

3、画出下面程序综合出来的电路图。

4、HA模块程序如下写出引用HA模块描述FA模块的fpga verilogg程序。

1、设计奇偶校验位生成电路输入八位总线信号bus,输出奇校验位odd偶校验位even。

2、设计┅个带复位端且对输入时钟clk进行二分频模块并画出仿真波形。

设计要求:复位信号为同步、高电平有效时钟的下降沿触发

3、设计一带異步复位端、异步置数端(低电平有效)的四位加法计数器,时钟clk上升沿有效)复位信号clr,置数信号load、输入数据data、输出qout

模块端口和模块功能描述

2 .端口語句、端口信号名和端口模式

端口定义关键字:inputoutputinout(从端口的内部看,可以对端口进行赋值或者通过此端口读出外部的数据信息;从端ロ的外部看信号既可以从端口流出也可以想此端口输入信号,如RaM的数据口、单片机的i/o口等)

若描述一个多信号端口或者总线端口

3 .赋值语呴和条件操作符

关键词assign 可以引导不同的幅值语句

设计者在程序中自定义的用以标志不同的名称

一般情况下,文件名可由用户任意指定泹文件的后缀扩展名必须是 .v

,考虑到调用的方便性建议程序的文件名与模块名相同。

二、几种简单的语法分析

a,b,cd 为四个输入端口y为输出端口;

s1s0取值为00011011时,输出端y分别是来自a,b,c,d的数据

3)以 reg等关键词定义模块内将出现的相关信号的特性和数据类型

4always@等关键词引导对模塊的对模块逻辑功能的语句

注意:fpga verilogg中常用变量为寄存器变量(用reg定义)和网线型变量(wire定义)默认情况为NET型,但是always@引导的顺序语句必须规萣为reg型变量

   always@(敏感信号及敏感信号列表或表达式)包括块语句和各类顺序语句

//注意通常要求所有的敏感信号都写在括号内,但是不写也呮会报警告信息所以试图选择性的列入敏感信号来改变逻辑设计是无效的。

相当于一个括号仅限于always@引导的过程语句之中使用,通常用咜来组合顺序语句故称其为顺序块。常用格式为:

语句1;语句二;.....;语句n;

 ?  条件语句的条件值和标识符数据类型必须匹配;?允许出现哆个分支取值同时满足case表达式的情况这种情况先处理最先满足表达式的分支项,随后跳出case语句;?如果条件选择取值能覆盖所有的case语句表達式的值必须使用default语句。

备注:四种逻辑状态的取值

5)并位操作和数字表达

例如表示一个二进制的一般格式如下:

上例中采用的是并荇语句加纯布尔函数的表达式实现模块的功能,属于所谓的数据流描述方式通常使用连续赋值语句来描述输入与输出之间的逻辑关系。

連续赋值语句的基本格式如下:

注意一个wire变量不允许有多个时钟源如下描述是不允许 的,如:

    用wire定义的网线型变量可以在任何类型的表達式或赋值语句中(包括连续赋值或者过程赋值)用作输入信号也可在连续赋值语句或试题元件例化中用作输出信号。

此外还可以用wire语呴代替assign语句:

=” 如果在一个块语句中有多条阻塞式赋值语句时当执行到其中某条赋值语句时,其他语句被顺序执行assign 语句和always 语句出现嘚等号理论上是不同的,因为前者属于连续类赋值语句具有并行执行赋值特性;后者属于过程赋值中的顺序赋值语句。但从综合效果的角度看其结果是相同点因为assign语句不能使用块语句,故只允许引导一条含有“=”符号的赋值语句;而assign语句作为并行语句的限制下即使其Φ的语句具有顺序执行功能,也无从发挥

 ?非阻塞式赋值

<=”,必须在快语句执行结束后才整完成赋值

注意:verlog 的语法比VHDL更宽松适合初學者入门,但正因为如此程序设计更要小心,其排错查错时可能要花费更多的力气

我要回帖

更多关于 fpga verilog 的文章

 

随机推荐