做网站 图片侵权,word素材库,网站怎么优化到首页,如何设计一个有趣的网页文章简介
本系列文章主要针对FPGA初学者编写#xff0c;包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解#xff0c;旨在更快速的提升初学者在FPGA开发方面的能力#xff0c;每一个章节中都有针对性的代码…文章简介
本系列文章主要针对FPGA初学者编写包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解旨在更快速的提升初学者在FPGA开发方面的能力每一个章节中都有针对性的代码书写以及代码的讲解可作为读者参考。
第十七章task
task说明语句
task和function说明语句分别用来定义任务和函数。利用任务和函数可以把一个复杂的程序模块分解成若干个较小的任务和函数便于理解和测试。输入、输出和总线信号的值可以传入传出调用的任务和函数。任务和函数往往可以在大的程序模块中进行多次调用从而简化程序的结构使得整个程序容易被理解。本章讲解task任务的用法。
二者区别 任务和函数主要的不同点如下 1、函数只能与主模块共用同一个仿真时间单位而任务可以定义自己的仿真时间单位 2、函数不能启动任务而任务能启动其它任务和函数 3、函数至少要有一个输入变量而任务可以没有或有多个任何类型的变量 4、函数返回一个值而任务则不返回值。 函数的目的是通过返回一个值来响应输入信号的值。任务却能支持多种目的能计算多个结果值这些结果值只能通过被调用的任务的输出或总线端口送出。
task使用语法 定义任务的语法 task 任务名task_id; 端口及数据类型声明语句 语句1 语句2 …… 语句n endtask 其中关键词 task 和 endtask 将它们之间的内容标志成一个任务定义task 标志着一个任务定义结构的开始task_id 是任务名下来是端口声明语句和变量声明语句任务接收输入值和返回输出值就是通过此处声明的端口进行的再下来一段用来完成这个任务操作的过程语句如果过程语句多于一条应将其放在语句块内endtask 为任务定义结构体结束标志。下面给出一个任务定义的实例。
任务定义示例 上述代码示例定义了一个名为“task_use”的任务求取两个数的最大值。在定义任务时有下列六点需要注意 1、在第一行“task”语句中不能列出端口名称 2、任务的输入、输出端口和双向端口数量不受限制甚至可以没有输入、输出以及双向端口。 3、在任务定义的描述语句中可以使用出现不可综合操作符合语句使用最为频繁的就是延迟控制语句但这样会造成该任务不可综合。 4、在任务中可以调用其他的任务或函数也可以调用自身。 5、在任务定义结构内不能出现 initial和 always过程块。 6、在任务定义中可以出现“disable 中止语句” 将中断正在执行的任务但其是不可综合的。当任务被中断后程序流程将返回到调用任务的地方继续向下执行。
任务调用 虽然任务中不能出现 initial 语句和 always 语句语句 但任务调用语句可以在 initial 语句和 always 语句中使用其调用语法形式如下 任务名[(端口1, 端口 2, ........, 端口 n)]; 其中 任务名是要调用的任务名端口 1、端口 2等是参数列表。参数列表给出传入任务的数据进入任务的输入端和接收返回结果的变量从任务的输出端接收返回结果。 eg任务调用my_task(x,y,z); 任务调用变量(x,y,z)和任务定义的 I/O 变量(输入端口1,输入端口2,输出端口3)之间是一一对应的当任务启动时由 x 和 y传入的变量赋给了 端口1 和 端口2而当任务完成之后的输出又通过 端口3 赋给 z。 任务调用语句中参数列表的顺序必须与任务定义中的端口声明顺序相同。任务调用语句是过程性语句所以任务调用中接收返回数据的变量必须是寄存器类型。下面举例说明怎么定义任务与调用任务。 代码示例 测试代码如下 仿真波形如图所示 由仿真图可以看 1、当 start 信号变成高电平的时候state 状态由 0 跳变到 1 时此时调用 load 任务把 data_in 的值寄存在 shift_data 同时状态机状态跳转到 2。 2、当状态跳转到 2 的时候调用 shift 任务把 shift_data 的值往左移一位同时状态机状态跳转到 3。 3、当状态跳到 3 的时候调用 out 任务把 shift_data 的值往 data_out 赋值的同时状态机状态跳转到 0。 4、最终结果
8‘hA5左移1位data_out8‘h4A。
8‘h5A左移1位data_out8‘hB4。