绪论
1.什么是信号处理电路?它通常由哪两⼤部分组成?
信号处理电路是进⾏⼀些复杂的数字运算和数据处理,并且⼜有实时响应要求的电路。它通常有⾼速数据通道接⼝和⾼速算法电路两⼤部分组成。
2.为什么要设计专⽤的信号处理电路?
因为有的数字信号处理对时间的要求⾮常苛刻,以⾄于⽤⾼速的通⽤处理器也⽆法在规定的时间内完成必要的运算。通⽤微处理器芯⽚是为⼀般⽬的⽽设计的,运算的步骤必须通过程序编译后⽣成的机器码指令加载到存储器中,然后在微处理器芯⽚控制下,按时钟的节拍,逐条取出指令分析指令和执⾏指令,直到程序的结束。微处理器芯⽚中的内部总线和运算部件也是为通⽤⽬的⽽设计,即使是专为信号处理⽽设计的通⽤微处理器,因为它的通⽤性也不可能为某⼀特殊的算法来设计⼀系列的专⽤的运算电路⽽且其内部总线的宽度也不能随便的改变,只有通过改变程序,才能实现这个特殊的算法,因⽽其算法速度也受到限制所以要设计专⽤的信号处理电路。3.什么是实时处理系统?
实时处理系统是具有实时响应的处理系统。
4.为什么要⽤硬件描述语⾔来设计复杂的算法逻辑电路?
因为现代复杂数字逻辑系统的设计都是借助于EDA⼯具完成的,⽆论电路系统的仿真和综合都需要掌握硬件描述语⾔。5.能不能完全⽤C语⾔来代替硬件描述语⾔进⾏算法逻辑电路的设计?
不能,因为基础算法的描述和验证通常⽤C语⾔来做。如果要设计⼀个专⽤的电路来进⾏这种对速度有要求的实时数据处理,除了以上C语⾔外,还须编写硬件描述语⾔程序进⾏仿真以便从电路结构上保证算法能在规定的时间内完成,并能通过与前端和后端的设备接⼝正确⽆误地交换数据。
6.为什么在算法逻辑电路的设计中需要⽤C语⾔和硬件描述语⾔配合使⽤来提⾼设计效率?
⾸先C语⾔很灵活,查错功能强,还可以通过PLI编写⾃⼰的系统任务,并直接与硬件仿真器结合使⽤。C语⾔是⽬前世界上应⽤最为⼴泛的⼀种编程语⾔,因⽽C程序的设计环境⽐Verilog HDL更完整,此外,C语⾔有可靠地编译环境,语法完备,缺陷缺少,应⽤于许多的领域。⽐较起来,Verilog语⾔只是针对硬件描述的,在别处使⽤并不⽅便。⽽⽤Verilog的仿真,综合,查错等⼤部分软件都是商业软件,与C语⾔相⽐缺乏长期⼤量的使⽤,可靠性较差,亦有很多缺陷。所以只有在C语⾔的配合使⽤下,Verilog才能更好地发挥作⽤。C 语⾔与Verilog HDL语⾔相辅相成,互相配合使⽤。这就是即利⽤C语⾔的完整性⼜要结合Verilog对硬件描述的精确性,来更快更好地设计出符合性能要求的硬件电路系统,从⽽来提⾼效率。第⼀部分Verilog数字设计基础第1章Verilog的基本知识
1.什么是硬件描述语⾔?它的主要作⽤是什么?
硬件描述语⾔是⼀种⽤形式化⽅式来描述数字电路和系统的语⾔。它的
主要作⽤是:数字电路系统的设计者利⽤这种语⾔可以从上层到下层(从抽象到具体)逐步描述⾃⼰的设计思想,⽤⼀系列分层次的模块来表⽰极其复杂的数字系统。
2.⽬前世界上符合IEEE标准的硬件描述语⾔有哪两种?它们各有什么特点?
符合IEEE标准的硬件描述语⾔是Verilog HDL和VHDL两种。它们的共同特点是:能够形式化地抽象表⽰电路的⾏为和结构;⽀持逻辑设计中层次与范围的描述;可借⽤⾼级语⾔的精巧结构来简化电路⾏为的描述;具有电路仿真与验证机制以保证设计的正确性;⽀持电路描述由⾼层到低层的综合1转换硬件描述与实现⼯艺⽆关;便于⽂档管理;易于理解和设计重⽤。不同点:Verilog HDL是⼀种⾮常容易掌握的硬件描述语⾔,⽽VHDL掌握起来就⽐较困难。3.什么情况下需要采⽤硬件描述语⾔的设计⽅法?
在对逻辑电路及系统的设计的时间要求很短的情况下需要采⽤硬件描述语⾔的设计⽅法。4.采⽤硬件描述语⾔设计⽅法的优点是什么?有什么缺点?
优点是:与⼯艺⽆关性。这使得⼯程师在功能设计,逻辑验证阶段,可以不必过多考虑门级及⼯艺实现的具体细节,只需要利⽤系统设计时对芯⽚的要求,施加不同的约束条件,即可设计出实际电路。缺点是:需要相应的EDA⼯具,⽽EDA⼯具的稳定性需要进⼀步的在⼯程中提升。5.简单叙述⼀下利⽤EDA⼯具并采⽤硬件描述语⾔的设计⽅法和流程?
采⽤⾃顶向下的设计⽅法:从系统级开始把系统划分为基本单元,然后再把每个基本单元划分为下⼀层次的基本单元,⼀直这样做下去,直到可以直接⽤EDA元件库中的基本元件来实现为⽌。其基本流程主要由两⼤主要功能部分组成:(1)设计开发即从编写设计⽂件->综合到布局布线->电路⽣成这样⼀序列步骤。(2)设计验证也就是进⾏各种仿真的⼀序列步骤,如果在仿真过程中发现问题就返回设计输⼊进⾏修改。
5.硬件描述语⾔可以⽤哪两种⽅式参与复杂数字电路的设计?复杂数字电路的设计和复杂数字电路的仿真验证。
7.⽤硬件描述语⾔设计的数字系统需要经过哪些步骤才能与具体的电路相对应?编写设计⽂件;功能仿真;优化,布局布线;布线后门级仿真
8.为什么说⽤硬件描述语⾔设计的数字逻辑系统下具有很⼤的灵活性并可以映射到任何⼯艺的电路上?
硬件描述语⾔的设计具有与⼯艺⽆关性。这使得⼯程师在功能设计,逻辑验证阶段,可以不必过多考虑门级及⼯艺实现的具体细节,只需要利⽤系统设计时对芯⽚的要求,施加不同的约束条件,即可设计出实际电路。9.软核是什么?虚拟器件是什么?它们的作⽤是什么?
把功能经过验证的,可综合的,实现后电路结构总门数在5000门以上的Verilog HDL模型称为软核。⽽把由软核构成的器件称为虚拟器件。
作⽤:⼤⼤缩短设计周期,加快复杂电路的设计。
10.集成电路⾏业中IP的含义是什么?固核是什么?硬核是什么?与软核相⽐它们各有什么特点?各适合于什么场合?在集成电路⾏业中IP是知识产权(Intellectual Property)的含义。把在某⼀现场可编程门阵列器件上实现的经验证是正确的,总门数在5000门以上的电路结构编码⽂件称为固核。把在某⼀专⽤集成电路⼯艺的器件上实现的经验证时正确的总门数在5000门以上的门电路结构版图掩膜称为硬核。
在⼯具实现⼿段和⼯艺技术尚未确定的逻辑设计阶段,IP核具有很⼤的灵活性,很容易借助EDA⼯具与其他外部逻辑结合为⼀体。相⽐之下固核和硬核与其他外部逻辑结合为⼀体的灵活性要差很多。11.简述Top_Down设计⽅法和硬件描述语⾔的关系?
Top_Down的设计⽅法是⾸先从系统设计⼊⼿,从顶层进⾏功能划分和结构设计。系统的总仿真是顶层进⾏功能划分的总要环节,⽽该过程需要采⽤硬件描述语⾔的⽅法。
12.System Verilog与Verilog有什么关系?适合于何种设计?
System Verilog是Verilog语⾔的拓展和延伸。Veril适合系统级,算法级,寄存器级,逻辑级,门级,电路开关级设计⽽System Verilog更适合于可重⽤的可综合IP和可重⽤的验证⽤IP设计,以及特⼤型基于IP的系统级设计和验证。第2章Verilog语法的基本概念1.Verilog语⾔有什么作⽤?
·可描述顺序执⾏和并⾏执⾏的程序结构;
·⽤延迟表达式或事件表达式来明确地控制过程的启动时间;·通过命名的事件来触发其他过程⾥的激活⾏为或停⽌⾏为;·提供了条件如if-else,case等循环程序结构;·提供了可带参数且⾮零延续时间的任务程序结构;·提供了可定义新的操作符的函数结构;
·提供了⽤于建⽴表达式的算术运算符,逻辑运算符,位运算符;
·Verilog HDL语⾔作为⼀种结构化的语⾔⾮常适⽤于门级和开光级的模型设计;·提供了⼀套完整的表⽰组合逻辑的基本元件的原话;·提供了双向通路和电阻器件的原话;
·可建⽴MOS器件的电荷分享和电荷衰减动态模型;·Verilog HDL的构造性语句可以精确地建⽴信号的模型;2.构成模块的关键词是什么?module,endmodule
3.为什么说可以⽤Verilog构成⾮常复杂的电路结构?
因为Verilog可描述顺序执⾏和并⾏执⾏的程序结构;⽤延迟表达式或事件表达式来明确地控制过程的启动时间;通过命名的事件来触发其他过程⾥的激活⾏为或停⽌⾏为;提供了条件如if-else,case等循环程序结构;提供了可带参数且⾮零延续时间的任务程序结构;提供了可定义新的操作符的函数结构;提供了⽤于建⽴表达式的算术运算符,逻辑运算符,位运算符;Verilog HDL语⾔作为⼀种结构化的语⾔⾮常适⽤于门级和开光级的模型设计;提供了⼀套完整的表⽰组合逻辑的基本元件的原话;提供了双向通路和电阻器件的原话;可建⽴MOS器件的电荷分享和电荷衰减动态模型;Verilog HDL的构造性语句可以精确地建⽴信号的模型。
4.为什么可以⽤⽐较抽象的描述来设计具体的电路结构?
因为有可以⽤⽐较抽象描述设计电路结构的语⾔,⽽这种语⾔是适合数字系统设计的语⾔。5.是否任意抽象的符合语法的Verilog模块都可以通过综合⼯具转变为电路结构?
不能。要符合语法,还符合⼀些基本规则的Verilog模块才可以通过综合⼯具转变为电路结构。6.什么叫综合?
通过综合⼯具把⾏为级描述的模块通过逻辑⽹表⾃动转化为门级形式的模块叫综合。7.综合是由什么⼯具来完成的?EDA⼯具来完成综合的。
8.通过综合产⽣的是什么?产⽣的结果有什么⽤处?
产⽣的是由与门,或门和⾮门组成的加法器,⽐较器等组合逻辑。产⽣的模块很容易与某种⼯艺的基本元件逐⼀对应起来,再通过布局布线⼯具⾃动地转变为某种⼯具⼯艺的电路布线结构。9.仿真是什么?为什么要进⾏仿真?
仿真是对电路模块进⾏动态的全⾯测试。通过观测被测试模块的输出信号是否符合要求可以调试和验证逻辑系统的设计和结构准确与否,并发现问题及时修改。
10.仿真可以在⼏层⾯上进⾏?每个层⾯的仿真有什么意义?分别为;前仿真,逻辑⽹表仿真,门级仿真和布线后仿真;
前仿真,逻辑⽹表仿真,门级仿真;可以调试和验证逻辑系统的设计和结构准确与否,并发现问题及时修改。布线后仿真:分析设计的电路模块的运⾏是否正常。11.模块的端⼝是如何描述的?⽤“.”表⽰被引⽤模块的端⼝。
12.在引⽤实例模块的时候,如何在主模块中连接信号线?⽤⼩括号中来表⽰本模块中与之连接的模块。13.如何产⽣连续的周期性测试时钟?⽤always语句来产⽣连续的周期性测试模块。
14.如果不⽤initial块,能否产⽣测试时钟?不能,没有initial块,就不知道时钟信号的初始值
15.从本讲中的简单例⼦,是否能明⽩always块与initial块有什么不同?Initial块只执⾏⼀次,⽽always块执⾏⽆数次。
16.为什么说Verilog可以⽤来设计数字逻辑电路和系统?
因为Verilog可描述顺序执⾏和并⾏执⾏的程序结构;⽤延迟表达式或事件表达式来明确地控制过程的启动时间;通过命名的事件来触发其他过程⾥的激活⾏为或停⽌⾏为;提供了条件如if-else,case等循环程序结构;提供了可带参数且⾮零延续时间的任务程序结构;提供了可定义新的操作符的函数结构;提供了⽤于建⽴表达式的算术运算符,逻辑运算符,位运算符;Verilog HDL语⾔作为⼀种结构化的语⾔⾮常适⽤于门级和开光级的模型设计;提供了⼀套完整的表⽰组合逻辑的基本元件的原话;提供了双向通路和电阻器件的原话;可建⽴MOS器
件的电荷分享和电荷衰减动态模型;Verilog HDL的构造性语句可以精确地建⽴信号的模型。第3章模块的结构、数据类型、变量和基本运算符号1.模块由⼏个部分组成?
由描述接⼝和描述逻辑功能两部分组成。2.端⼝分为⼏种?
三种:输出⼝,输⼊⼝,输⼊/输出⼝3.为什么端⼝要说明信号的位宽?
因为如果不说明信号的位宽可能会在信号发⽣改变时发⽣错误,不容易看出接收到的信号的数据宽度,就很难进⾏数据的处理。
4.能否说模块相当于电路图中的功能模块,端⼝相当于功能模块的引脚?
可以那样说,每个模块都有特定的功能,⽽功能的实现就必须依靠具体的电路得以实现,端⼝是信号传递的通道,可以说是功能模块的引脚。
5.模块中的功能描述可以由哪⼏类语句或语句块组成?它们出现的顺序会不会影响功能的描述?⽤assign语句声明,⽤实例元件,⽤always块。它们出现的顺序不会影响到功能的描述。6.这⼏类描述中哪⼀种直接与电路结构有关?⽤实例元件直接与电路结构有关。7.最基本的Verilog变量有哪⼏种类型?wire型、reg型、memory型
8.reg型和wire型变量的差别是什么?
reg型变量是寄存器型变量,wire型变量是连线型变量。两者根本性的差别在于reg型变量有个寄存器来存放变量,这个值只有变量发⽣改变时才会改变否则保证原来的值不变,wire型变量的值不是确定的值。9.由连续赋值语句(assign)赋值的变量能否是reg类型的?可以是reg类型的变量。
10.在always模块中被赋值的变量能否是wire类型的?如果不能是wire类型,那么必须是什么类型的?它们表⽰的⼀定是实际的寄存器吗?
不能。必须是reg类型的变量,它们表⽰不⼀定是实际的寄存器。11.参数类型的变量有什么⽤处?
参数类型的变量的好处是可以提⾼程序的可读性和可维护性。
12.Verilog语法规定的参数传递和重新定义功能有什么直接的应⽤价值?
可以⽤于定义延迟时间和变量宽度。
13.逻辑⽐较运算符⼩于等于“<=”和⾮阻塞赋值⼤于等于“<=”的表⽰是完全⼀样的,为什么Verilog在语句解释和编译时不会搞错?
因为逻辑⽐较时“<=”两边是两个操作数,此时“<=”是双⽬运算符,⽽在⾮阻塞赋值时“<=”的右边是操作数,此时“<=”单⽬运算符。
14.是否可以说实例引⽤的描述实际上就是严格意义上的电路结构描述?
不能实例引⽤的描述是在门级电路上加以描述的,和严格意义上的电路结构描述还是有点差距的。第4章运算符、赋值语句和结构说明语句
1.逻辑运算符与按位逻辑运算符有什么不同,它们各在什么场合使⽤?
⽤逻辑运算符运算时是两个操作数进⾏逻辑运算,⽽按位逻辑运算符运算时是两个操作数对应的每⼀位进⾏逻辑运算。逻辑运算符多⽤于条件的判断,按位逻辑运算符⽤于信号的运算和检测。2.指出两种逻辑等式运算符的不同点,解释书上的真值表。
两种逻辑运算符有很⼤的区别。”===“要求两个⽐较数完全⼀样,⽆论⾼阻还是未知,只要每位完全相同即可;⽽“==”只有在两个操作数每位都已知即1或0,在这种前提下两个操作数每位相同结果才为真,如果不是在这个前提那么其结果始终为x;3.拼接符的作⽤是什么?为什么说合理地使⽤拼接符可以提⾼程序的可读性和可维护性?拼接符表⽰的操作其物理意义是什么?
拼接符的作⽤是把两个或多个信号的某些位拼接起来进⾏运算操作。因为借助拼接符可以⽤⼀个符号名来表⽰由多位信号组成的复杂信号。其物理意义是将多个信号结合成⼀个信号。
4.如果都不带时间延迟,阻塞和⾮阻塞赋值有什么不同?举例说明它们的不同点?阻塞和⾮阻塞赋值的区别在阻塞是顺序执⾏⽽⾮阻塞是并⾏执⾏。以下⾯的语句举例⾮阻塞赋值
always@(posedge clk)beginb<=a;c<=b;end阻塞赋值
always@(posedge clk)beginb=a;c=b;end
两种不同的赋值⽅式结果是不同的,⾮阻塞赋值b<=a;c<=b;两条语句是同时执⾏的,⽽阻塞赋值b=a;c=b;两条语句先执⾏b=a后执⾏c=b.
5.举例说明顺序块和并⾏块的不同?begin#50r=’h35;
#50r=’hE2;#50r=‘h00;#50r=’hF7;#50->end_wave;endfork#50r=’h35;#100r=’hE2;#150r=‘h00;#200r=’hF7;#250->end_wave;join
上⾯两个块执⾏起来效果是完全⼀样的,第⼀个模块是按顺序执⾏,⽽第⼆个模块是每个语句同时执⾏的。6.如果在顺序块中,前⾯有⼀条语句是⽆限循环,下⾯的语句能否进⾏?下⾯的语句不能执⾏。
7.如果在并⾏块中,发⽣上述情况,会如何呢?下⾯的语句能够执⾏。
第5章条件语句、循环语句、块语句与⽣成语句
1.为什么建议在编写Verilog模块程序时,如果⽤到if语句建议⼤家把配套的else 情况也考虑在内?
因为如果没有配套的else语句,在不满⾜if条件语句时,将会保持原来的状态不变,从⽽在综合时会产⽣⼀个锁存器,⽽这是设计不想要的结果。
2.⽤if语句;elseif语句;elseif语句;...else语句和⽤case endcase表⽰不同条件下的多个分⽀是完全相同的,还是有什么不同?
不是完全相同。(1)与case语句中的控制表达式和多分⽀表达式这种⽐较相⽐,if_else_if结构中条件表达式更为直观些。(2)对于那些分⽀表达式中存在不定值x和⾼阻值z的位时case语句提供了处理这种情况的⼿段。
3.如果case语句的分⽀条件没有覆盖所有可能的组合条件,定义了default项和没有定义default项有什么不同?
定义了default项则会使电路描述的更加的清楚,综合的时候不会产⽣不想要的结果,没⽤定义default则会使在综合是产⽣⼀个锁存器。
4.仔细阐释case、casex和casez之间的不同。
case、casex、casez对应的真值表如上,可以看出case⽆论是0,1,还是x⾼阻都能够⽐较,⽽casez不将⾼阻进⾏⽐较,在其
它情况都进⾏⽐较;⽽casex不将⾼阻和x进⾏⽐较,在其它情况进⾏⽐较。
5.forever语句如果运⾏了,在它下⾯的语句能否运⾏?它位于begin end和位于fork join块有什么不同?
不能运⾏。位于begin end,由于begin and是顺序块,所以只要执⾏到forever 则将不能运⾏下⾯的程序;⽽位于fork join,它是并⾏块,执⾏了forever还是能够执⾏forever下⾯的语句。
6.forever语句repeat语句能否独⽴于过程块⽽存在,即能否不在initial或always 块中使⽤?forever不能独⽴于过程块中,⽽repeat能够独⽴于过程块中。
7.⽤for循环为存储器许多单元赋值时是否需要时间?为什么如果不定义时间延迟,它可以不需要时间就把不管多⼤的储存器赋值完毕?
如果定义了时间延迟则需要时间,否则不需要时间。因为循环的边界是确定的,那么在综合时该循环语句被认为是重复的硬件结构。
8.for循环是否可以表⽰可以综合的组合逻辑?请举例说明。可以表⽰综合的组合逻辑。例如⽤for循环实现的乘法器
9.在编写测试模块时⽤什么⽅法可以使for循环按照时钟的节拍运⾏?请⽐较图5.3所⽰程序段。
可以在for循环的最后嵌套时钟节拍运⾏的信号。第⼀种程序不能按照时钟节拍来对mem[i]赋值,⽽第⼆种程序可以。10.声明⼀个为oscillate的寄存器变量并将它初始化为0,使其每30个时间单位进⾏⼀次取反操作,不要使⽤always语句(提⽰:使⽤forever循环)。reg oscillate;initialbeginoscillate=0;forever
#30oscillate=!Oscillate;end
11.设计⼀个周期为40个时钟单位的时钟循环,其占空⽐为25%,使⽤always 和initial块进⾏设计,将其在仿真0时刻的值初始化为0。initialbeginclock=0;
alwaysbegin#30clock=0;#10clock=1;endend
12.给定下⾯含有阻塞过程赋值语句的initial块,每个语句在什么仿真时刻开始执⾏?a,b,c和d在仿真过程中的中间值和仿真结束时的值是什么?initialbegin1a=1'b0;2b=#101'b0;3c=#51'b0;4d=#20{a,b,c};end
第⼀条语句在仿真开始时就执⾏,第⼆句在仿真10个时钟单元后执⾏,第三句在仿真15个时钟信号单元后执⾏,第四句在仿真35个时钟单元后执⾏。在中间仿真过程中a=0,b,c,d为不确定值结束时abcd的值是a=1'b0,b=1'0,c=1'0,d=3'b000。13.在第12题中,如果initial块中包含的是⾮阻塞过程赋值语句,那么各个问题的答案是什么?
如果是⾮阻塞过程赋值则答案是;第⼀条语句在仿真开始时就执⾏,第⼆句在仿真10个时钟单元后执⾏,第三句在仿真5个时钟信号单元后执⾏,第四句在仿真20个时钟单元后执⾏。在中间仿真过程中a=0,b,c,d为不确定值结束时abcd 的值是a=1'b0,b=1'0,c=1'0,d=3'b000。14.下⾯例⼦中d的最终值是什么?initialbeginb=1'b1;c=1'b0;#10b=1'b0;endinitialbegind=#25(b|c);end
D的最终值0。
15使⽤带同步清零端的D触发器(清零⾼电平有效,在时钟下降沿执⾏清零操作)设计下⼀个下降沿触发的D触发器,只能使⽤⾏为语句(提⽰:D触发器的输出q应当声明为寄存器变量)。使⽤设计出的D触发器输出⼀个周期为10个时间单位的时钟信号。
module D_FF(CLR,CLK,D,Q);input CLR,CLK,D;
output Q;reg Q;
always@(posedge CLR or necedge CLK)beginif(CLR)Q=0;else#10Q<=D;endendmodule
16.使⽤带有异步清零端的D触发器设计第15题要求的D触发器(在清零端变为⾼电平后⽴即执⾏清零操作,⽆须等待下⼀个时钟下降沿),并对这个D触发器进⾏测试。module D_FF(CLR,CLK,D,Q);input CLR,CLK,D;output Q;reg Q;
always@(posedge CLR)beginQ<=0;end
always@(necedge CLK)begin#10Q<=D;endendmodule
17.使⽤wait语句设计⼀个电平敏感的锁存器,该锁存器的输⼊信号为d和clock,输出为q,其功能是当clock=1时q=d;module L_FF(d,clock,q);input d,clk;output q;reg q;alwaysbeginwait(clock==1)q=d;endendmodule
18.使⽤条件语句设计[例5.18]中的四选⼀多路选择器,外部端⼝必须保持不变。module mux4_to_1(out,i0,i1,i2,i3,s1,s0);
output out;input i0,i1,i2,i3;input s1,s0;reg out;
always@(s1or s0or i0or i1or i2or i3)begin
if(s1==0&&s0==0)out=i0;
else if(s1==0&&s0==1)out=i1;
else if(s1==1&&s0==0)out=i2;
else if(s1==1&&s0==1)out=i3;elseout=1'bx;endendmodule
19.使⽤case语句设计⼋功能的算术运算单元(ALU),其输⼊信号a和b均为4位,还有功能选择信号select为3位,输出信号为out(5位),算术运算单元ALU所执⾏的操作与select信号有关,具体关系如5.1所列(忽略输出结果中的上溢和下溢的位)。
module ALU(a,b,select,out); input[3:0]a,b;input[2:0]select;output[4:0]out;
reg[4:0]out;always@(select)begincase(select)3'b000:out=a;3'b001:out=a+b;3'b010:out=a-b;3'b011:out=a/b;3'b100:out=a%b;3'b101:out=a<<1;3'b110:out=a>>1;3'b111:out=a>b;
default:out=5'bx; endcaseendendmodule
20.使⽤while循环设计⼀个时钟信号发⽣器。其时钟信号的初值为0,周期为10个时间单元。initialbeginclk=0;while(1)#10clk=!clk;end
21.使⽤for循环对⼀个长度为1024(地址从0~1023)、位宽为4的寄存器类型数组cache_var进⾏初始化,把所有单元都设置为0.begin
reg[3:0]cache_var[1023:0];intiger i;
for(i=0;i<1024;i++)cache_var[i]=0;end
22.使⽤forever循环设计⼀个时钟信号,周期为10,占空⽐为40%,初值为0. initialbeginclk=0;foreverbegin#6clk=0;
#4clk=1;endend
23.使⽤repeat将语句a=a+1延迟20个时钟上升沿之后再执⾏。parameter delay=20;intiger i;reg a;beginrepeat(delay)
always@(posedge clk)begini++;if(i==20)a=a+1;endend
24.下⾯是⼀个内嵌顺序块和并⾏块的块语句。该块的执⾏结束时间是多少?事件的顺序是怎样的?每条语句的仿真结束时间是多少?initial
begin//顺序执⾏x=1'b0;#5y=1'b1; (5)fork//并⾏执⾏#20a=x; (25)#15b=y; (20)join
#40x=1'b1;//顺序执⾏ (65)fork//并⾏执⾏#10p=x; (75)begin//顺序执⾏#10a=y; (75)#30b=x; (105)end#5m=y; (70)joinend
该块的执⾏结束时间是5+20+40+40=105个时钟单位每条语句执⾏的时间如上图所标
25.⽤forever循环语句,命名块(named block)和禁⽤(disabling of)命名块来设计⼀个⼋位计数器。这个计数器从count=5开始计数,到count=67结束计数。每个时钟正跳变计数器加⼀,时钟的周期为10,计数器的设计只⽤到了⼀次循环,然后就被禁⽤了(提⽰:使⽤disable语句)。reg[7:0]count;initialbegincount=5;end
begin:mame blockforever
begin:disabling ofalways@(posedge clk)beginif(count<67)#10count=count+1;disable:disabling of;endendend
第6章结构语句、系统任务、函数语句和显⽰系统任务1.怎样理解initial语句只执⾏⼀次的概念?
在仿真开始时,initial语句只执⾏⼀次,但initial语句⾥⾯的语句可能不执⾏⼀次,因为如果是while循环,虽然initial语句是执⾏⼀次,但只要进了while循环,则会执⾏到仿真结束。
2.在initial语句引导的过程中是否可以有循环语句?如果可以,是否与思考题1,互相⽭盾?
可以,并不互相⽭盾。initial语句确实是执⾏了⼀次,但并不意味着initial语句过程中就不能是循环语句,两者并不⽭盾。3.怎样理解由always语句引导的过程块是不断活动的?
always语句的过程块是不断活动的,在仿真过程中always块始终在循环的活动着,检查always语句后⾯的信号是否发⽣相应改变,这是always活动的实质,如果always语句后⾯没有检查的信号则将会进⼊⼀个循环,将会使仿真器锁死。4.不断活动与不断执⾏有什么不同?
不断活动是always语句不断活动检查是否满⾜条件(如某个信号发⽣改变),不断执⾏时always语句引导的过程中的语句不断的执⾏着。
5.怎样理解沿触发和电平触发的不同?
沿触发是在某个信号在上升沿或下降沿到来时,触发执⾏过程块。电平触发是在某个信号发⽣改变时就会触发执⾏过程块。6.是不是可以说沿触发是有间隔的,在⼀定的时间区间⾥只需要注意有限的点,⽽电平触发却需要注意⽆穷多个点?
不是。沿触发是信号的上升沿或下降沿进⾏触发,⽽电平触发是在某个信号发⽣改变时进⾏触发,并不需要注意⽆穷多个点。
7.沿触发的always块和电平触发的always块各表⽰什么类型的逻辑电路的⾏为?为什么?
沿触发的always块常表⽰时序逻辑电路,因为其和时序有很关。电平触发的always块常表⽰组合逻辑电路,因为其和只和电平有关。
8.简单叙述任务和函数的不同点
(1)函数只能与主模块共⽤同⼀个仿真时间单元,⽽任务可以定义⾃⼰的仿真时间单位;(2)函数不能启动任务,⽽任务能启动其他任务和函数;
(3)函数⾄少要有⼀个输⼊变量,⽽任务可以没有或有多个任何类型的变量;(4)函数返回⼀个值,⽽任务则不返回值。9.简单叙述$display、$write和$strobe的不同点。
$display⾃动地在输出后进⾏换⾏,$write则不进⾏⾃动换⾏,其它都⾮常相似。
因篇幅问题不能全部显示,请点此查看更多更全内容