系统任务和函数
- 格式:ppt
- 大小:1.40 MB
- 文档页数:82
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,但是寄存器中的地址可直接用数表示。
任务堆栈:存储任务中的调用的函数、局部变量、中断服务程序和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学习----结构语句、任务语句、函数语句和系统任务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 连接。
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,不管有没有其他高优先级的就绪任务。
在这种情况下,中断仍然可以被接受和执行(中断必须允许)。
Zigbee协议栈OSAL层API函数(译)收藏3.信息管理API3.1 概述这部分API提供了任务或处理单元与不同的处理环境之间的数据交换。
这部分API函数能够为任务分配和收回消息缓冲区,发送命令消息给以外一个任务并且接收应答。
3.2 osal_msg_allocate ( )概述:当一个任务调用这个函数时,将为消息分配缓冲区,函数会将消息加入缓冲区,并调用osal_msg_send()将消息发送到另一个任务。
原型:byte *osal_msg_allocate( uint16 len )参数:len :消息的长度返回值:指向消息缓冲区的指针,当分配失败时返回NULL3.3 osal_msg_deallocate( )概述:用于收回缓冲区原型:byte osal_msg_deallocate( byte *msg_ptr )参数:Msg_ptr : 指向将要收回的缓冲区的指针返回值:RETURN V ALUE DESCRIPTIONZSUCCESS 回收成功INV ALID_MSG_POINTER 错误的指针MSG_BUFFER_NOT_A V AIL 缓冲区在队列中3.4 osal_msg_send( )概述:任务调用这个函数以实现发送指令或数据给另一个任务或处理单元。
目标任务的标识必须是一个有效的系统任务,当调用osal_create_task ( )启动一个任务时,将会分配任务标识。
osal_msg_send()也将在目标任务的事件列表中设置SYS_EVENT_MSG原型:byte osal_msg_send( byte destination_task, byte *msg_ptr )参数:destination_task :目标任务的标识msg_ptr :指向消息缓冲区的指针返回值:ZSUCCESS 消息发送成功INV ALID_MSG_POINTER 无效指针INV ALID_TASK 目标任务无效3.5 osal_msg_receive( )概述:任务调用这个函数来接收消息。
----------------------------------------------------------------------------System task and function系统任务和函数Verilog语言包含一些很有用的系统命令和函数。
用户可以像自己定义的函数和任务一样调用它们。
所有符合IEEE标准的Verilog工具中一定都会有这些系统命令和函数。
CADENCE公司的Verilog 工具中还有另外一些常用的系统任务和函数,它们虽并不是标准的一部分,但在一些仿真工具中也经常见到。
请注意,各种不同的 Veriog 仿真工具可能还会加入一些厂商自己特色的系统任务和函数。
用户也可以通过编程语言接口(PLI)把用户自定义的系统任务和函数加进去,以便于仿真和调试。
所有的系统任务和系统函数的名称(包括用户自定义的系统任务),前面都要加$以区别于普通的任务和函数。
下面是Verilog 工具中常用的系统任务和函数的摘要。
详细资料在后面介绍。
--------------------------------------------------------------------------标准的系统任务和函数Verilog HDL的IEEE标准中包括下面的系统任务和函数:y$display, $monitor, $strobe, $write 等用于把文本送到标准输出和或写入一个或多个文件中的系统任务。
详细说明在后面介绍。
y$fopen 和$fclose$fopen(“FileName”); {Return an integer}$fclose(Mcd);$fopen 是一个系统函数,它可以打开文件为写文件做准备。
而$fclose也是一个系统函数,它关闭由 $fopen 打开的文件。
有关的详细说明在后面介绍。
y$readmemb 和 $readmemh$readmemb(“File”, MemoryName [,StartAddr[,FinishAddr]]);$readmemh(“File”, MemoryName [,StartAddr[,FinishAddr]]);把文本文件中的数据赋值到存储器中。
第七章系统函数系统分类:连续系统离散系统分析方法:时域:h(t)h(k) 冲击响应/单位响应↑逆↑逆复频域: H(s) H(z) 系统函数H(·)↓s = jw↓z =e jwT频域: H(jw) H(e jwT) 频率响应系统的研究:系统分析: 给定系统→H(·)→系统的特性系统综合: 给定要求(如幅频特性)→确定结构和参数→H(·) 本章是在前几章的基础上加以概括和引伸主要内容:一H(·)与系统的特性(时域响应、频域响应)二系统的因果性和稳定性及判别准则三信号流图四系统模拟。
由系统函数→框图§ 7.1 系统函数与系统特性一 H(·)的零点与极点H(·)=)()(••A B 极点:A(·)=0的根,i P ,H(i P )→∞ 零点:B(·)=0的根,i ξ,H(i ξ)=0类型:实数、共轭虚数、共轭复数,一阶或二阶 二 H(·)与时域的响应关系: H(·) h(·)1 连续系统: H(s) h(t) 以虚轴为界结论:○1 H(s)的极点位置→h(t)的函数形式 ○2 极点在左半开平面→h(t)是衰减的,h(t)|∞→t →0,系统是稳定的○3 虚轴上的一阶极点→h(t)是幅度稳定,临界稳定 ○4 极点在右半开,和虚轴上二阶以上→h(t)是增长的, 系统不稳定稳定性:若输入有界,则输出有界。
若|f(·)|<∞,则| y f (·)|<∞ 2 离散系统:H(z) h(k) 以单位圆为界结论:○1 H(z)的极点位置→h(k)的序列形式 ○2 极点在单位圆内→h(k)是衰减的,k →∞,h(k)→0 系统是稳定的○3 单位圆上的一阶极点→h(k)是幅度稳定,临界稳定 ○4 极点在单位圆外,和单位圆上二阶以上→h(k)是增长的,系统不稳定三 极、零点与频率响应的关系: 1 连续系统H (s)=∏∏=-=-ni i p s mj j s m b 1)(1)(ξ 设极点都在左半开平面,收敛域含虚轴H (j ω)= H (s)|s=jw =∏∏=-=-ni i p jw mj j jw m b 1)(1)(ξ 画幅频、相频特性下面用矢量分析法分析,主要是定性分析其变化规律矢量:p i | p i | j ω |ω| 差矢量: j ω- p i 幅角i ϕ 幅角2π令 j ω- p i =A i ij e θ j ω-ζi =B j jj e ψH (j ω)=)(21)(212121n m j e n A A A j e m B B B m b θθθψψψΛΛΛΛ++++=H (ω)=nA A A mB B B m b ΛΛ2121 )(ωϕ=(m ψψψΛ++21)- (n θθθΛ++21)ω从0~∞时,可得到其幅频特性和相频特性曲线例7.1-1 研究RC 低通网络电压转移函数的频率响应H(j ω)=)(1)(2ωωj U j U解:H (s)=SCR SC 11+=RC S RC 111+• 极点S= - RC 1H (j ω)=RCj RC111+ω令θωj Ae RCj =+1A=2)1(2RC +ω θ=arctg ωcR H (ω)=ARC 11 )(ωϕ=0-θ= - arctg ωcR 定性分析:ω从0~∞时,A 单调增大,θ从0~2π H (ω)单调下降,)(ωϕ从0~ - 2π例7.1-2 典型的二阶系统,RLC 串联电路,求动点导纳y(s)=)(1)(1s U s I 的频率特性 解:H (s) =2022ωα++s s s =)2)(1(p s p s s-- 设α>0,ω02 >α2零点:s=0极点:p 1,2 = -220αωα-±j =-βαj ± 其中:Lr2=α 衰减因素 220αωβ-= LC10=ω 谐振角频率只讨论α<ω0时的频率响应,先画极、零图H (j ω)=)2)(1(p j p j j --ωωω=)(2121θθψ--•j e A A BH (ω) =21A A B)21()(θθψωϕ--= 定性分析:ω从0~∞○1 ω=0 B=0,A 1=A=ω 21θθ-= 2πψ=y (ω)=0 2)(πωϕ=ω↑ B 和A 2↑ A 1↓ 21θθ+↑ 2πψ=y (ω) ↑ )(ωϕ↓○2 ω=ω0 y (ω)=α21为极大值 0)(=ωϕ 221πθθ=+ ω↑ B 、A 2、A 1↑ y (ω) ↓ 21θθ+↑ )(ωϕ↓○3ω→∞ y (ω)→0 πθθ=+21 2)(πωϕ-=全通函数: |H(j ω)|为常数设有二阶系统H(s),左半平面有一对极点p 1,2 = -βαj ± 右半平面有一队零点ξ1,2 =βαj ±H(s)=)2)(1()2)(1(p s p s s s ----ξξH(j ω)=)2)(1()2)(1(p j p j j j ----ωωξωξω=)(21212121θθψψ--+•j e A A B B 由图:对所有ω,有A 1= B 1 A 2 =B 2∴ |H(j ω)|= 2121A A BB =1结论:凡极点位于左半开平面,零点位于右半开平面,且以j ω轴镜像对称,此系统函数即为全通函数 最小相移函数零点位于左半开平面的系统函数,其相频特性)(ωϕ最小 一阶 p 1,2 = βj e ± H(z)=ββj ez z k j e z z k --+-*11 共轭极点 h(k)=2|k 1|cos (βk+θ)·u (k)二阶实或共轭: h(k)= Ck ·u (k) k ↑ h(k)↑ (二阶以上同) h(k)=Ckcos (βk+θ)·u (k) k →∞ h(k)→∞ (3) 极点在单位圆外:|a|>1一阶实极点 p=a ,h(k)=a k ·u (k) k ↑ 一阶共轭极点:p=a βj e ± h(k)=C a k cos (βk+θ)·u (k) h(k)↑ 高阶情况同上结论:A H(z)的零、极点决定 h(k) 形式由极点决定幅度和相角由零、极点共同决定B 单位圆内的极点,h(k)为衰减序列,k →∞ h(k)→0,暂态分量C 单位圆上的一阶极点,h(k)为等幅序列,k →∞ h(k)有限值,稳态分量D 单位圆上的二阶及以上极点 h(k)为等幅序列 单位圆外的极点 k →∞ h(k)→∞ 2 离散系统:H(z)零、极点H(T j e ω)关系H(z)=∏∏=-=-ni i p z mj j z m b 1)(1)(ξ 若极点均为单位圆内,收敛域含单位圆频率响应:H(T j e ω)=∏∏=-=-n i i p j m j j j m b 1)(1)(ωξω=∏∏==n i j e i A mj j e j B m b i j11θψ=)(21)(212121nm j e n A A A j e m B B B m b θθθψψψΛΛΛΛ++++=H d (ω) )(ωϕdj e幅频:H d (ω)= H(T j e ω)=nA A A mB B B m b ΛΛ2121相频:)(ωϕd =(m ψψψΛ++21)- (n θθθΛ++21) 分析:ωT 从0~2π,即ω从0~Tπ2,z 由z=1沿单位圆逆时针方向旋转一周。
Verilog HDL语言规范Verilog HDL 任务和函数任务和函数提供了在一个描述中,从不同位置执行公共程序的能力。
它们也提供了将一个大的程序分解成较小程序的能力。
这样,更容易阅读和调试源文件描述。
Verilog HDL 任务和函数--任务和函数的区别下面给出了任务和函数的区别规则:☐在一个仿真时间单位内执行函数;一个任务可以包含时间控制的语句。
☐函数不能使能任务。
但是,一个任务可以使能其它任务和函数。
☐函数至少有一个input类型的参数,没有ouput或者inout类型的参数;而一个任务可以有零个或者更多任意类型的参数。
Verilog HDL 任务和函数--任务和函数的区别☐一个函数返回一个单个的值,而任务不返回值。
☐函数的目的是通过返回一个值来响应一个输入的值。
一个任务可以支持多个目标,可以计算多个结果的值。
☐通过一个任务调用,只能返回传递的output和inout类型的参数结果。
☐使用函数作为表达式内的一个操作数,由函数返回操作数的值。
Verilog HDL 任务和函数--任务和函数的区别☐函数定义中,不能包含任何时间控制的语句,比如:#、@或者wait。
而任务无此限制。
☐函数定义中必须包含至少一个输入参数。
而任务无此限制。
☐函数不能有任何非阻塞分配或者过程连续分配。
☐函数不能有任何事件触发器。
Verilog HDL 任务和函数--任务和函数的区别一个任务可以声明为下面的格式:switch_bytes (old_word, new_word);一个函数可以声明为下面的格式:new_word = switch_bytes (old_word);Verilog HDL 任务和函数--任务和任务使能定义任务定义任务的格式一如下:task task_name;input automatic input_name;more_inputsoutput output_name;more_outputsbeginstatements;endendtaskVerilog HDL 任务和函数--任务和任务使能其中:☐automatic:可选的关键字,用于声明一个自动的任务,该任务是可重入的,动态的分配每一个并发执行的任务入口。
常用系统函数表目录1. 缓冲区操作函数 02. 字符分类函数 (1)3. 数据转换函数 (3)4. 目录控制函数 (6)5. 文件处理函数 (7)C.5.1 如下函数在一个文件句柄指定的文件上操作 (7)C.5.2如下函数在一个路径或文件名指定的文件上操作 (8)6. 数学函数 (11)7. 输入和输出函数 (17)C.7.1 流I/O函数 (17)C.7.2 低级I/O函数 (26)C.7.3 控制台和端口I/O函数 (29)8. 进程控制函数 (31)9. 查找和分类函数 (32)10. 字符串操作函数 (33)这里只收录了一些VC++6.0变异环境支持的常用的函数,使用不同的编译系统需参考编译系统的文档。
1. 缓冲区操作函数函数名:_memccpy函数原型:void *_memccpy(void *dest,const void *src,int c,unsigned int count);参数:dest 目的指针;src 源指针;c 拷贝的最后字符;count 字符个数。
所需头文件:<memory.h>或<string.h>功能:从src所指向的地址开始拷贝0个或多个字节到dest中。
当指定字符c已拷贝或已拷贝count个字节后停止。
返回值:如果字符c被拷贝,返回dest中该字符直接后继字节的指针。
如果c没有被拷贝,则返回NULL。
函数名:memchr函数原型:void *memchr (const void *buf,int c,sizet counr);参数:buf 缓冲区的指针;c 查找的字符;count检查的字符个数。
所需头文件:<memory.h>或<string.h>功能:查找buf的前count个字节中c的第一次出现,当找到c或已检查完count个字节时停止。
返回值:如果成功,返回buf中c首次出现的位置的指针;否则返回NULL。