FPGA语法相关知识合集

一.相关概念

1.四种结构说明语句

2.initial 与 always 的异同点

3.task 与 function 的3个不同点

4.task的语法结构(定义及调用)

5.function的语法结构(定义及调用)

6.function 的一个必须有和一个必须没有,使用规则

7.自动(递归)函数是什么?

8.四种用来输出信息的系统任务是?

9.$display()的格式?

10.$display()输出不定值和高阻值的规则?

11.$display和$write的异同点?

12.$display 和 $strobe 区别?

13.$display 和 $monitor 区别?

14.文件操作函数$fopen使用规则?

15.文件操作函数$fclose使用规则?

16.四种文件输出的系统任务与四种普通的显示/打印类系统任务有何区别?

17.值变转储文件(VCD)

18.$stop 与 $finish

19.四种循环语句

20.repeat用法

21.while用法

22.for用法

23.forever用法

24.顺序块与并行块

25.命名块

26.生成语句与生成块:generate ,三种用法,

27.FPGA分布结构(6种),底层资源。IOB包含什么,CLB包含哪四个部分,

28.缩减运算符及其运算规则、作用。

29.用一张图解释阻塞赋值与非阻塞赋值

30.verilog(硬件描述语言)与其他C语言等的区别?

31.参数型常量及两种实例化参数重定义方法

32.多维数组的定义和使用。

33.运算符 %

34.位运算符:^ ; ^~

35.always里的赋值信号类型

36.时间度量系统函数:$time 和 $realtime

系统函数/任务大部分只能在仿真中使用

37.系统函数$redmemb 和 $readmemh

38.系统任务$random

39. 预编译处理命令:

40.宏定义:

41.文件包含处理:

42.条件编译命令:

43.条件执行系统任务:

二.概念解释

1.

四种结构语句分别为:initial,always,task,function。

2.

两种都是仿真开始时同时立即开始执行,在同一模块中可包含多个,并行运行;而initial只执行一次,always只要达到触发条件就执行。Initial常用于测试文件和虚拟模块的编写;而always常与时序控制相结合,包含沿触发(常常描述时序逻辑)和电平触发(常常描述组合逻辑)。

3.

①task可自定义自己的仿真单位时间,而function则跟随主模块;

②task可有任意数量的输入输出,function可有大于等于1的输入,但只能有一个返回值;

③task里可引用task和function,而function里不能启动task;

4.   

definition:

       task <task_name>;  task my_task;

              <in/out>;             input a,b; inout c ; output d,e;   

              begin                   begin

              < … >;                         c = a ;…

              end                      end

       endtask                       endtask

       call:

       task_name(port…);    my_task(v,w,x,y,z);

5.

    definition

       function <type and range of return value><function_name>;  function [1:0]my_function

              <input>;                                                                         input [1:0] my_input;

              begin                                                                                  begin

              <…>;                                                           my_function =my_input        

              end                                                                                     end                     

       endfunction                                                                                endfunction  

       call:

       function_name(input);                                                                 my_function(x);

6.

必须有一个赋值语句为跟函数名同名的变量赋值;

  必须不能有时序控制语句,即不能包含@、wait、#三种语句。

7.

verilog不能递归调用,因为并行;若在函数声明时使用关键字automatic ,则可递归,每一个函数调用动态地分配新地址空间。

8.

$display()  and  $write()  and $strobe()  and  $monitor()  

9.

类似于c或c++那种,

       $display(“ 字符,格式控制 ”,p1,p2,…,pn);

如:$display(“my age is %d , %h”, age,age);

  • my age is 15 , f ; //输出会在终端窗口显示

输出格式用到时查一下即可。

10.

①输出部分位为不定值:X;

②输出部分位为高阻值:Z;

③输出全部位为不定值:x;

④输出全部位为高阻值:z;

11.

       display输出后自动换行,write一行输出多个信息,除此之外无差别。

12.

       $strobe() 用法与 $display() 一致,区别在于打印的时间点:当程序执行到到当前行时(假设当前行为display 或 strobe),display会立刻显示(所以显示内容与前面语句的顺序是不确定的),而strobe则会等待前面的语句全部执行完毕(包括需要花时间的非阻塞赋值)(确保在同一时钟沿赋值的其他语句执行完毕)(显示变量的时刻更确定)才显示。如:

       reg [1:0]a;     

initial begin

              a = 1 ;

              #1 ;

              a = a + 1 ;

              $display(“ display result : a = %d ”,a);

              $strobe(“ strobe result : a = %d ”,a);

              #1 ;

              $display(“ display result : a = %d ”,a);

       end

结果为:

display result : a = 1 ;(非阻塞赋值未完成)

strobe result : a = 2;

display result : a = 2 ;(延迟1s后非阻塞赋值完成)

所以$strobe()系统函数常用于打印当前非阻塞赋值的变量的值。

13.

       $monitor用法与$display一致,用于持续检测变量,只要变量发生变化就打印。

14.

       用法:$fopen(“filename”,type);返回一个32位值的多通道描述符,可以用integer类型变量存储。如:

       integer handle1 ;

       handle1 = $fopen(“D:/filename”,“type”);

       其中,type指定打开的类型,如下:

       文件句柄的32位代表32个通道,最低位用于标准输出通道stdout,0表示关闭,1代表打开;每$fopen一次打开一个通道;可以同时打开多个通道,如:

       interger handle1 , handle2, desc1 , desc2  ;

       handle1 = $fopen(“file1”,”w”); // handle1 = 32’h0000_0002;(倒数第二位置1)

       handle2 = $fopen(“file2”,”w”); // handle1 = 32’h0000_0004;(倒数第三位置1)

       initial begin

              $fdisplay(handle1,”display 1”);//把display 1 写到 file1.out中;

              $fdisplay(handle1 | 1 ,”diplay 2”);//把display 2 写到 file1.out 和 stdout 中;

              $fdisplay(handle1 | handle2,”display 3”);//把display 3写到 file1.out 和file2.out中

       end

15.

       用法:$fclose(handle1);

       关闭handle1对应为1的通道,不能再写入。

16.

       四种文件输出的系统任务:$fdislplay,$fwrite,$strobe,$monitor;

       四种普通的显示/打印类系统任务:$display,$write,$strobe,$monitor;

       区别在于:

①普通显示/打印系统任务输出到终端窗口上,另一种输出到文件中;

②文件操作需要先打开文件,存下句柄,在用法上需要加入句柄,如:

$fdisplay(handle1,”%d”,data);

$display(”%d”,data);

除此之外,在效果上都相同。

17.

       VCD是ASCII文件,包含仿真时间、范围和信号定义、信号值变化等信息。用于存储仿真过程中的数据,后处理工具可以把VCD文件作为输入,显示仿真波形等信息。

       VCD相关系统函数:

       $dumpfile(“filename.dmp”);//指定文件

       $dumpvars(n,module);//指定要转储的变量

       $dumpon;//启动转储

       $dumpoff;//停止转储

       $dumpall;//生成一个监测点,转储。

18.

       $finish 和 $stop 都可以终止仿真,一般用于测试模块的initial块中。其中,$finish可以选择退出modelsim仿真器。一般使用$stop即可。

       这两个函数可以带参数:$stop(n);

       n = :

              0:不输出任何信息

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

              2: 输出当前仿真时刻、位置和仿真过程中所用的memoryCPU时间的统计。

       默认带参数1

19.

       forever ; repeat ; while ; for ;

20.

       repeat(size)begin <…> end

21.

       while(condition) begin <…> end

22.

       for() C语言一致

23.

       forever begin <…> end 无限循环,可用于产生周期性波形,与always不同的是,必须写在initia块中。

24.

       顺序块:begin <…> end 如果没有时序控制语句,如wait#@等,则执行这些语句虽有顺序,但不需要执行时间。

       并行块:fork <…> join 从仿真的角度看,如果在同一时刻对同一个变量产生影响,就会引入竞争。

25.

       块可以具有自己的名字,称为命名块。

       命名块里可声明局部变量,可通过层次名引用,可通过disable block_name 禁止。

26.

       作用:实现重复赋值/例化

       本质:用一条代码来代替多条重复的语句。

       方法:

             

genevar i;//定义循环变量,用于判断

generate for(;;)

       begin:name//要起名字,必须有begin-end

       <…>

       end

 endgenerate

             

generate

if()

       <…>

       else

<…>

 endgenerate

generate

case(N)

       <…>

<…>

endcase

 endgenerate

       用途:

              重复赋值: assign xxx

              多次例化: module_name inst_name( x.(x[i]) ); //在这里,多次例化的例化名称可以相同

27.

可编程输入输出单元(IOB input output block)

可编程基本逻辑单元(CLB configurable logic block : 查找表LUT ,触发器Flip-Flop,复用器MUX,进位链Carry Chain)

嵌入块状RAM(BRAM block ram: 用于生成ramfifo)

丰富的布线资源

底层内嵌的专用功能单元

完整的时钟管理

IOB:

分为两种

1.HP bankhigh performance bank 高性能)

2.HR bank (high range bank 高范围bank)

       一个IOB中包含IPADIBUFOBUFPAD是与外界连接焊盘的引脚;当IOB配置为input时,需要连接IBUF;当IOB配置为output时,需要连接OBUFHR支持更大的电压范围;IOB可以通过配置调节驱动电流,上下拉电阻等,适应不同电器标准的IO物理特性。

CLB

1.CLB LM: SLCIEL + SLCIEM (LUT + MEMORY)

2.CLB LL: SLICEL + SLICEL ( LUT + LUT )

Mmemory的意思,有存储功能,可以配置为DRAM/LUTRAM等;LUT可以配置为ROM使用;SLCIEM中的LUT还可配置为移位寄存器;

SLICEL 结构:4 6-LUT ; 3MUX ; 进位链 8FF(触发器)

LUT

       通过真值表存放在内存单元中来实现组合逻辑电路功能的模块称为LUTLUT本质上是一个RAM;所以自然也可以配置为RAM/ROM等;在 FPGA中,只要逻辑表达式是6位以内输入1位输出,综合后的结果通常都会是一个6-LUT对于更多位的输入,FPGA会采用级联6-LUT的方式实现。(在决定逻辑块的结构时,除了查找表的输入大小之外,评测所用的面积模型,延迟,制程也是重要的考量因素。6-LUT面积和速度方面的性能最好,具备更高的逻辑密度)

       6-LUT 是由两个5-LUT和一个MUX2:1构成的,如图:

同理,更高输入的LUT依旧采用级联的方式来实现。

       FPGA会选择使用LUT代替传统门电路实现,主要是由于传统门电路存在的一些缺点:

传统门电路的复杂度与输入逻辑变量的个数有关。输入逻辑变量的个数越多,逻辑函数的组合和变化就会更多,这会增加电路的复杂度。

逻辑门的延迟与传输线的延迟不可避免。复杂的门电路通常包含更多的逻辑门和信号路径,因而延迟较大。将延迟不相同的逻辑电路直接拼接在一起可能会导致电路的时钟频率下降,并引起时序相关问题。

使用LUT不会存在上述的问题,因为LUT本质上是一个RAM。它将输入数据作为RAM的地址,然后通过该地址找到对应的值,将该值作为结果输出。当输入变量为001时,就会将LUT中地址为001的存储单元中设定的INIT值输出,依此类推,每一次查找的延迟都是固定的。

MUX

       MUX 是一种从多个输入信号中选择单个输出信号的组合逻辑电路。

实现方式主要有两种,一种是使用LUT实现,另一种是直接使用MUX基本逻辑单元实现。

使用6-LUT实现MUX4:14输入多路选择器)的方式,它将6个输入分为两组,4个输入(C0C1C2C3)作为输入信号,另外两个输入(S1S2)作为输入地址:

当输入信号大于4时,一个6-LUT就不够用了,这时候会用到FPGA内部的MUX基本逻辑单元。

③进位链

       进位链用于实现加法和减法运行。

FF:触发器

28.

       单目运算符,如下:

       reg [3:0]B ;

       reg C;

              C = &B ; 等价于 C = ((B[0]&B[1])&B[2])&B[3];

即所有位进行与//非运算,得到一个一位的二进制数值。

       &:判断一个数是不是所有位都为1

       | :判断一个数是不是所有位都为0

       ~:判断一个数所有位中10的个数的奇偶性。

29.

       always@(posedge clk)

       begin

              b <= a ;

              c <= b ;

       end

always@(posedge clk)

       begin

              b = a ;

              c = b ;

       end

30.

       verilog模块中所有过程块(initial块、always块)、连续赋值语句、实例例化引用都是并行的;

       它们表示的是一种通过变量名相互连接;

       这三者出现的先后顺序不影响;

       只有assign和例化可以独立于过程块。

31.

       参数型常量:parameter par_name = xxx;

       改变参数型常量有两种方式:

①模块名 #( .参数名(新值)) 例化名(端口); //如果不写参数名,则按照参数定义顺序修改数值。

②模块名 例化名(端口)defparam 例化名.参数名 = 新值;(例化名可以嵌套多个)

32.

       定义:

       reg [n-1]reg_name[m-1];

       定义mn位的存储器,如reg [7:0] mema[255:0] 定义了2568位的存储器。前面位宽,后面深度(或称个数);

reg  y1 [11:0];        // reg型数组,深度为12,位宽为1

wire [7:0] y2 [3:0]          // wire型数组,深度为4,位宽为8

reg  [7:0] y3 [0:1][0:3];    // reg型三维数组,2行(rows = 23列(cols = 3),每个单元数据位宽8bit

赋值:

y3[1][2] = 8’hac ; //1行第2列的数据置为ac

33.

       模运算符/求余运算符,求两个的余数,要求两个数均为整型数据,符号采用模运算的第一个操作数的符号位。

34.

       ^ : 按位异或;(XOR

       ^~:按位同或;(XNOR)

      加个N即表示非。

35.

       必须为reg类型

36.

       $time 返回一个64位的整数来表示当前仿真时刻值。

       $realtime 返回实型数。

常用于监控变量:(用法)

       $monitor($time, ,” value = %d  ”,value);

37.

       可以在仿真的任意时刻被执行使用

       其中,$readmemb读取二进制数字;$readmemh读取十六进制数字。使用语法如下:

$readmemb(“<数据文件名>”,<存储器名>);默认1为起始地址

$readmemb(“<数据文件名>”,<存储器名>, <起始地址>);

$readmemb(“<数据文件名>”,<存储器名> ,<起始地址>, <结束地址>);

38.

       $random返回一个32位的随机数。

       reg [23:0]rand ;

       rand = $random % max ;//产生一个 -max ~ max 的随机数

       rand = {$random } %max ;//产生一个 0 ~ max 的随机数

39.

       编译预处理命令标识为:`

       系统任务/函数标识为:$

40.

       宏定义:`define 宏名 宏内容

用一个指定的标识符来代表一个字符串。宏定义结尾不加分号,加了会被视为字符串

如:`define wordsize 8 ;使用时为:`wordsize

       宏定义可以层层置换:

       `define aa a+b;

       `define cc c+`aa;

       `cc = c+a+b ;

41.

文件包含处理:`include “filename.v”

       作用:将filename.v文件中的所有内容复制并插入当前行。可以嵌套使用。

42.

与其他语言一样,verilog包含条件编译命令:

       `ifdef 宏名

              <…>

       `else

              <…>

       `endif

       当然还有:`ifndef,用法相同。<>不需要加begin end

       定义宏名时可以直接: `define 宏名 来控制是否编译,后面无需加内容。

43.

       系统任务:$test$plusargs用于条件执行,如:

       if($test$plusargs(“displayvar”))

              $display(“var”);如果定义了标志displayvar,则执行该语句

       系统任务:$value$plusargs用于条件执行,找到匹配选项则返回非0值,如:

       if($value$plusargs(“test name = %s”,test_string))

              $display(“var”);如果找到匹配项,则执行该语句

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/163817.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云CVM服务器标准型/高IO/计算/大数据使用场景及选择说明

腾讯云CVM服务器多种机型使用场景说明&#xff0c;如标准型、内存型、高 IO 型、计算型、大数据型、异构型和批量型&#xff0c;腾讯云百科txybk.com分享不同CVM实例规格配置适合使用场景说明&#xff1a; 腾讯云CVM云服务器 标准型&#xff1a;适合中小型 Web 应用、中小型数据…

振南技术干货集:CPU,你省省心吧!(2)

注解目录 1、石油测井仪器 1.1 背景知识 &#xff08;了解一下石油行业。石油到底是怎么找到的&#xff1f;&#xff09; 1.2 测井数据采传的实现 1.2.1 最直接的初级方案 1.2.2 加入 DMA 的优化方案 &#xff08;看看一般工程师与高手在技术实现上到底有什么区别。充分…

2023 鹏程杯

前言 笔者没有参加此次比赛&#xff0c;由于团队后面会复现此次比赛&#xff0c;所以笔者在此进行复现记录。 silent 考点: 栈溢出 ret2csu 栈迁移 保护: 开了 Full RELRO 和 NX, 禁掉了 execve/execveat 系统调用 漏洞分析 一个裸的栈溢出, 但是没有输出函数可以泄漏 …

C语言--有 n 个人围成一圈,顺序排号。 从第 1 个人开始报数,从 1 到 3 报数,凡是报到 3 的人退出圈子,问最后留下的是原来的第几号?

今天小编给大家分享以下约瑟夫环问题的处理。 一.题目描述 有 n 个人围成一圈,顺序排号。 从第 1 个人开始报数,从 1 到 3 报数,凡是报到 3 的人退出圈子,问最后留下的是原来的第几号? 这是一个典型的约瑟夫环的问题。 二.思路分析 难点一&#xff1a;我们如何表示人退出圈…

基于Springboot的地方美食分享网站(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的地方美食分享网站(有报告)。Javaee项目&#xff0c;springboot项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 项目介绍&#xff1a; 采用…

BUUCTF snake 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 下载附件&#xff0c;解压得到一张snake的图片。 密文&#xff1a; 这里有一张蛇的图片&#xff0c;本人害怕不敢放&#xff0c;想看自己下载附件解压。&#xff08;吐槽一下&#xff0c;我做这道题&#xff0c;全…

微信小程序开发学习——页面布局、初始导航栏与跳转

1.盒模型 要求实现效果如图所示&#xff1a; 所有WXML元素都可以看作盒子&#xff0c;在WXSS中"box model”这一术语是用来设计和布局时使用盒模型本质上是一个盒子&#xff0c;封装周围的WXML元素它包括: 边距&#xff0c;边框&#xff0c;填充和实际内容&#xff0c;模…

腾讯云服务器公网带宽速度怎么样?上传下载实测!

腾讯云服务器公网带宽下载速度计算&#xff0c;1M公网带宽下载速度是128KB/秒&#xff0c;5M带宽下载速度是512KB/s&#xff0c;腾讯云10M带宽下载速度是1.25M/秒&#xff0c;腾讯云百科txybk.com来详细说下腾讯云服务器不同公网带宽实际下载速度以及对应的上传速度对照表&…

【数据挖掘 机器学习 | 时间序列】时间序列必备工具箱: 自相关与偏相关检验

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

JVM的运行时数据区

Java虚拟机&#xff08;JVM&#xff09;的运行时数据区是程序在运行过程中使用的内存区域&#xff0c;主要包括以下几个部分&#xff1a; 程序计数器虚拟机栈本地方法栈堆方法区运行时常量池直接内存 不同的虚拟机实现可能会略有差异。这些区域协同工作&#xff0c;支持Java…

游戏数据分析必知必会

游戏的分类 按端分类&#xff1a;端游&#xff08;steam&#xff09;&#xff0c;页游&#xff08;4399&#xff09;&#xff0c;手游&#xff08;手机&#xff0c;pad&#xff09;按盈利模式分类&#xff1a;付费游戏&#xff08;一次买断&#xff0c;后续购买其它剧情或者包…

优质好文链接

文章目录 1.开放源码有利于系统安全2.yum源配置&#xff0c;这一篇就够了&#xff01;(包括本地&#xff0c;网络&#xff0c;本地共享yum源)3.rpm包是什么4.SSH是什么意思&#xff1f;有什么功能&#xff1f; 1.开放源码有利于系统安全 开放源码有利于系统安全 2.yum源配置…

企业计算机服务器中了mallox勒索病毒怎么解决,勒索病毒解密文件恢复

随着科技技术的不断发展&#xff0c;网络技术得到了快速提升&#xff0c;但网络安全威胁也不断增加&#xff0c;近期&#xff0c;云天数据恢复中心陆续接到很多企业的求助信息&#xff0c;企业的计算机服务器遭到了mallox勒索病毒攻击&#xff0c;导致企业的所有业务中断&#…

算法设计与分析【期中+期末复习知识点总结】(持续更新)

第1章&#xff1a;算法概述 算法&#xff1a;具有输入、输出、确定性、有限性。 程序&#xff08;算法数据结构程序&#xff09;&#xff1a;具有输入、输出、确定性&#xff08;注意&#xff1a;程序可以不满足有限性&#xff0c;如操作系统是在无限循环中执行的程序&#x…

接口调用微信公众号群发功能,绕过微信自身限制

微信群发功能要求要微信认证。微信认证要求要企业账号、而且需要认证费用。 本篇文章教大家非微信认证账号如何群发公众号信息 本篇文章基于python语言开发,其他的语言一样的方式,不需要拘泥于语言 注意事项: 要求有微信公众平台登陆状态,也就是Cookie数据, 如何通过Py…

基于SSM的在线投稿系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

计算机的发展

硬件的发展 第一台电子数字计算机&#xff1a;ENIAC&#xff08;1946&#xff09;&#xff0c;作者&#xff1a;冯诺依曼&#xff0c;逻辑元件&#xff1a;电子管 bug&#xff1a;小虫子&#xff0c;会影响打点 Intel&#xff1a; 机器字长&#xff1a;计算机一次整数运算所能…

OpenAI变天:也许会有另一个OpenAI要崛起?

本周五&#xff0c;OpenAI发布重磅声明&#xff0c;创始人兼CEO山姆奥特曼辞任OpenAI&#xff0c;并退出董事会。总裁Greg Brockman&#xff08;格雷格布罗克曼&#xff09;将辞去董事会主席一职&#xff0c;但将继续在公司担任职务&#xff0c;向CEO汇报。 作为吃瓜群众&#…

Linux(4):Linux文件与目录管理

目录与路径 相对路径在进行软件或软件安装时非常有用&#xff0c;更加方便。利用相对路径的写法必须要确认目前的路径才能正确的去到想要去的目录。 绝对路径的正确度要比相对路径好&#xff0c;因此&#xff0c;在写程序&#xff08;shell scripts&#xff09;来管理系统的条…