Verilog HDL实用教程-习题及答案 【ch08】任务与函数_第1页
Verilog HDL实用教程-习题及答案 【ch08】任务与函数_第2页
Verilog HDL实用教程-习题及答案 【ch08】任务与函数_第3页
Verilog HDL实用教程-习题及答案 【ch08】任务与函数_第4页
Verilog HDL实用教程-习题及答案 【ch08】任务与函数_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章任务函数8.1任务和函数的不同点有哪些?答案:任务(Task):任务是一种过程性结构,用于执行一系列操作或语句,并且没有返回值。任务通常用于对系统进行建模、模拟和控制,以及执行不需要返回值的操作。任务在被调用时通过fork...join或begin...end进行调用,并且执行的代码块在调用点之后立即开始执行。任务可以有输入和输出参数,但不返回值。任务中可以包含时序控制(例如@(posedgeclk))和条件语句(例如if...else)等。函数(Function):函数是一种组合逻辑结构,用于根据输入参数计算并返回一个值。函数通常用于执行一系列计算操作,然后返回一个结果值,可在表达式中使用。函数在调用时通过在赋值语句或表达式中直接调用进行调用,并且在调用点处用函数返回值替换调用。函数有输入参数,并通过return语句返回结果值。函数不能包含时序控制或对模块内其他信号的更新。总结:任务用于执行一系列操作,没有返回值,通常用于模拟和控制。函数用于执行计算并返回结果,可以在表达式中使用,不能包含时序控制。8.2分别用任务和函数描述一个4选1MUX。答案:使用任务描述4选1MUX:modulemux_4to1_task(input[3:0]data_in,//4位输入数据input[1:0]sel,//2位选择信号outputregdata_out//输出结果);//任务:实现4选1MUX功能taskmux_4to1;input[3:0]in;input[1:0]s;outputregout;begincase(s)2'b00:out=in[0];2'b01:out=in[1];2'b10:out=in[2];2'b11:out=in[3];endcaseendendtask//在时序块中调用任务always@*beginmux_4to1(data_in,sel,data_out);endendmodule使用函数描述4选1MUX:modulemux_4to1_function(input[3:0]data_in,//4位输入数据input[1:0]sel,//2位选择信号outputregdata_out//输出结果);//函数:实现4选1MUX功能functionregmux_4to1(reg[3:0]in,reg[1:0]s);case(s)2'b00:mux_4to1=in[0];2'b01:mux_4to1=in[1];2'b10:mux_4to1=in[2];2'b11:mux_4to1=in[3];endcaseendfunction//在时序块中调用函数always@*begindata_out=mux_4to1(data_in,sel);endendmodule8.3用函数实现一个用7段数码管交替显示26个英文字母的程序,自定义字符的形状。答案:moduleseven_segment_mux(inputwireclk,//时钟信号outputwire[6:0]seg,//七段数码管输出outputwireanode//数码管阳极控制信号);reg[25:0]counter=0;//计数器,用于选择显示的字符//26个英文字母的自定义形状(A到Z)parameter[6:0]alphabet[0:25]={7'b111_0111,//A7'b011_1000,//B7'b111_0000,//C//其他字符形状省略,依次为D到Z//...7'b000_0000//Z};function[6:0]get_segment_output;input[25:0]count;begincase(count%26)0:get_segment_output=alphabet[0];//A1:get_segment_output=alphabet[1];//B2:get_segment_output=alphabet[2];//C//其他字符形状省略,依次为D到Z//...default:get_segment_output=7'b000_0000;//Zendcaseendendfunctionalways@(posedgeclk)begincounter<=counter+1;//计数器递增endassignseg=get_segment_output(counter);//根据计数器选择显示字符assignanode=1'b1;//数码管共阳极连接,始终为高电平endmodule8.4用函数实现一个16位数据的高低位转换最高有效位转换为最低有效位,次高位转换为次低位以此类推。答案:modulebit_reversal(inputwire[15:0]data_in,//16位输入数据outputreg[15:0]data_out//16位输出数据);function[15:0]reverse_bits(input[15:0]data);reg[15:0]result;beginfor(inti=0;i<16;i=i+1)beginresult[i]=data[15-i];endreverse_bits=result;endendfunction//在时序块中调用函数always@*begindata_out=reverse_bits(data_in);endendmodule8.5系统任务$strobe和$monitor有何区别?答案:$monitor:$monitor是一个全局任务,可以在任何地方使用。当被调用时,$monitor会在仿真过程中持续监视指定的变量,并在变量的值发生变化时,立即输出相应的调试信息。它在整个仿真过程中一直运行。$monitor语句会输出带有时间戳的信息,并且输出格式在仿真开始时就确定了。它常用于调试和查看信号的变化情况。$strobe:$strobe是一个局部任务,只能在模块的initial块或always块中使用。当被调用时,$strobe会在调用点输出指定的变量的当前值,输出后立即结束。$strobe语句不会输出时间戳信息,仅输出当前时刻的信号值。它通常用于输出特定时刻的信号值,以便进行调试。8.6可否用Sdisplay系统任务来显示非阻塞赋值的变量输出值?为什么?答案:不可以使用$sdisplay系统任务来显示非阻塞赋值(NonblockingAssignment)的变量输出值。原因是$sdisplay是一个在仿真中用于显示调试信息的系统任务,而非阻塞赋值是用于在硬件描述中进行并行赋值的方法。这两者在用途和时机上有所区别,因此不能直接混用。$sdisplay系统任务用于在仿真时输出调试信息,特别是在时序块(如always块)内部,可以实时查看变量的值。它主要用于仿真调试,对于输出和查看仿真过程中的信号值很有帮助。而非阻塞赋值是在VerilogHDL代码中用于并行赋值的方式,它用于在同一个时间步骤内同时更新多个信号的值,常用于时序逻辑中的寄存器和组合逻辑中的多位信号赋值。它是一种并发赋值方式,用于描述硬件的行为。在仿真过程中,非阻塞赋值是在同一时间步骤内同时完成的,并不会立即反映在$sdisplay输出的调试信息中。因此,如果想要查看非阻塞赋值后的变量输出值,最好使用$monitor系统任务,或者在适当的地方使用阻塞赋值来观察信号值的变化。$monitor会持续监视变量的值,并在变化时输出信息,更适用于查看变量的实时更新情况。8.7用任务完成无符号数的大小排序,设a、b、c、d是4个8位无符号数,按从小到大的顺序重新排列并输出到4个寄存器中存储。答案:moduleunsigned_sort(inputwire[7:0]a,//输入无符号数ainputwire[7:0]b,//输入无符号数binputwire[7:0]c,//输入无符号数cinputwire[7:0]d,//输入无符号数doutputreg[7:0]sorted_a,//排序后的无符号数aoutputreg[7:0]sorted_b,//排序后的无符号数boutputreg[7:0]sorted_c,//排序后的无符号数coutputreg[7:0]sorted_d//排序后的无符号数d);//任务:无符号数排序taskunsigned_sort_task;input[7:0]x,y,z;outputreg[7:0]sorted_x,sorted_y,sorted_z;beginif(x<=y&&x<=z)beginsorted_x=x;if(y<=z)beginsorted_y=y;sorted_z=z;endelsebeginsorted_y=z;sorted_z=y;endendelseif(y<=x&&y<=z)beginsorted_x=y;if(x<=z)beginsorted_y=x;sorted_z=z;endelsebeginsorted_y=z;sorted_z=x;endendelsebeginsorted_x=z;if(x<=y)beginsorted_y=x;sorted_z=y;endelsebeginsorted_y=y;sorted_z=x;endendendendtask//在时序块中调用任务always@*beginunsigned_sort_task(a,b,c,sorted_a,sorted_b,sorted_c);sorted_d=d;//无需排序,直接将d存储到sorted_d中endendmodule8.8编写个VerilogHDL任务,生成偶校验位。输入是一个8位数据,输出是一个包含数据和偶校验位的码字。答案:moduleeven_parity_generator(inputwire[7:0]data_in,//8位输入数据outputreg[8:0]codeword//输出码字(包含数据和偶校验位));//任务:生成偶校验位taskgenerate_even_parity;input[7:0]data;outputregparity_bit;reg[7:0]data_reg;begindata_reg=data;//使用一个寄存器保存输入数据parity_bit=1'b0;//初始化偶校验位为0//计算数据中1的个数for(inti=0;i<8;i=i+1)beginparity_bit=parity_bit^data_reg[i];endendendtask//在时序块中调用任务,并将结果存储到输出码字中always@*begingenerate_even_parity(data_in,codeword[7]);//生成偶校验位codeword[6:0]=data_in;//将输入数据存储到输出码字的低7位codeword[8]=codeword[7];//将偶校验位存储到输出码字的最高位endendmodule8.9编写一个VerilogHDL函数,实现求输入向量补码的功能,使用comp2(vect,N形式进行调用其中vect是输入的8位有符号二进制数,N是其位宽。答案:moduletest_module;//声明函数原型functionsigned[N-1:0]comp2;input[N-1:0]vect;outputregsigned[N-1:0]result

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论