veriloghdl数字设计与综合答案

veriloghdl数字设计与综合答案

【篇一:verilog习题选答】

txt>答:fpga中,由程序来转换为可烧录的二进制码。ic设计中,主要是由design-compiler来实现。

2.能否说模块相当于电路图中的功能模块,端口相当于功能模块的 3.assign声明语句,实例元件,always块,这三类描述中哪一种直接与电路结构有关?

4.由连续赋值语句(assign)赋值的变量能否是reg型的? 答:赋值运算分为连续赋值和过程赋值两种。

(1) 连续赋值 连续赋值语句只能对线网型变量进行赋值,而不能对寄存器型变量进行

赋值,基本的语法结构为:assign #(延时量) 线网型变量名 = 赋值表达式; 一个线网型变量一旦被连续赋值语句赋值后,赋值语句右端赋值表达式的值将持续对赋值变量产生连续驱动,只要右端表达式任一操作数的值发生变化,就会立即触发对赋值变量的更新操作。 (2) 过程赋值 过程赋值主要用于两种结构化模块(initial和always)中的赋值语句。

在过程块中只能使用过程赋值语句,不能在过程块中出现连续赋值语句,同时过程赋值语句也只能用在过程赋值模块中。基本的语法结构为:被赋值变量赋值操作符赋值表达式,其中,赋值操作符是“=”或“=”,它分别代表了阻塞赋值和非阻塞赋值类型。过程赋值语句只能对寄存器类型的变量进行赋值,经过赋值后,上面这些变量的值将保持不变,直到另一条赋值语句对变量重新赋值为止。

5.如果都不带时间延迟、阻塞和非阻塞赋值有何不同?说明它们的不同点? 答:代码1:

module test(a,b,c,d,y); //两个与逻辑,1个或逻辑 input a,b,c,d; output y;

reg y,tmp1,tmp2;

always @(a or b or c or d)// y的值并不等于当前的tmp1,tmp2相或的值,而是等于上 begin一次运算时tmp1,tmp2相或的值。相当于一个延迟,在第2 tmp1 = ab; 次always模块运行完后得到想要的y值 tmp2 = cd;

y = tmp1|tmp2; endendmodule

代码2: 基本与代码1一样,只是在always的敏感列表中加入了temp1,temp2

module test(a,b,c,d,y); input a,b,c,d; output y;

reg y,tmp1,tmp2;

always @(a or b or c or d or tmp1 or tmp2)//与代码一不同, begin

tmp1 = ab; tmp2 = cd;

y = tmp1|tmp2; end

endmodule

代码3:在代码2中加进参数j,来帮助判断always模块的运行次数:

module test(a,b,c,d,y); input a,b,c,d; output y;

reg y,tmp1,tmp2; reg [8:0]j=0;

always @(a or b or c or d or tmp1 or tmp2) begin j = j + 1;

#5 //这里加了一个延时,方便分析 tmp1 = ab; 延迟消失了。 tmp2 = cd;

y = tmp1|tmp2; end

endmodule

首先j从0增至1,为阻塞赋值,然后延迟5,开始下面的非阻塞赋值,然后temp1,temp2得到了新的值,但是y还是并没有更新,而是和代码一中一样保持。第一次always执行完毕。由于temp1的值得到了更新,随即再次运行always模块,j从1增加到2,然后延迟5,而此时a,b,c,d的值没有变,因此temp1,temp2没有变

化,但是y却得到了第一次temp1,temp2变化后相或的值,发生跳变。

由上可以看出,本来只要1次就能完成的组合逻辑,由于采用了非阻塞赋值,仿真器不得不两次进入always模块,因此可以遵循这样的原则,写组合逻辑的时候,always中要用阻塞赋值,写时序逻辑的时候,always模块中要用非阻塞赋值。(当然不排除为了特殊的目的不遵循这个建议)

6.defparam命令的使用,模块实例化和模块引用

在一个模块中改变另一个模块的参数时,需要使用defparam命令,高层模块可以改变低层模块用parameter定义的值,改变低层模块的参数值有以下方式:

(1) defparam 层次路径 = 改变后的值 (见书本32页)

(2) 实例化时传递参数模块名 #(改变后参数的值) 实例名 (输入输出) 可以利用defparam命令定义参数,语法结构为: 模块名 例化模块名 (输入输出);

defparam 例化模块名. 参数名=value;

模块实例引用时参数的传递还可以利用特殊符号“#”,语法结构为: 模块名 # (改变后的参数值)例化模块名 (输入输出端口) 7.同步清零d触发器和异步清零d触发器

module dff_tongbu (q,d,clk,clr);//同步清零受时钟控制 input d,clk,clr; output q; reg q;

always @(negedge clock) if (clr) q=0; else q=d; endmodule

module dff_yibu(q,d,clk,clr);//异步清零不受时钟控制 input d,clk,clr; output q; reg q;

always @(clr)

if (clr) q=0;else q=d;

使用同步清零d触发器输出一个周期为10个时间单位的时钟信号: 8. 敏感变量的描述完备性

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4