0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从零开始学FPGA-Verilog语法基础(下)

电子工程师 来源:FPGA设计论坛 作者:FPG设计论坛 2021-03-14 10:30 次阅读

零基础FPGA-Verilog语法下

9、关于任务和函数的小结,挑几点重要的说一下吧

(1)任务具有多个输入、输入/输出和输出变量,在任务重可以使用延迟、事件和时序控制结构,在任务重可以调用其它任务和函数。与任务不同,函数具有返回值,而且至少要有一个输入变量,而且在函数中不能使用延迟、事件和时序控制结构,函数可以条用函数,但是不能调用任务。

(2)在声明函数时,系统会自动的生成一个寄存器变量,函数的返回值通过这个寄存器返回到调用处。

(3)函数和任务都包含在设计层次中,可以通过层次名对他们实行调用。这句话什么意思啊? 10、系统任务 (1)$diplay和$write任务 $display任务相当于C语言里的printf,用于输出信息,他的基本格式$display (p0,p1,p2);意思就是把p1、p2以p1的格式输出,至于具体格式,C语言里面讲的很清楚,下面用一张图帮大家回忆一下

a01bac10-8434-11eb-8b86-12bb97331649.jpg

a05666c0-8434-11eb-8b86-12bb97331649.jpg

此外,在display中,输出列表中的数据的现实宽度总是按照自动输出格式进行调整的。因此,我们通常在%和表示进制的符号之间加一个0来确保总是用最少的位数来表示表达式的当前值。 例如 begin r1=10; $display(“size=%d=%h”,r1,r1); $display(“size=%0d=%0h”,r1,r1); 输出结果分别为 10,00a和10,a 所以在以后写程序时,为了养成良好习惯,应该注意加上0来保证代码的可读性。

如果输出的列表中含有不定值或者高阻态时,要遵循下列情况

(1)如果按10进制输出 如果输出列表全部为不定值,则输出为小写x;

如果输出列表部分为不定值,则输出为大写X;

如果输出列表全部为高阻态,则输出为小写的z;

如果输出列表部分为高阻态,则输出为大写的Z;

(2)如果按十六进制或者8进制输出

那么十六进制对应的四位或者8进制对应的3位中,如果部分是高阻态或者是不定值,那么输出结果为大写的Z或者X否则就输出小写的z或者x; 例如

a064f898-8434-11eb-8b86-12bb97331649.jpg

(2)$monitor

系统任务$monitor提供了监控和输出参数列表中的表达式或变量值的功能,其参数列表中输出控制格式字符串和输出列表的规则和$display一样,当启动一个带有一个或者多个的$monitor任务时,仿真器则创立一个仿真机制,使得每当参数列表中的表达式或值发生变化时,整个参数列表中的变量或者表达式的值都将输出显示,如果在同一时刻,两个或者多个参数的值发生变化,则在这时刻只输出显示一次,但在$monitor任务中,参数可以是$time系统函数,这样参数列表中变量或者表达式的值同时发生变化的时刻可以通过标明同一时刻的多行输出来显示。例如

a0b651ca-8434-11eb-8b86-12bb97331649.jpg

$monitoron和$monitoroff的功能就是通过打开或者关闭监控标志来控制监控任务$monitor的启动和停止。这样可以使得程序员很容易的控制$monitor什么时候执行了。

(3)时间度量系统函数$time 在verilog hdl语法中有两种时间度量系统函数,分别是$time和$realtime,用这两个系统函数可以得到当前的仿真时刻。$time可以返回一个64位的值来记录当前的仿真时刻。 (4)$finish 系统任务$finish的作用是退出仿真器,返回主操作系统,也就是结束仿真过程。格式是 $finish或者$finish(1);如果不带参数,则默认参数为1,下面是具体参数下系统输出的特征信息。

0 不输出任何信息

1 输出当前仿真时刻和位置

2 输出当前仿真时刻、位置和在仿真过程中所用memory及CPU时间的统计。

(4)系统任务$stop $stop任务作用是把EDA工具置成暂停模式,在仿真环境下给出一个交互式的命令操作符,将控制权交给用户。这个任务可以带有参数表达式,根据参数值(0、1、2)的不同,输出不同的信息,参数值越大,输出信息越多。

(5)系统任务$random

这个系统函数提供了一个产生随机数的手段,当函数被占用时返回一个32位的随机数,它是一个带符号的整形数。

下面是一个产生随机数的例子

reg[23:0] rand;

rand=$random %60;

上面的例子产生一个-59到59之间的随机数,所以$random的用法是产生一个(-b+1)到(b-1)之间的随机数。

下面的例子通过并位产生一个值在0—59之间的随机数

reg[23:0 rand];

rand = {$random} %60; 利用这个系统函数可以产生随机脉冲序列或宽度随机的脉冲序列,用于电路的测试。

下面是个产生随机脉冲序列的例子

a3efb43a-8434-11eb-8b86-12bb97331649.jpg

a42a94d8-8434-11eb-8b86-12bb97331649.jpg

(6)关于编译预处理 编译预处理这部分和C语言差不多,主要用到的是`define、`include、和时间尺度`timescale `define 就是宏定义,在C语言了用的也比较多,在verilog中灵活的使用宏定义可以增加程序的可读性,又方便修改。例如在声明一个8位寄存器时用宏定义 `define WINDOWS 8 module reg [1:`WINDOWS] date; …… 习惯上一般宏定义的内容用大写字母表示,这里的WINDOWS就代表数字8,在下面的程序中调用WINDOWS时加个 `,表示调用,这样宏定义的好处就是,在大的程序中如果想改变寄存器的大小,可以直接改数字8为16,这样,所有的WINDOWS都变成了16,这样改一个就可以改变所有的,给程序员带来了方便。 对于`include,C语言里用的比较多这里就不在多提,主要是模块化编程思想的应用,这个很重要,练好模块化编程,可以大大提高程序的可读性和可移植性,也使修改程序变得更加方便。 对于`timescale,就是一个时间尺度,C语言里面没有,这里说一下。 `timescale 包括两部分,一部分是时间单位,一部分是时间精度,下面举个例子

a45d56b6-8434-11eb-8b86-12bb97331649.jpg

在这个例子中,时间单位是10ns,时间精度是1ns,这里d=1.55,也就是说d等于1.55乘10纳秒,也就是15.5纳秒,再看时间精度是一纳秒,四舍五入就是16纳秒,所以在16纳秒时,set置零,32纳秒时set置一。

小结 (1)、在多模块调试的情况下,$monitor需配合$monitoron和$monitoroff来使用。

(2)、$monitor和$diplay的区别在于$monitor是连续监视数据的变化,因而往往只要在测试模块的initial块中调用一次就可以监控被测模块中所有感兴趣的信号不需要,也不能在always块中调用$monitor.

(3)、$time常在$monitor中作时间标记

(4)、$stop 和 $finish 常用在测试模块的initial块中,配合时间延迟用来控制仿真的持续时间。

(5)、$random在编写程序是非常有用的,可以用来产生边沿不稳定的波形和随机出现的脉冲。正确的使用它能有效的发现设计中出现的问题。

(6)、$readman在编写测试程序时很有用,可以用来生成给定的复杂数据流。复杂数据可以用C语言产生,存在文件中。用$readman取出存入存储器,再按节拍输出这在验证算法逻辑电路中特别有用。

(7)、在用`timescale时要注意当多个带不同`timescale定义的模块包含在一起时,只有最后一个才起作用,所以属于一个项目,但`timescale定义不同的多个模块最好分开编译,以免把时间单位搞混。

(8)、宏定义字符串和include引用时,不要忘记用“`”这个标号。

责任编辑:lq6

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1625

    文章

    21664

    浏览量

    601718
  • 寄存器
    +关注

    关注

    31

    文章

    5310

    浏览量

    119983
  • 仿真器
    +关注

    关注

    14

    文章

    1016

    浏览量

    83624

原文标题:零基础学FPGA-Verilog语法下

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    从零开始训练一个大语言模型需要投资多少钱?

    一,前言   在AI领域,训练一个大型语言模型(LLM)是一个耗时且复杂的过程。几乎每个做大型语言模型(LLM)训练的人都会被问到:“从零开始,训练大语言模型需要多久和花多少钱?”虽然网上有很多
    的头像 发表于 11-08 14:15 140次阅读
    <b class='flag-5'>从零开始</b>训练一个大语言模型需要投资多少钱?

    Verilog硬件描述语言参考手册

    一. 关于 IEEE 1364 标准二. Verilog简介三. 语法总结四. 编写Verilog HDL源代码的标准五. 设计流程
    发表于 11-04 10:12 0次下载

    Verilog语法中运算符的用法

    verilog语法中使用以下两个运算符可以简化我们的位选择代码。
    的头像 发表于 10-25 15:17 286次阅读
    <b class='flag-5'>Verilog</b><b class='flag-5'>语法</b>中运算符的用法

    Verilog HDL的基础知识

    本文继续介绍Verilog HDL基础知识,重点介绍赋值语句、阻塞与非阻塞、循环语句、同步与异步、函数与任务语法知识。
    的头像 发表于 10-24 15:00 169次阅读
    <b class='flag-5'>Verilog</b> HDL的基础知识

    FPGA Verilog HDL代码如何debug?

    ,共同进步。 欢迎加入FPGA技术微信交流群14群! 交流问题(一) Q:Verilog代码如何debug?最近学习fpga,写了不少verilog
    发表于 09-24 19:16

    FPGA Verilog HDL有什么奇技巧?

    不同的代码段,方便进行代码的调试和不同配置的实现。 利用 always_ff 、 always_latch 等新的语法特性:在特定的场景更清晰地表达电路的行为。 利用系统任务和函数:如 **display
    发表于 09-12 19:10

    【招聘】verilog vhdl FPGA

    1.熟悉FPGA架构及应用,熟悉图像算法的FPGA实现。 2.熟悉verilog vhdl,熟悉Xilinx或Intel等开发工具。 3.有AI算法 fpga实现经验优先。 4.本科及
    发表于 09-02 15:50

    使用AD8001放大一个100mv左右的信号,经过放大的信号低电平都是三点几伏,不能够从零开始,为什么?

    请问,如图我想使用AD8001放大一个100mv左右的信号,然后使用比较器输出信号进行计数,但是现在经过放大的信号低电平都是三点几伏,不能够从零开始,请问这是什么原因呢?如图,红色是需要放大的信号,紫色是经过放大的信号。
    发表于 08-20 06:17

    分享一本书 《从零开始设计 FPGA 最小系统》

    *附件:从零开始设计FPGA最小系统.pdf 以下为内容片段摘要:详细内容在PDF里 FPGA 最小系统的概念 FPGA 最小系统是可以使 FPGA
    发表于 07-26 07:24

    FPGA学习笔记---基本语法

    Verilog语法是指硬件能够实现的语法。它的子集很小。常用的RTL语法结构如下: 1、模块声明:module ... end module 2、端口声明:input, output,
    发表于 06-23 14:58

    海灵犀FPGA基础研实验箱

    配件组成,提供Verilog语言的实验例程,产品具有实用性高、案例丰富、国产化程度高等特点,满足教学机构微电子、电子工程等相关专业基础研实验需要。图海灵犀FPGA
    的头像 发表于 06-13 08:11 872次阅读
    海灵犀<b class='flag-5'>FPGA</b>基础研<b class='flag-5'>学</b>实验箱

    fpga是用c语言还是verilog

    FPGA(现场可编程逻辑门阵列)开发主要使用的编程语言是硬件描述语言(HDL),其中Verilog是最常用的编程语言之一。而C语言通常用于传统的软件编程,与FPGA的硬件编程有所区别。
    的头像 发表于 03-27 14:38 1783次阅读

    fpga是什么专业

    FPGA(现场可编程门阵列)的学习涉及多个专业领域,但主要与电子信息类、自动化类、计算机类等相关专业最为紧密。这些专业通常涵盖数字电路设计、硬件描述语言(如Verilog和VHDL)编程、嵌入式系统设计等核心课程,为学习FPGA
    的头像 发表于 03-14 16:41 2217次阅读

    【Arduino代码】创客新手村,ESP32从零开始(2)神奇魔法棒-隔空开灯

    外的内容? 符合以上任何一项,你都适合伊娃老师的创客新手村 学习模式 在创客新手村,你不需要死记硬背,而是通过轻松有趣的方式,带你走进ESP32的好玩世界。 通过项目实践,你可以从零开始学习如何使用ESP32,连接各种传感器,从中探索项目的
    的头像 发表于 12-22 08:40 1112次阅读
    【Arduino代码】创客新手村,ESP32<b class='flag-5'>从零开始</b>(2)神奇魔法棒-隔空开灯

    创客新手村,ESP32从零开始(1)水果小夜灯

    外的内容? 符合以上任何一项,你都适合伊娃老师的创客新手村! 学习模式 在创客新手村,你不需要死记硬背,而是通过轻松有趣的方式,带你走进ESP32的好玩世界。 通过项目实践,你可以从零开始学习如何使用ESP32,连接各种传感器,从中探索项目的
    的头像 发表于 12-12 15:56 1390次阅读
    创客新手村,ESP32<b class='flag-5'>从零开始</b>(1)水果小夜灯