当前位置:文档之家› 抢答器VerilogHDL实现

抢答器VerilogHDL实现

抢答器VerilogHDL实现
抢答器VerilogHDL实现

抢答器(-Verilog-HDL实现)

————————————————————————————————作者:————————————————————————————————日期:

桂林电子科技大学信息科技学院《EDA技术与应用》实训报告

学号0952100110

姓名赵万里

指导教师:江国强杨艺敏

2011年04月20日

实训题目:智能电子抢答器

1.系统设计

1.1 设计要求

1.1.1设计任务

设计并制作一台智能电子抢答器。

1.1.2 技术要求

①用EDA实训仪的I/O设备和PLD芯片实现智能电子抢答器的设计。

②智能电子抢答器可容纳4组参赛者抢答,每组设一个抢答钮。

③电路具有第一抢答信号的鉴别和锁存功能。在主持人将复位按钮按下后开始抢答,并用EDA实训仪上的八段数码管显示抢答者的序号,同时扬声器发出“嘟嘟”的响声,并维持3秒钟,此时电路自锁,不再接受其他选手的抢答信号。

④设计一个计分电路,每组在开始时设置为100分,抢答后由主持人计分,答对一次加10分,答错一次减10分。

⑤设计一个犯规电路,对提前抢答和超时抢答者鸣喇叭示警,并显示犯规的组别序号。

1.2方案比较

(1)设计制作一个可容纳四组参赛者的数字智力抢答器,每组设置一个抢答按钮。

(2)电路具有第一抢答信号的鉴别和锁存功能。在主持人按下复位按钮后,若参加者按抢答开关,则该组指示灯亮。此时,电路应具

备自锁功能,使别组的抢答开关不起作用。

(3)自锁后,用八段数码管显示抢答者的序号,同时指示灯亮。(4)设置计分电路。每组在开始时预置成100,抢答后由主持人计分,答对一次加10,否则减10分。

(5)电路具有淘汰功能,当每组的100分减少到0时,该组被淘汰,以后每次抢答,该组抢答按钮都无效。

1.3 方案论证

1.3.1 总体思路

总体分为四部分:倒计时模块、计分模块、抢答模块和分屏显示模块。

倒计时模块用一个20000000分频。产生一个进位,连接一个30的减法计数器构成。

计分模块中分为两部分,一部分用于计分,另一部分用于处理计数器的进制问题,当加到A时自动向前进位,并且把A变为0。当减少到F时,向前借位,并且把F变为9。这就实现了把十六进制变成一般用的十进制。

抢答模块分两部分,复位模块和抢答模块,每次抢答都要初始化按键。抢答模块又分为误抢,无人抢答和正确抢答。每次抢答,当有一组按下抢答,立即锁定,亮相应的分数和组号,并且亮起各种抢答所对应的灯信号。(即所要求的蜂鸣器)

分屏显示模块中用每次抢答的组号作为输入,当抢答后立即换屏显示其组号分数。

1.3.2 设计方案

(1)根据设计要求需要一个时钟的接入端clk,清除端clrn,使倒计时复位,count进位端当倒计时到0时进位,进位端返回到j,使倒计时停止。当佣人抢答时,输入一个低电平,在取反输入到i,使倒计时停止。

????(图1)

(2)电路的计分模块,d位组号的输入端,是s1位计数按键,p位加减的控制端,高电平是s1位加分,低电平s1位减分,t1、t2、t3、t4位各组的分数输出端,cnn1、cnn2、cnn3、cnn4分别为第一组、第二组、第三组、第四组的减分进位端,当分数减少到0的时候,产生进位,使该组不能再次抢答,使其淘汰。

(图2)

(3)抢答模块,clk位时钟的输入端,再程序的开始捕捉时钟的上升沿,qd是抢答初始化,每次抢答开始首先初始化,使抢答就位,准备开始抢答。qd1、qd2、qd3、qd4为四组的抢答按键,每次有一组抢答后程序立即锁定,使别的组不能再抢答。K为抢答开的的控制键,k 高电平时开始抢答,低电平时抢答即为误抢。cnn1、cnn2、cnn3、cnn4位减数进位端,sig、sig1、sig2为各种抢的标志的输出,即亮灯(蜂鸣器)。d位抢答者的组号输出端。

(图3)

(4)分屏显示模块mux_1,d,t1、t2、t3、t4分别为组号和各组分数的输入端,w换屏信号的输入端,qs位输出。

(图4)

(5)全局电路

2.各个模块程序的设计

(1)倒计时模块,20000000分频产生进位,输入到计数器模块,完成30秒计数。

(2)计分模块,用一个按键和一个拨动开关,拨动开关高点平时按键每按一次加十分,低电平时每按一次减十分。

(3)抢答模块

A、一个复位键,四个抢答键,当按下复位键后,如果有选手抢答,则电路立即锁定,使其他组不能再次抢答。

B、在没有开始抢答之前,如果用人抢答即为误抢,显示其组号,分数。

C、30秒倒计时开始,抢答者都不抢答,则表示无人抢答,亮起相应的灯。

(4)分屏显示模块,此模块完全由输入的组号控制。

3.制作与调试过程

(1)30秒倒计时的调试,管脚锁定clk,使每秒产生一个进位,送到

减数器模块。

(2)计分模块,锁定两组的管脚,进行操作,组号的输入用拨动开关控制。

(3)抢答模块,锁定相应的管脚,进行抢答,误抢和无人抢答操作,测试是否能够锁定,以及亮灯,显示正确的组号分数。

4.结论

本次实训为期三周,确定下题目后,首先就是方案的确定。经过老师的辅导、同学的帮助、翻阅相关资料,综合各方面的考虑。了解EP1C3T144C8芯片的构造,需要查看大量的英文资料,我并没有气馁,一个管脚一个管脚的对比,终于弄清楚了实现功能的大体思路。然后就是再次学习Verilog HDL语言,虽然以前学过,但是差不多都忘了,用了几天时间熟悉了Verilog HDL 源程序的编写。最后是硬件的调试,这是个漫长的过程,EP1C3T144C8芯片的接口也非常的繁杂,最后我坚持了下来。

5.实训心得体会

通过这次实训,我对Verilog HDL有了深入的认识。同时也对E DA产生了更加浓厚的兴趣。本次实训,也检验了自己的能力,加强了逻辑思维的能力,不过我也发现了自身存在的一些问题,比如在quartus软件的应用上还有很多不成熟不理解的地方,但是相信在以后的学习生活中我可以很好的与予改正,取得更好的成绩,也希望日后老师能不厌其烦的指导我,给予我更大的支持。

6.参考文献

1 江国强EDA技术与应用第三版电子工业出版社2010 2谭会生,张昌凡. EDA技术及应用.第二版.西安电子科技大学出版社,2009?附录:①仿真波形图(部分模块)

???(图1 30秒倒计时)

②程序清单

(1)倒计时模块

A.20000000分频程序

modulecnt60(clk,cout,i,j,m);

input clk,i,j,m;

reg [24:0]?q;

output reg cout;

always @(posedgeclk&(~i)&(~j)&(~m))

begin

if(q<20000000-1) q=q+1;

else q=0;

if(q==20000000-1)cout=1;

else cout=0;

end

endmodule

B、30秒倒计时程序

module cntdj(clrn,clk,q,count);

input clk,clrn;

output reg [7:0] q;

output regcount;

always @(posedge clk or negedge clrn)

if(~clrn)begin q='h30;count='h0; end

else begin

if(q==0) q='h30;

else q=q-1;

if(q[3:0]=='hf)begin q[3:0]=9;end

if(q=='h0)count=1;

elsecount=0;

end

endmodule

(2)计分模块程序

module jiajianjishu(t1,t2,t3,t4,s1,d,count,cnn 1,cnn2,cnn3,cnn4,p);

input s1,p;

input [3:0]d;

output reg count,cnn1,cnn2,cnn3,cnn4;

output reg[11:0]t1,t2,t3,t4;

initial begint1='h100;t2='h100;t3='h100;t4='h100; end

always @(posedges1)

begin

if(p)begin

?if(d=='h1) begint1=t1+'h10;

??if(t1[7:4]=='ha)begin

??????t1[7:4]=0;t1[11:8]=t1[11:8]+1;

?????end

??else if(t1=='h1000) count=1;

?????else count=0;end

??else if(d=='h2)begin t2=t2+'h10;

?????if(t2[7:4]=='ha)begin

??????t2[7:4]=0;t2[11:8]=t2[11:8]+1;

????end

????else if(t2=='h1000) count=1;

??else count=0;end

?else if(d=='h3) begint3=t3+'h10;

??if(t3[7:4]=='ha)begin

???????t3[7:4]=0;t3[11:8]=t3[11:8]+1;

????end

????else if(t3=='h1000) count=1;

????else count=0;end

??elseif(d=='h4) begin t4=t4+'h10;

?????if(t4[7:4]=='ha)begin

?????t4[7:4]=0;t4[11:8]=t4[11:8]+1;

??????end

?????else if(t4=='h1000)count=1;

???else count=0;end

?else begin t1='h100;t2='h100;t3='h100;t4='h100; end end

else if(~p)

begin

if(d=='h1) begin t1=t1-'h10;

???if(t1[7:4]=='hf)begin t1[7:4]=9;t1[11:8]=t1[11:8]-1;

????if(t1[11:8]=='hf)begint1[11:8]=0;end

??????/*elset1[11:8]=t1[11:8];*/

???????end

???elseif(t1[11:4]=='h0)begin cnn1=1;t1[11:0]='h0; end

?elsecnn1=0;

?end

??else if(d=='h2) begint2=t2-'h10;

????if(t2[7:4]=='hf)begin t2[7:4]=9;t2[11:8]=t2[11:8]-1;

????if(t2[11:8]=='hf)begin t2[11:8]=0;end

??????/* else t2[11:8]=t2[11:8];*/

?????end

?

?????else if(t2[11:4]=='h0)begincnn2=1;t2[11:0]='h0;end

????else cnn2=0;end

??else if(d=='h3)begint3=t3-'h10;

??????if(t3[7:4]=='hf)begin t3[7:4]=9;t3[11:8]=t3[11:8]-1;

???????if(t3[11:8]=='hf)begint3[11:8]=0;end

?????????/*elset3[11:8]=t3[11:8];*/

???????end

????else if(t3[11:4]=='h0) begin cnn3=1;t3[11:0]='h0;end

????else cnn3=0;end

elseif(d=='h4) begin t4=t4-'h10;

??????if(t4[7:4]=='hf)begin t4[7:4]=9;t4[11:8]=t 4[11:8]-1;

???????if(t4[11:8]=='hf)begin t4[11:8]=0;end

????/*else t4[11:8]=t4[11:8];*/

???????end

??

???????else if(t4[11:4]=='h0) begin cnn4=1;t4[11:0]='h0 ;end

?????elsecnn4=0;end

??elsebegin t1=100;t2=100;t3=100;t4=100;end

end

end

endmodule

(3)抢答模块程序

module qdq(clk,qd,qd1,qd2,qd3,qd4,Sig,Sig1,Sig2,d,k,g,cnn1,cnn2,cnn3,cnn4);

input clk,qd,qd1,qd2,qd3,qd4,k,g,cnn1,cnn2,cnn3,cnn 4;

output Sig,Sig1,Sig2;

output [3:0]d;

reg Sig='h0,Sig1='h0,Sig2='h0; reg[3:0]d;

reg zd=1'b0;

always @(posedgeclk)

begin

if(qd==1'b0)

begin

?zd=1'b1;

Sig='h0;

?Sig1='h0;

Sig2='h0;

?d='h0;

??end

if(k)begin

if(zd==1'b1)

begin

??if((qd1==1'b0)&(~cnn1))

??begin

??zd=1'b0;

?Sig='h1;

end

?else if((qd2==1'b0)&(~cnn2))

?begin

??zd=1'b0;

?Sig='h1;

??d=2;

?end

??else if((qd3==1'b0)&(~cnn3))

?begin

?zd=1'b0;

?Sig='h1;

???d=3;

?end

?elseif((qd4==1'b0)&(~cnn4))

?begin

???zd=1'b0;

???Sig='h1;

??d=4;

??end

??else if(g)begin zd=1'b0;Sig2='h1; endend

else if(~k)begin

?if(zd==1'b1)

?begin

if((qd1==1'b0)&(~cnn1))

?begin

?zd=1'b0;

??Sig1='h1;

?d=1;

end

?else if((qd2==1'b0)&(~cnn2)) ??begin

?zd=1'b0;

???Sig1='h1;

d=2;

???end

?else if((qd3==1'b0)&(~cnn3))

?begin

?zd=1'b0;

Sig1='h1;

?d=3;

end

?elseif((qd4==1'b0)&(~cnn4))

??begin

?zd=1'b0;

Sig1='h1;

?d=4;

??end

end

end?

?end

endmodule

(4)分屏显示模块程序

module mux_1(d,t1,t2,t3,t4,w,qs);

inputw;

input [3:0] d;

input[11:0] t1,t2,t3,t4;

outputreg[15:0] qs;

always

begin

if(w)begin

qs[15:12]=d;

?if(d==1)beginqs[11:0]=t1;end ?else if(d==2)begin qs[11:0]=t2;end

?else if(d==3)beginqs[11:0]=t3;end ??else if(d==4)beginqs[11:0]=t4;end?else qs[11:0]=0;

?end

elseqs[15:0]=0;

end

endmodule

可综合的Verilog语法子集总汇

常用的RTL语法结构如下: ☆模块声明:module……endmodule ☆端口声明:input,output,inout(inout的用法比较特殊,需要注意) ☆信号类型:wire,reg,tri等,integer常用语for语句中(reg,wire时最常用的,一般tri和integer 不用) ☆参数定义:parameter ☆运算操作符:各种逻辑操作符、移位操作符、算术操作符大多时可综合的(注:===与!==是不可综合的) ☆比较判断:if……else,case(casex,casez)……default endcase ☆连续赋值:assign,问号表达式(?:) ☆always模块:(敏感表可以为电平、沿信号posedge/negedge;通常和@连用) ☆begin……end(通俗的说,它就是C语言里的“{ }”) ☆任务定义:task……endtask ☆循环语句:for(用的也比较少,但是在一些特定的设计中使用它会起到事半功倍的效果) ☆赋值符号:= 和<= (阻塞和非阻塞赋值,在具体设计中时很有讲究的) 可综合的语法时verilog可用语法里很小的一个子集,用最精简的语句描述最复杂的硬件,这也正是硬件描述语言的本质。对于做RTL级设计来说,掌握好上面这些基本语法是很重要。 相信大家在看了这么多了verilog语法书籍以后一定有点烦了,那么现在我告诉大家一个好消息,对于一个RTL级的设计来说,掌握了上面的语法就已经足够了,无论多么牛逼的工程师,在他的代码

里无非也就是上面一些语法而已。当然了,对于一个能够进行很好的仿真验证的代码,一般还需要在RTL级的设计代码中添加一些延时之类的语句,比如大家一定知道#10的作用,就是延时10个单位时间,这个语句虽然在仿真的时候是实实在在的延时,但是这个语句在综合后是会被忽略的,也就是说在我们综合并且布局布线最后烧进FPGA里,这个#10的延时是不会在硬件上实现的。所以说,上面给出的这些语法才是可以最后在硬件上实现的,其它的语法大多会在综合后被忽略。这么一来大家就要问了,为什么语法书里又要给出这么多的语法呢?呵呵,它们大都是为仿真验证是写testbench 准备的,先点到为止,下集继续! 对于模型(module)的建立,要保证可综合性应该注意: (1)不使用initial。(被忽略) (2)不使用#10。(被忽略) (3)不使用循环次数不确定的循环语句,如forever、while等。 (4)不使用用户自定义原语(UDP元件)。 (5)尽量使用同步方式设计电路。 (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。(10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。 (11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。 (12)避免混合使用上升沿和下降沿触发的触发器。

VerilogHDL复习题与答案

VerilogHDL硬件描述语言复习 一、 1.VerilogHDL是在哪一年首次被IEEE标准化的? 答:VerilogHDL是在1995年首次被IEEE标准化的。 2.VerilogHDL支持哪三种基本描述方式? 答:VerilogHDL可采用三种不同方式或混合方式对设计建模。这些方式包括:行为描述方式—使用过程 化结 构建模;数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述 建模 3.VerilogHDL是由哪个公司最先开发的? 答:VerilogHDL是由GatewayDesignAutomation公司最先开发的 4.VerilogHDL中的两类主要数据类型什么? 答:线网数据类型和寄存器数据类型。线网类型表示构件间的物理连线,而寄存器类型表示 抽象的数据存储元件。 5.UDP代表什么? 答:UDP代表用户定义原语 6.写出两个开关级基本门的名称。答: pmosnmos 7.写出两个基本逻辑门的名称。答: andor 8.在数据流描述方式中使用什么语句描述一个设计? 答:设计的数据流行为使用连续赋值语句进行描述 9.采用结构描述方式描述1位全加器。 答: modulefull_add(a,b,cin,s,co); inputa,b,cin; outputs,co; wireS1,T1,T2,T3; xor X1(S1,a,b), X2(s,S1,cin); and A1(T3,a,b), A2(T2,b,cin), A3(T1,a,cin); or O1(co,T1,T2,T3); endmodule 10.initial语句与always语句的关键区别是什么? 答:1)initial语句:此语句只执行一次。 2)always语句:此语句总是循环执行,或者说此语句重复执行。 11.采用数据流方式描述2-4译码器。 答: 'timescale1ns/ns moduleDecoder2×4(A,B,EN,Z); inputA,B,EN; output[0:3]Z; 1

基于VerilogHDL语言的可综合性设计

基于Verilog HDL语言的可综合性设计 1 引言 逻辑综合带来了数字设计行业的革命,有效地提高了生产率,减少了设计周期时间。在手动转换设计的年代,设计过程受到诸多限制,结更容易带来人为的错误。而一个小小的错误就导致整个模块需进行重新设计,设计转换工作占去了整个设计周期的大部分时间,验证工作进行困难,设计技术无法重用等等。而自动逻辑综合工具的出现,突破了上述种种限制,使得设计者从繁琐的转换工作中解脱出来,将更多的时间用于验证和优化,不仅保证了功能的实现,而且有利于提高性能。可见,综合在逻辑设计中具有举足轻重的作用。 2 综合的概念及其过程 2.1 逻辑综合概述 综合就是在给定标准元件库和一定的设计约束条件下,把用语言描述的电路模型转换成门级网表的过程。要完成一次综合过程,必须包含三要素:RTL级描述、约束条件和工艺库。 2.2 RTL级描述 RTL级描述是以规定设计中采用各种寄存器形式为特征,然后在寄存器之间插入组合逻辑,其可以用如图1所示的“寄存器和云图”方式来表示。 图1 RTL级描述 2.3 约束条件 为了控制优化输出和映射工艺要用约束,它为优化和映射试图满足的工艺约束提供了目标,并且它们控制设计的结构实现方式。目前综合工具中可用的约束包括面积、速度、功耗和可测性约束,未来我们或许会看到对封装的约束和对布图的约束等,但是,目前的最普遍的约束是按面积和按时间的约束。 时钟限制条件规定时钟的工作频率,面积限制条件规定该设计将花的最大面积。综合工具将试图用各种可能的规则和算法尽可能地满足这些条件。 2.4 工艺库 按照所希望的逻辑行为功能和有关的约束建立设计的网表时,工艺库持有综合工具必须的全部信息。工艺库含有允许综合进程为建立设计做正确选择的全部信息,工艺库不仅含有ASIC单元的逻辑功能,而且还有该单元的面积、单元输入到输出的定时关系、有关单元扇出的某种限制和对单元所需的定时检查。

Verilog可综合与不可综合语句汇总

1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。 (2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。 (3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。 建立可综合模型的原则 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:(1)不使用initial。 (2)不使用#10。 (3)不使用循环次数不确定的循环语句,如forever、while等。 (4)不使用用户自定义原语(UDP元件)。 (5)尽量使用同步方式设计电路。 (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。 (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。

verilog综合心得

综合:不可综合的运算符:= = = ,!= =,/(除法),%(取余数)。 1、不使用初始化语句。 2、不使用带有延时的描述。 3、不使用循环次数不确定的循环语句,如:forever、while等。 4、尽量采用同步方式设计电路。 5、除非是关键路径的设计,一般不调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 6、用always过程块描述组合逻辑,应在信号敏感列表中列出所有的输入信号。 7、所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 8、在verilog模块中,任务(task)通常被综合成组合逻辑的形式,每个函数(function)在调用时通常也被综合为一个独立的组合电路模块。 9、用户自定义原语(UDP)是不可综合的,它只能用来建立门级元件的仿真模型。 一般综合工具支持的V erilog HDL结构

移位运算符:V erilog HDL提供向右(>>)及向左(<<)两种运算符,运算符高位或地位一旦移出即予丢弃,其空缺的位则予以补零。 连续赋值语句(assign)、case语句、if…else语句都是可以综合的 initial 语句内若包含有多个语句时,必须以begin end 作聚合;单一的初值赋值,因此并不需以begin end做聚合。 循环(Loops)并不能单独地在程序中存在,而必须在initial和always块中才能使用。initial过程块中的语句仅执行一次,而always块中的语句是不断重复执行的。 编写顶层模块的注意事项 每个端口除了要声明是输入、输出还是双向外,还要声明其数据类型,是连线型(wire)还是寄存器型(reg),如果没有声明则综合器默认为wire型。 1、输入和双向端口不能声明为寄存器型。 2、在测试模块中不需要定义端口。 编写testbentch所归纳的心得

verilog语句可综合vs不可综合

1)所有综合工具都支持的结构: always,assign,begin,end,case,wire,tri,supply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。 2)所有综合工具都不支持的结构: time,defparam,$finish,fork,join,initial,delays,UDP,wait。 3)有些工具支持有些工具不支持的结构: casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。 建立可综合模型的原则 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点: 1)不使用initial。 2)不使用#10。 3)不使用循环次数不确定的循环语句,如forever、while等。 4)不使用用户自定义原语(UDP元件)。 5)尽量使用同步方式设计电路。 6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。 10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对

verilog语言的综合与不可综合

Verilog的综合与不可综合 综合说明编的代码可以对应出具体的电路,不可综合说明没有对应的电路结构。不可综合的代码编译通过,只能看到输出,不能实现电路,就是不能用来制作具体的芯片。 一、基本 Verilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器。 二:verilog语句结构到门级的映射 1、连续性赋值:assign 连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因些连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。 2、过程性赋值: 过程性赋值只出现在always语句中。 阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。 建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。 过程性赋值的赋值对象有可能综合成wire,latch,和flip-flop,取决于具体状况。如,时钟控制下的非阻塞赋值综合成flip-flop。 过程性赋值语句中的任何延时在综合时都将忽略。 建议同一个变量单一地使用阻塞或者非阻塞赋值。 3、逻辑操作符: 逻辑操作符对应于硬件中已有的逻辑门 4、算术操作符: Verilog中将reg视为无符号数,而integer视为有符号数。因此,进行有符号操作时使用integer,使用无符号操作时使用reg。 5、进位: 通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如: Wire [3:0] A,B; Wire [4:0] C; Assign C=A+B; C的最高位用来存放进位。 6、关系运算符: 关系运算符:<,>,<=,>= 和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg,net还是integer。

verilog不可被综合的语句

verilog 不可综合语句总结汇总 2009-04-20 18:37 (1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。 (2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。 (3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。 建立可综合模型的原则 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点: (1)不使用initial。 (2)不使用#10。 (3)不使用循环次数不确定的循环语句,如forever、while等。 (4)不使用用户自定义原语(UDP元件)。 (5)尽量使用同步方式设计电路。 (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。 (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。 (11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。 (12)避免混合使用上升沿和下降沿触发的触发器。 (13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。 (14)避免在case语句的分支项中使用x值或z值。 不可综合verilog语句2009-04-14 19:33

FPGA中不可综合语句汇总

(1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。 (2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。 (3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。 建立可综合模型的原则 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点: (1)不使用initial。 (2)不使用#10。 (3)不使用循环次数不确定的循环语句,如forever、while等。 (4)不使用用户自定义原语(UDP元件)。 (5)尽量使用同步方式设计电路。 (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。 (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。 (11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。 (12)避免混合使用上升沿和下降沿触发的触发器。 (13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。 (14)避免在case语句的分支项中使用x值或z值。 不可综合verilog语句2009-04-1419:33 1、initial 只能在test bench中使用,不能综合。(我用ISE9.1综合时,有的简单的initial也可以综合,不知道为什么) 2、events event在同步test bench时更有用,不能综合。 3、real 不支持real数据类型的综合。 4、time 不支持time数据类型的综合。

可综合的Verilog语句

可综合Verilog语句 ?一: 综合就是从采用Verilog HDL 语言描述的寄存器传输级电路模型构造出门级网表的过程.产生门级网表之后,逻辑优化器读入网表并以用户指定的面积和定时约束为目标优化网表. ?二. 设计流程中的综合 ?Verilog HDL允许用户在不同的抽象层次上对电路进行建模,这些层次从门级、寄存器传输级、行为级直至算法级。因此,同一电路就可以有多种不同的描述方式,但不是每一中描述都是可综合的。事实上,Verilog HDL 原本被设计成一种仿真语言,而不时一种综合语言。结果导致Verilog HDL 中很多结构没有相应的硬件可以对应,例如系统调用$display.同样也不存在用于寄存器传输级综合的Verilog HDL 标准子集.?正是由于存在这些问题,不同的综合系统所支持的Verilog HDL 综合子集是不同的.由于Verilog HDL 中不存在单个的对象来表示锁存器或触发器,所以每一种综合系统都会提供不同的机制以实现锁存器或触发器的建模.因此各种综合系统都定义了自己的Verilog HDL 可综合子集以及自己的建模方式. ?使用Verilog HDL 以不同的方式描述了同一电路.某综合系统支持对方式A和方式B的综合,但可能不支持对方式C的综合,这意味着综合模型在不同的综合系统之间通常是不可移植的. ?这一局限性使设计者不仅需要理解Verilog HDL ,而且必须理解特定综合系统的建模方式, 才能编写出可综合的模型.可综合的数据类型?1.网线数据类型: ?Wire,wor,wand,tri,supply0,supply1 ?2.寄存器数据类型: ?Reg,integer ?Time,real:不能综合. ?3.常量: ?整型. ?实型和字符串型不能综合.可综合的运算符?1.逻辑运算符能直接映射成硬件中的基本逻辑门. ?2.算术运算符 ?3.关系运算符: ?能综合的有:>,<,<=,>=. ?4.相等性算符: ?能够综合的有:==和!=. ?不能综合:===和!==(有些工具按==和!=综合). ?5.移位运算符: ?<<和>>,移位腾出的位都补0. 多个时钟的可综合情况 ?1.多个时钟的情况:对变量的赋值不能受多个时钟控制 例如: ? module multclk(clk1,clk2,addclk,and,rstn,subclr,subn,dsadd,dssub);

verilog可综合

verilog综合小结 一:基本Verilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器。 二:verilog语句结构到门级的映射 连续性赋值:assign连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因些连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。 过程性赋值:过程性赋值只出现在always语句中。阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。过程性赋值的赋值对象有可能综合成wire,latch,和flip-flop,取决于具体状况。如,时钟控制下的非阻塞赋值综合成flip-flop。过程性赋值语句中的任何延时在综合时都将忽略。建议同一个变量单一地使用阻塞或者非阻塞赋值。 逻辑操作符:逻辑操作符对应于硬件中已有的逻辑门 算术操作符:V erilog中将reg视为有符号数,而integer视为有符号数。因此,进行有符号操作时使用integer,使用无符号操作时使用reg。 进位:通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如:Wire [3:0] A,B;Wire [4:0] C;Assign C=A+B;C的最高位用来存放进位。 关系运算符:关系运算符:<,>,<=,>=和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg ,net还是integer。 相等运算符:==,!=注意:===和!==是不可综合的。可以进行有符号或无符号操作,取决于数据类型 移位运算符:左移,右移,右边操作数可以是常数或者是变量,二者综合出来的结果不同。 部分选择:部分选择索引必须是常量。 BIT选择:BIT选择中的索引可以用变量,这样将综合成多路(复用)器。 敏感表:Always过程中,所有被读取的数据,即等号右边的变量都要应放在敏感表中,不然,综合时不能正确地映射到所用的门。 IF:如果变量没有在IF语句的每个分支中进行赋值,将会产生latch。如果IF语句中产生了latch,则IF的条件中最好不要用到算术操作。Case语句类似。Case的条款可以是变量。如果一个变量在同一个IF条件分支中先赎值然后读取,则不会产生latch。如果先读取,后赎值,则会产生latch。 循环:只有for-loop语句是可以综合的。 设计时序电路时,建议变量在always语句中赋值,而在该always语句外使用,使综合时能准确地匹配。建议不要使用局部变量。 不能在多个always块中对同一个变量赎值 函数函数代表一个组合逻辑,所有内部定义的变量都是临时的,这些变量综合后为wire。 任务:任务可能是组合逻辑或者时序逻辑,取决于何种情况下调用任务。 Z:Z会综合成一个三态门,必须在条件语句中赋值 参数化设计:优点:参数可重载,不需要多次定义模块 三:模块优化 资源共享:当进程涉及到共用ALU时,要考虑资源分配问题。可以共享的操作符主要

verilog可综合设计说明

verilog的可综合设计 Averilog的流行,有两方面的原因; B verilog与VHDL相比的优点 C典型的verilog模块 D verilog语法要点 A) verilog的流行,有两方面的原因: 1它是cadence的模拟器verilog-XL的基础,cadence的广泛流行使得verilog在90年代深入人心; 2它在硅谷获得广泛使用; B) verilog与VHDL相比的优点 二者的关系仿佛C与FORTRAN,具体而言: 1 verilog的代码效率更高: 比较明显的对比: VHDL在描述一个实体时采用entity/architecture模式, verilog在描述一个实体时只需用一个"module/edumodule"语句块. 此外verilog的高效性还在很多地方体现出来; 2 verilog支持二进制的加减运算: VHDL在进行二进制的加减运算时使用conv_***函数或者进行其他的定义,总之必须通知编译器;verilog直接用形如"c=a+b"的表示二进制的加减运算; 3综合时可控制性好: VHDL对信号不加区分地定义为"signal", 而verilog区分为register类型的和wire类型的; 但是也有人支持VHDL,认为verilog和VHDL的关系仿佛C和C++. C)典型的verilog模块 讨论以下典型电路的verilog描述: *与非门; *加法器; //即全加器 * D触发器; *计数器; //**分频的counter * latch; *时序机; *RAM; //用synopsys的 *模块引用; *预编译; *与非门的verilog描述如下: //verilog使用和C语言相同的注释方法 module nd02(a1,a2,zn);//一个verilog模块总是以module开始,以endmodule 结束,nd02是模块名,a1,a2,zn是模块的3个输入输出信号 input a1,a2; //告诉编译器a1,a2对此模块而言是输入,并且数据类型是"bit" output zn; //告诉编译器zn对此模块而言是输出,数据类型也是"bit" nand (zn,a1,a2); //我理解nand是运算符,我们不必深究verilog中的正式术语是什

Verilog HDL语言的描述语句

第4节Verilog HDL语言的描述语句Verilog HDL 描述语句 2.4.1 结构描述形式 通过实例进行描述的方法,将Verilog HDL预先定义的基本单元实例嵌入到代码中,监控实例的输入。Verilog HDL中定义了26个有关门级的关键字,比较常用的有8个。 在实际工程中,简单的逻辑电路由逻辑门和开关组成,通过门元语可以直观地描述其结构。 基本的门类型关键字如下所述: ?and ?nand ?nor ?or ?xor ?xnor ?buf ?not Verilog HDL支持的基本逻辑部件是由该基本逻辑器件的原语提供的。其调用格式为: 门类型<实例名> (输出,输入1,输入2,……,输入N) 例如,nand na01(na_out, a, b, c ); 表示一个名字为na01的与非门,输出为na_out,输入为a, b, c。 例2-5 一个简单的全加器例子: module ADD(A, B, Cin, Sum, Cout); input A, B, Cin; output Sum, Cout; // 声明变量 wire S1, T1, T2, T3; xor X1 (S1, A, B), X2 (Sum, S1, Cin); and A1 (T3, A, B), A2 (T2, B, Cin), A3 (T1, A, Cin); or O1 (Cout, T1, T2, T3);

endmodule 在这一实例中,模块包含门的实例语句,也就是包含内置门xor、and和or的实例语句。门实例由线网型变量S1、T1、T2和T3互连。由于未指定顺序,门实例语句可以以任何顺序出现。 门级描述本质上也是一种结构网表。在实际中的使用方式为:先使用门逻辑构成常用的触发器、选择器、加法器等模块,再利用已经设计的模块构成更高一层的模块,依次重复几次,便可以构成一些结构复杂的电路。其缺点是:不易管理,难度较大且需要一定的资源积累。 2.4.2 数据流描述形式 数据流型描述一般都采用assign连续赋值语句来实现,主要用于实现组合功能。连续赋值语句右边所有的变量受持续监控,只要这些变量有一个发生变化,整个表达式被重新赋值给左端。这种方法只能用于实现组合逻辑电路。其格式如下: assign L_s = R_s; 例2-6 一个利用数据流描述的移位器 module mlshift2(a, b); input a; output b; assign b = a<<2; endmodule 在上述模块中,只要a的值发生变化,b就会被重新赋值,所赋值为a左移两位后的值。 2.4.3 行为描述形式 行为型描述主要包括过程结构、语句块、时序控制、流控制等4个方面,主要用于时序逻辑功能的实现。 1.过程结构 过程结构采用下面4种过程模块来实现,具有强的通用型和有效性。 ?initial模块 ?always模块 ?任务(task)模块 ?函数(function)模块

Verilog中的一些语法和技巧

1、. 2、. 3、Reg型的数据类型默认初始值为X。reg型数据可以赋正值也可以赋负值,但 是当一个reg型数据是一个表达式的操作数的时候,他的值被当做无符号数及正值。 4、在数据类型中?和Z均表示高阻态。 5、Reg型只表示被定义的信号将用在“always”模块内,并不是说reg型一定 是寄存器或触发器的输出。虽然reg型信号常常是寄存器或触发器的输出但是并不一定总是这样。 6、Verilog语言中没有多维数组的存在。Memory型数据类型是通过扩展reg型 数据的弟子和范围来生成的。其格式如下reg[n-1:0]存储器名[m-1:0]; 7、在除法和取余的运算中结果的符号和第一个操作数的符号位是相同的。 8、不同长度的数据进行运算:两个长度不同的数据进行位运算时,系统会自动 地将两者按有端对齐,位数少的操作数会在相应的高位用0填满以便连个操作数安慰进行操作。 9、= = =与!= = =和= =与!= =的区别:后者称为逻辑等是运算符,其结果是 2个操作数的值决定的。由于操作书中某些位可能不定值x和高阻态z结果可能是不定值x。而 = = =和!= = =运算符对操作数的比较时对某些位的高阻态z和不定值x也进行比较,两个操作数必须完全一致,其结果才是1,否则是0. 10、非阻塞和阻塞赋值方式:非阻塞赋值方式(如a<=b)上面语句所赋得变 量值不能立即被下面语句所用,(2)快结束后才能完成这次赋值操作 3在编写克综合的时序逻辑模块时这是最常用的赋值方法。阻塞赋值(如a=b)赋值语句执行完后,块才结束 2 b的值在赋值语句完成后立即执行 3在时序逻辑使用中,可能产生意想不到的结果。 11、模块的描述方式:(RTL为寄存器传输级描述) “(1)数据流描述方式:数据流行描述主要用来描述组合功能,具体用“assign”连续赋值语句来实现。分为两种a、显式连续赋值语句;

Verilog关键字整理

1.verilog特点: 区分大小写,所有关键字都要求小写 不是强类型语言,不同类型数据之间可以赋值和运算 //是单行注释可以跨行注释 描述风格有系统级描述、行为级描述、RTL级描述、门级描述,其中RTL级和门级别与具体电路结构有关,行为级描述要遵守可综合原则,门级描述使用门级模型或者用户自定义模型UDP来代替具体基本元件,在IDE中针对不同FPGA器件已经有对应的基本元件原语 2.verilog语法要点: 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

Verilog HDL常用的行为仿真描述语句(一)

Verilog HDL常用的行为仿真描述语句(一) 一、循环语句 1、forever语句 forever语句必须写在initial模块中,主要用于产生周期性波形。 2、利用for、while循环语句完成遍历 for、while语句常用于完成遍历测试。当设计代码包含了多个工作模式,那么就需要对各个模式都进行遍历测试。其典型的应用模板如下:[c-sharp:nogutter] view plaincopy? parameter mode_num = 5; initial begin // 各种不同模式的参数配置部分 for(i=0; i<mode_num-1; i=i+1) begin case (i) 0: begin . . end

1: begin . . end . . endcase end // 各种模式共同的测试参数 . . end 3、利用repeat语句来实现有次数控制的事件,其典型示例如下: [c-sharp] view plaincopy? initial begin

// 初始化 in_data = 0; wr = 0; // 利用repeat语句将下面的代码执行10次 repeat(10) begin wr = 1; in_data = in_data + 1; #10; wr = 0; #200; end end 4、用disable实现循环语句的异常处理,其典型示例如下:[c-sharp] view plaincopy? begin : one_branch for(i=0; i<n; i=i+1) begin : two_branch if (a==0) disable one_branch; if (a==b)

verilog中可综合和不可综合语句概述

Verilog 中可综合及不可综合语句概述Verilog 硬件描述语言有很完整的语法结构和系统,类似高级语言,这些语法结构的应用给我们的设计描述带来很多方便。但是,我们知道,Verilog 是描述硬件电路的,它是建立在硬件电路的基础上的。有些语法结构是不能与实际硬件电路对应起来的,也就是说我们在把一个语言描述的程序映射成实际硬件电路中的结构时是不能实现的。下面就是我多年工作经验总结出来的大部分综合工具支持或不支持的verilog 语法结构。 一.用verilog 建立可综合模型的原则 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点: (1)不使用initial 。 (2)不使用#10。 (3)不使用循环次数不确定的循环语句,如forever、while 等。 (4)不使用用户自定义原语(UDP元件)。 (5)尽量使用同步方式设计电路。 (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。 (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。

(11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。 ( 12)避免混合使用上升沿和下降沿触发的触发器。 ( 13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。 (14)避免在case语句的分支项中使用x值或z值。 二.不可综合verilog 语句 1 、initial 只能在testbench中使用,不能综合。(我用ISE9.1综合时,有的简单的initial 也可以综合,不知道为什么) 2、events event 在同步test bench 时更有用,不能综合。 3、real 不支持real 数据类型的综合。 4、time 不支持time 数据类型的综合。 5、force 和release 不支持force禾口release的综合。 6、assign 禾口deassign 不支持对reg数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行综合。 7、fork join

veriloghdl的行为语句

Verilog HDL的行为语句 Verilog HDL有许多的行为语句,使其成为结构化和行为性的语言。Verilog HDL语句包括:赋值语句、过程语句、块语句、条件语句、循环语句、编译预处理等,如表5-14 所示。符号“√”表示该语句能够为综合工具所支持,是可综合的。 5.3.1 赋值语句 赋值语句包括持续赋值语句与过程赋值语句。 1. 持续赋值语句assign为持续赋值语句,主要用于对wire 型(连线型)变量赋值。例如:assign c=~(a&b); 在上面的赋值中,a、b、c三个变量皆为wire型变量,a和b 信号的任何变化,都将随时反映到c上来。 2. 过程赋值语句过程赋值语句多用于对reg型变量进行赋值。过程赋值有阻塞赋值和非阻塞赋值两种方式。 a. 非阻塞赋值方式非阻塞赋值符号为“<=”,如:b<=a; 非阻塞赋值在整个过程块结束时才完成赋值操作,即b的值并不是立刻就改变的。 b. 阻塞赋值方式阻塞赋值符号为“=”,如:b=a; 阻塞赋值在该语句结束时就立即完成赋值操作,即b的值在该语句结束时立刻改变。如果在一个块语句中(例如always块语句),有多条阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面的语句就不能被执行,仿佛被阻塞了一样,因此称为阻塞赋值方式。

5.3.2 过程语句VerilogHDL中的多数过程模块都从属于以下2种过程语句:initial及always。在一个模块(module)中,使用initial和always语句的次数是不受限制的。initial语句常用于仿真中的初始化,initial过程块中的语句仅执行一次;always块内的语句则是不断重复执行的。1. initial过程语句initial过程语句使用格式如下:initial begin 语句1; 语句2; | 语句n; end intial语句不带触发条件,initial过程中的块语句沿时间轴只执行一次。initial语句通常用于仿真模块中对激励向量的描述,或用于给寄存器变量赋初值,它是面向模拟仿真的过程语句,通常不能被逻辑综合工具所接受。 2. aIways过程语句always 过程语句使用格式如下:always @ (<敏感信号表达式>) begin //过程赋值//if-else,case,casex,casez选择语句//while,repeat,for循环 //task,function调用end always过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中。只有当触发条件满足敏感信号表达式时,其后的“begin-end”块语句才能被执行。 3. 敏感信号表达式所谓敏感信号表达式又称事件表达式,即当该表达式中变量的值改变时,就会引发块内语句的执行,因此敏感信号表达式中应列出影响块内取值的所有信号。若有两个或两个以上信

相关主题
文本预览
相关文档 最新文档