系统任务和函数

合集下载

verilog 任务和函数

verilog 任务和函数
输出到端口“data”。 • 在定义任务时必须注意如下几点: (1) 在第一行“task”语句中不能列出端口名列表。
(2) 在任务定义结构中的“行为语句”部分可以有延时语句、敏感事件控制语句 等时间控制语句出现。
(3) 一个任务可以没有输入、输出和双向端口,也可以有一个或多个输入、输出 和双向端口。 (4) 一个任务可以没有返回值,也可以通过输出端口或双向端口返回一个或多个 返回值。 (5) 在一个任务中可以调用其它的任务或函数,也可以调用该任务本身。 (6) 在任务定义结构内不允许出现过程块(initial 或always过程块)。 (7) 在任务定义结构内可以出现“disable中止语句”,这条语句的执行将中断 正在执行的任务。当任务被中断后,程序流程将返回到调用任务的地方继续向 下执行。
(2) “integer”:这种形式说明函数名代表的返回变量是一个整数型 变量。 (3) “real”:这种形式说明函数名代表的返回变量是一个实数型变量。
函数的主要特性: • 函数定义中不能包含任何时序控制语句。 • 函数至少有一个输入,不能包含任何输出或双向端口。 • 函数只返回一个数据,其缺省为reg类型。 • 传送到函数的参数顺序和函数输入参数的说明顺序相同。 • 函数在模块(module)内部定义。 • 函数不能调用任务,但任务可以调用函数。 • 虽然函数只返回单个值,但返回的值可以直接给信号连接 赋值。这在需要有多个输出时非常有效。 如 : {o1, o2, o3, o4} = f_ or_ and (a, b, c, d, e);
reg[15:0] a;
reg[31:0] b; initial begin
a=0;
read_mem(a,b); #10; a=64; //第一次调用

信号与系统第七章 系统函数

信号与系统第七章  系统函数

=
K
N1N 2 " N m e j(ψ1+ψ2 +"ψm ) M1 M2 " Mn ej(θ1+θ2 +"θn )
H (jω)
=
K
N1N2 " Nm M1M2 "Mn
ϕ (ω) = (ψ1 +ψ2 + "ψm ) − (θ1 +θ 2 + "θ n )
当ω 沿虚轴移动时,各复数因子(矢量)的模和辐角都
①H(z)在单位圆内的极点所对应的响应序列为衰减的。 即当k→∞时,响应均趋于0。 ②H(z)在单位圆上的一阶极点所对应的响应函数为稳 态响应。
③H(z)在单位圆上的高阶极点或单位圆外的极点,其 所对应的响应序列都是递增的。即当k→∞时,响应 均趋于∞。
第 19 页
三、由系统函数零、极点分布 决定频响特性
v1(t ) −
R
+
C v2(t )

写出网络转移函数表达式
H (s)
=
V2 (s) V1 (s )
=
1 RC
⎜⎛ ⋅⎜ ⎜⎜⎝
s
1 +1
RC
⎟⎞ ⎟ ⎟⎟⎠
=
1 RC
1 M1 ejθ1
= V2 ejϕ (ω) V1
M1
θ1
−1 RC

O
σ
第 28 页
频响特性

M1
V2 1 V1 1
2 θ1
−1 RC
O
σ
O1 RC
( ) H

=
1 RC
1 M1 e jθ1
= V2 ejϕ (ω) V1

verilog系统函数解读

verilog系统函数解读

Verilog 中常用的系统函数(2011-12-06 14:54:39)转载▼标签:分类:FPGA的研究杂谈Verilog HDL常用的系统任务1.$display(<输出格式控制列表>,<输出列表>);//显示变量的值或变量的范围,自动加换行如:$display(“dout=%d dout”,dout);2.$write();//和上面的用法相同,但是不会自动加换行3.$monitor(<格式控制>,<输出列表>);//在多模块调试的情况下,许多模块中都调用了$monitor,因为任何时刻只能有一个$monitor起作用,因此需配合$monitoron与$monitoroff使用,把需要监视的模块用$monitoron打开,在监视完毕后及时用$monitoroff关闭,以便把$monitor 让给其他模块使用。

$monitor与$display的不同处还在于$monitor 往往在initial块中调用,只要不调用$monitoroff,$monitor便不间断地对所设定的信号进行监视。

4.$time系统函数:返回64位的整数来表示当前的仿真时刻; $realtime系统函数:返回一个实型数表示当前仿真时刻。

都以模块的仿真时间尺度为基准。

5.$monitor($realtime,,"set=%b",set);//其中一个用法5.系统任务$finish:退出仿真器,返回操作系统6.系统任务$stop:暂停仿真器7.系统任务$random:$random%b或者{$random}%b8.系统任务$readmemb和$readmemh:用于从文件中读取数据到寄存器中,任何时候都可以被执行(数据方向:文件>>寄存器);有以下用法:1) $readmemb("<数据文件名>",<存贮器名>);2) $readmemb("<数据文件名>",<存贮器名>,<起始地址>);3) $readmemb("<数据文件名>",<存贮器名>,<起始地址>,<结束地址>);4) $readmemh("<数据文件名>",<存贮器名>);5) $readmemh("<数据文件名>",<存贮器名>,<起始地址>);6) $readmemh("<数据文件名>",<存贮器名>,<起始地址>,<结束地址>);其中文件中的地址表示方式@hhhh--hh,但是寄存器中的地址可直接用数表示。

硬件描述语言 Verilog HDL

硬件描述语言 Verilog HDL
端口声明,参数声明<可选>
`include指令
变量声明(wire,reg及其它类型) 数据流语句(assign) 低层模块的实例 过程块always和initial(包含所有的行为语句) 任务(task)和函数(function)
endmodule; 模块结束语句
16
4.3.3 模块和端口
17
4.3.3 模块和端口
3.$stop任务和$finish任务
۞ $stop任务使得仿真被挂起(例:暂停仿真以检查 信号值 )
۞ $finish任务将结束仿真,并退出仿真环境
21
4.3.3 系统任务和系统函数
常用的几个系统任务和系统函数:
4.时间函数:$time ,$stime ,$realtime 5.$random函数
32
4.4.2 数据类型
2.变量(Variable)类型 (reg、integer、time、real、realtime) 数据存储单元的抽象,下一次赋值前,变量的值保持不变 (1)寄存器(reg)变量类型
۞ 对应具有状态保持作用的硬件电路,如触发器、锁存器等
۞ 声明形式:reg [msb:lsb] reg1,reg2,...regN;
3
4.1 HDL简介
4.1.1 关于HDL(硬件描述语言)
使用HDL ۞用一种高级语言来表达大规模集成电路的功能,隐藏
其具体实现的细节,对数字电路和数字逻辑系统能够 进行形式化的描述。 ۞提高逻辑设计效率,降低设计成本,缩短设计周期。 ۞多方位的仿真可以在设计完成之前检测到其错误,减 少设计重复的次数,使第一次投片便能成功实现芯片 成为可能。 ۞使检测各种设计方案变得容易和方便,对方案的修改 只需要修改HDL程序,比修改原理图容易得多。

UCOSIII 常用函数

UCOSIII 常用函数

任务堆栈:存储任务中的调用的函数、局部变量、中断服务程序和CPU寄存器的值。

全局变量的保护:1.如果只在一个任务中写(或只有一个数据),而在其他任务中只是读取,则可以不用互斥型信号量,最多会造成读取的数据未被完全写完。

2.如果全局变量在多个任务中写,则需要用互斥型信号量保护,这样当有任务申请到互斥型信号量(保护不可重入的程序段)写数据时,其他任务的同一个互斥型信号量必须等待上一个任务的释放才可进行写。

3.如果全局变量在中断中写,则在其他任务中的全局变量的写操作要用临界段(禁止中断和禁止调度:保护不可被分割的程序段)保护。

(因为如果不关中断相当于中断的优先级最高,而且不能被像其他任务那样挂起。

)OS_CFG_ISR_POST_DEFERRED_EN为1临界段使用锁调度器方式;为0临界段使用禁中断方式(CPU_SR_ALLOC();OS_CRITICAL_ENTER();OS_CRITICAL_EXIT();OS_CRITICAL_EXIT_NO_SCHED(); OSSchedLockNestingCtr记录调度器被锁的次数)。

检测任务堆栈的使用情况:OS_CFG_STAT_TASK_STK_CHK_EN使能OS_ERRerr;CPU_STK_SIZE stk_free;CPU_STK_SIZE stk_used;OSTaskStkChk(&TaskBStkTCB,&stk_free,&stk_used,&e rr);中断中使用OSIntEnter();和OSIntExit();是为了退出中断后执行中断调度操作,如果中断中并未用到OSSemPost();等系统函数,则退出中断服务程序后不需要进行任务调度,就可以不在中断服务程序中使用OSIntEnter(); 和OSIntExit();。

(有时候用:CPU_CRITICAL_ENTER();OSIntNestingCtr++; CPU_CRITICAL_EXIT();替代OSIntEnter();)一、变量类型在cpu.h中是有关cpu变量的重新定义,还包括CPU_STK(CPU堆栈类型),和CPU_STK_SIZE(CPU堆栈类型的大小)的定义,CPU_SR(CPU状态寄存器的定义)。

Verilog学习----结构语句、任务语句、函数语句和系统任务

Verilog学习----结构语句、任务语句、函数语句和系统任务

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 连接。

ucos ii 46个系统API函数解析

ucos ii 46个系统API函数解析

Void OSInit(void);所属文件OS_CORE.C 调用者启动代码开关量无OSinit()初始化μC/OS-Ⅱ,对这个函数的调用必须在调用OSStart()函数之前,而OSStart ()函数真正开始运行多任务。

Void OSIntEnter(void);所属文件OS_CORE.C 调用者中断开关量无OSIntEnter()通知μC/OS-Ⅱ一个中断处理函数正在执行,这有助于μC/OS-Ⅱ掌握中断嵌套的情况。

OSIntEnter()函数通常和OSIntExit()函数联合使用。

注意/警告:在任务级不能调用该函数。

如果系统使用的处理器能够执行自动的独立执行读取-修改-写入的操作,那么就可以直接递增中断嵌套层数(OSIntNesting),这样可以避免调用函数所带来的额外的开销。

Void OSIntExit(void);所属文件OS_CORE.C 调用者中断开关量无OSIntExit()通知μC/OS-Ⅱ一个中断服务已执行完毕,这有助于μC/OS-Ⅱ掌握中断嵌套的情况。

通常OSIntExit()和OSIntEnter()联合使用。

当最后一层嵌套的中断执行完毕后,如果有更高优先级的任务准备就绪,μC/OS-Ⅱ会调用任务调度函数,在这种情况下,中断返回到更高优先级的任务而不是被中断了的任务。

注意/警告:在任务级不能调用该函数。

并且即使没有调用OSIntEnter()而是使用直接递增OSIntNesting的方法,也必须调用OSIntExit()函数。

Void OSSchedLock(void);所属文件OS_CORE.C 调用者任务或中断开关量N/AOSSchedLock()函数停止任务调度,只有使用配对的函数OSSchedUnlock()才能重新开始内核的任务调度。

调用OSSchedLock()函数的任务独占CPU,不管有没有其他高优先级的就绪任务。

在这种情况下,中断仍然可以被接受和执行(中断必须允许)。

06嵌入式实时操作系统FreeRTOS任务函数

06嵌入式实时操作系统FreeRTOS任务函数

阻塞任务,直到指定的时钟节拍后解除阻塞 任务以指定的时钟节拍周期性执行 获取某个任务的优先级 设定某个任务的优先级 获取系统任务状态 获取某个任务信息 获取当前任务句柄 获取空闲任务句柄 获取某个任务剩余堆栈历史最小值 获取某个任务的状态 获取某个任务的任务名 根据任务名查找某个任务句柄 获取系统时钟节拍值 中断内获取系统时钟节拍值 获取调度器状态 获取任务数量 以列表形式输出所有任务的信息 获取所有任务的运行时间 设置任务标签 获取任务标签
FreeRTOS任务函数
任务管理是FreeRTOS的核心功能,除内核函数中的 任务创建、挂起、恢复、删除和任务切换等之外, 还有用于让出CPU使用权的阻塞式延时,任务优先 级查询、设置,获取任务状态信息,以及获取任务 运行时间信息等辅助函数。
FreeRTOS任务函数
vTaskDelay() vTaskDelayUntil() uxTaskPriorityGet() vTaskPrioritySet() uxTaskGetSystemState() vTaskGetInfo() xTaskGetCurrentTaskHandle() xTaskGetIdleTaskHandle() uxTaskGetStackHighWaterMark() eTaskGetState() pcTaskGetName() xTaskGetHandle() xTaskGetTickCount() xTaskGetTickCountFromISR() xTaskGetSchedulerState() uxTaskGetNumberOfTasks() vTaskList() vTaskGetRunTimeStats() vTaskSetApplicationTaskTag() xTaskGetApplicationTaskTag()
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在Verilog HDL中,除了$display与$write这两 种主要的标准输出任务外,还有以下几种标准 输出任务: (1) $displayb与$writeb(输出二进制数)。 (2) $displayo与$writeo(输出八进制数)。 (3) $displayh与$writeh(输出十六进制数)。
module disp; reg[31:0] rval; pulldown(pd); initial begin rval=101; $display("rval=%h hex %d decimal", rval, rval); $display("rval=%o otal %b binary", rval, rval); $display("rval has %c ascii character value",rval); $display("pd strength value is %v",pd); $display("current scope is %m"); $display("%s is ascii value for 101",101); $display("simulation time is %t",$time); end endmodule
module printval; reg[11:0]r1; initial begin r1=10; $display("Printing with maximum size=%d=%h",r1,r1); $display("Printing with minimum size=%0d=%0h",r1,r1); end enmodule 输出结果为: Printing with maximum size=10=00a: printing with minimum size=10=a 在显示输出数据时,在经过格式转换以后,总是用最少的位数 来显示表达式的当前值
为了便于设计者对仿真过程进行控制,以及对仿真结果进行 分析比较,Verilog HDL提供了大量的系统功能调用,大致 可以分成两种: 一种是任务型的功能调用,称为系统任务; 另一种是函数型的功能调用,称为系统函数。 Verilog HDL的系统任务与系统函数是以字符“$”开头的标识
符,一般在initial和always过程块中调用系统任务和函数
【例7.9】$display任务的例子。 $display("Hello Dr Blair");
…… output:Hello Dr Blair
$display($time) //目前的仿真时间 …… output:460 counter = 4'b10; $display(" The count is %b",counter);
格式相同
区别: $display任务具有自动换行的功能
下面以$display任务为例进行详细说明。 $display可以用来输出字符串、表达式及 变量值,其语法格式与C语言中的printf函数 相同,可表示如下: $display(<format_specifiers>,signal, signal,……); 其中,<format_specifiers>用来指定输出格式。 表7.1给出了各种不同的输出格式。
普通字符,即需要原样输出的字符。其中一些特殊的字符可 以通过表2中的转换序列来输出。下面表中的字符形式用于 格式字符串参数中,用来显示特殊的字符
换码序列 \n \t \\ \“ \o %%
功能 换行 横向跳格(即跳到下一个输出区) 反斜杠字符\ 双引号字符" 1到3位八进制数代表的字符 百分符号%
如果输出列表中表达式的值包含有不确定的值或高 阻值,其结果输出遵循以下规则: (1).在输出格式为十进制的情况下: 如果表达式值的所有位均为不定值,则输出结果为 小写的x。 如果表达式值的所有位均为高阻值,则输出结果为 小写的z。 如果表达式值的部分位为不定值,则输出结果为大 写的X。 如果表达式值的部分位为高阻值,则输出结果为大 写的Z。
显示层次
通过显示任务中的%m的选项,可以显示任意级别的层次。 例 module m; initial module top; $display(“displaying in %m”) m m1(); m m2(); Endmodule m m3(); Endmodule 仿真输出如下显示: displaying in top.m1 displaying in top.m2 displaying in top.m3
主要区别有两点:系统任务可以没有返回值,或有多个返回 值,而系统函数只有一个返回值;系统任务可以带有延迟,
而系统函数不允许延迟,在0时刻执行。
依据实现功能的不同,可分成以下几类: 1) 显示任务( display task) 2) 文件输入/输出任务(File I/O task) 3) 时间标度任务(timescale task) 4) 模拟控制任务(simulation control task) 5) 时序验证任务(timing check task) 6) PLA建模任务(PLA modeling task) 7) 随机建模任务(stochastic modeling task) 8) 实数变换函数(conversion functions for real) 9) 概率分布函数(probabilistic distribution function)
2).在输出格式为十六进制和八进制的情况下: 每4位二进制数为一组代表一位十六进制数,每3位二 进制数为一组代表一位八进制数。 如果表达式值相对应的某进制数的所有位均为不定值, 则该位进制数的输出的结果为小写的x。 如果表达式值相对应的某进制数的所有位均为高阻值, 则该位进制数的输出结果为小写的z。 如果表达式值相对应的某进制数的部分位为不定值, 则该位进制数输出结果为大写的X。 如果表达式值相对应的某进制数的部分位为高阻值, 则该位进制数输出结果为大写的Z。
其输出结果为: rval=00000065 hex 101 decimal rval=00000000145 octal 00000000000000000000000001100101 binary rval has e ascii character value pd strength value is StX current scope is disp e is ascii value for 101 simulation time is 0 1输出列表中数据的显示宽度是自动按照输出格式 进行调整的。 2用表达式的最大可能值所占的位数来显示表达式 的当前值。 3十进制数格式输出时,输出结果前面的0值用空 格来代替。对
显示系统任务用于信息显示和输出。这些系 统任务进一步分为: • 显示和写入任务 • 探测监控任务 • 连续监控任务
$display与$write都属于显示类系统任务 调用形式 $display ( “格式控制字符串”, 输出变量名表项) ; $write ( “格式控制字符串”, 输出变量名表项) ; 输出变量名表项就是指要输出的变量,各变量名 之间以逗号相隔;格式控制字符串的内容包括两部 分:需要与输出变量一起在输出时一并显示的普通 字符;对输出变量显示形式进行控制的格式说明符。
//initial语句块2 initial begin b<=0; $display("b by display is:",b); // display x $strobe("b by strobe is:",b); //display o #5; $display("#5 b by display is:",b); //display o $strobe("#5 b by strobe is:",b); // display 1 b<=1; end endmodule
…… output:The count is 0010
在$display和$write的参数列表中,其“输出表列”是需要输 出的一些数据,可以是表达式,下面举例说明
例7-10 module disp; initial begin $display("\\\t%%\n\"\123"); end endmodule 输出结果为 \% "S” 从上面的这个例子中可以看到一些特殊字符的输出 形式(八进制数123就是字符S)
$tor 一旦被调用后,将随时对输出变量名表项中列出的各个变量 进行检测,如发现其中的任何一个变量在模拟过程中的某一 时刻发生了任何形式的改变,就会启动$monitor任务,整个 输出列表中所有变量和表达式的值都会按照所规定的格式, 在时间步结束时输出结果。如果在同一仿真时刻,多个变量 或表达式值发生变化,则该时刻只输出显示一次。 如$monitor(“a=%b,b=%b,out=%b\n”,a,b,out)
可以通过系统任务$monitoron打开监控任务 ,通过系统任务$monitoroff关闭监控任务 。多模块调试时,会有多个模块调用 monitor,但是任意时刻只能有一个 monitor被启动,这就需要用$monitoron和 $monitoroff在特定时刻启动需要检测的模 块,关闭其它模块。缺省情况下,监控任 务在仿真开始时自动打开。
$d i s p l a y("Simulation time is %t",$ t i m e) ; $d i s p l a y( $t i m e,":R=%b,Q=%b,QB=%b", R,S,Q,QB); / /因为没有指定格式,时间按十进制显示。 $w r i t e("Simulation time is:); $w r i t e( " % t \ n " , $t i m e) ; 上述语句输出$ t i m e、R、S、Q和Q B等值的执行结 果如下: Simulation time is 10 10:R=1, S=0, Q=0, QB=1 Simulation time is 10 end
相关文档
最新文档