Verilog任务四
- 格式:ppt
- 大小:1.14 MB
- 文档页数:13


设计练习进阶前言:在前面九章学习的基础上,通过本章的练习,一定能逐步掌握Verilog HDL设计的要点。
我们可以先理解样板模块中每一条语句的作用,然后对样板模块进行综合前和综合后仿真,再独立完成每一阶段规定的练习。
当十个阶段的练习做完后,便可以开始设计一些简单的逻辑电路和系统。
很快我们就能过渡到设计相当复杂的数字逻辑系统。
当然,复杂的数字逻辑系统的设计和验证,不但需要系统结构的知识和经验的积累,还需要了解更多的语法现象和掌握高级的Verilog HDL系统任务,以及与C语言模块接口的方法(即PLI),这些已超出的本书的范围。
有兴趣的同学可以阅读Verilog语法参考资料和有关文献,自己学习,我们将在下一本书中介绍Verilog较高级的用法。
练习一.简单的组合逻辑设计目的: 掌握基本组合逻辑电路的实现方法。
这是一个可综合的数据比较器,很容易看出它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。
在Verilog HDL中,描述组合逻辑时常使用assign 结构。
注意equal=(a==b)1:0,这是一种在组合逻辑实现分支判断时常使用的格式。
模块源代码:" qual(equal),.a(a),.b(b)); 简单时序逻辑电路的设计目的:掌握基本时序逻辑电路的实现。
在Verilog HDL中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。
在可综合的Verilog HDL模型,我们通常使用always块和@(posedge clk)或@(negedge clk)的结构来表述时序逻辑。
下面是一个1/2分频器的可综合模型。
eset(reset),.clk_in(clk),.clk_out(clk_out));endmodule仿真波形:练习:依然作clk_in的二分频clk_out,要求输出与上例的输出正好反相。
编写测试模块,给出仿真波形。
练习三. 利用条件语句实现较复杂的时序逻辑电路目的:掌握条件语句在Verilog HDL中的使用。
Function与task的区别(一) task --- 任务;function --- 函数任务可以有input、output和inout,数量不限;函数只有input参数,且至少有一个input。
任务可以包含有时序控制(如延时等);函数不能包含有任何延迟,仿真时间为0。
任务可以用disable中断;函数不允许disable、wait语句。
任务可以通过I/O端口实现值传递;函数名即输出变量名,通过函数返回值。
任务可以调用其他任务和函数;函数只能调用其他函数,不能调用任务。
任务可以定义自己的仿真时间单位;函数只能与主模块共用一个仿真时间单位。
任务能支持多种目的,能计算多个结果值;函数通过一个返回一个值来响应输入信号的值。
(二) 任务、函数的定义和调用都包括在一个module的内部,他们一般用于行为级建模,在编写Testbench时用的较多,而在写可综合的代码时要少用。
1、function的定义:function<返回值类型和位宽> <函数名><入口参量和类型声明><局部变量声明>行为语句;endfunction定义function时,要注意以下几点:(1): function定义结构不能出现在任意一个过程块(always块或者initial块)的内部;(2): function定义不能包括有任何时间控制语句,即任何用#,@或wait来标识的语句;(3): 定义function时至少要有一个输入参量;(4): 定义function时,在function内部隐式地将函数名声明成一个寄存器变量,在函数体中必须有一条赋值语句对该寄存器变量赋以函数的结果值,以便调用function时能够得到返回的函数值。
如果没有指定的返回值的宽度,function将缺省返回1位二进制数。
2、function的调用:<函数名> (<输入表达式1>,...,<输入表达式n>) ;输入表达式与函数定义结构中的各个输入端口一一对应,这些输入表达式的排列顺序必须与各个输入端口在函数定义结构中的排列顺序一致。
Verilog学习----结构语句、任务语句、函数语句和系统任务1.结构说明语句initial与always说明语句;initial语句:initialbegin语句1;语句2;"""""""语句n;end例⼦:⽤initial 块对存储器变量赋初始值initialbeginareg=0; //初始化寄存器aregfor(index=0;index<size;index=index+1)memory[index]=0; //初始化⼀个memoryend⽤initial语句来⽣成激励波形initialbegininputs = 'b000000; //初始时刻为0#10 inputs = 'b011001; (’是英⽂输⼊法中的标号)#10 inputs = 'b011011;#10 inputs = 'b011000;#10 inputs = 'b001000;endalways语句Always<时序控制><语句>always语句由于其不断活动的特性,只有和⼀定的时序控制结合在⼀起才有⽤。
如果⼀个always语句没有时序控制,则这个always语句将会使仿真器产⽣死锁。
见下例:[例3]:always areg = ~areg;但如果加上时序控制,则这个always语句将变为⼀条⾮常有⽤的描述语句。
见下例:[例4]:always #half_period areg = ~areg;这个例⼦⽣成了⼀个周期为:period(=2*half_period) 的⽆限延续的信号波形,常⽤这种⽅法来描述时钟信号,作为激励信号来测试所设计的电路。
reg[7:0] counter;reg tick;always @(posedge areg)begintick = ~tick;counter = counter + 1;endalways的时间控制可以是边沿触发也可以是电平触发可以是单个信号也可以是多个信号,中间⽤or 连接。
verilog task 用法Verilog任务(task)是一种在硬件描述语言(HDL)Verilog中定义可重用功能块的方法。
它类似于函数或过程,在设计硬件时可以方便地使用和调用。
Verilog任务使用关键字"task"和"endtask"来定义,并具有输入参数和输出参数。
中括号([ ])在Verilog中用于定义寄存器、线网、数组和其他常用元素。
在本文中,我们将详细介绍Verilog任务以及中括号的用法。
我们将逐步解释如何定义任务、如何调用任务以及如何使用中括号来处理Verilog中的常用元素。
第一部分:Verilog任务Verilog任务是一种将一系列硬件描述语句封装在一个可重用的块中的方法。
它可以将复杂的逻辑或重复的代码封装在一个任务中,使其更易于阅读、维护和重用。
以下是一个简单的Verilog任务的示例:task adder;input [7:0] a, b;output [7:0] sum;beginsum = a + b;endendtask上面的任务名称是"adder",输入参数为"a"和"b"(8位宽度),输出参数为"sum"(8位宽度)。
任务中的代码用于将输入参数"a"和"b"相加,并将结果存储在输出参数"sum"中。
要调用此任务,可以在Verilog模块中使用以下语法:adder(a, b, sum);其中,"a"和"b"是输入参数,"sum"是输出参数。
第二部分:任务调用和参数传递Verilog任务可以在任何地方调用,以实现代码的模块化和重用。
任务的调用类似于函数调用,但在任务调用中,参数传递是按位置匹配的。
以下是一个调用前面定义的"adder"任务的示例:module test;reg [7:0] a, b;wire [7:0] sum;调用任务adder(a, b, sum);...endmodule在上面的例子中,我们在"test"模块中定义了输入寄存器"a"和"b"以及输出线网"sum"。