FPGA语法相关知识合集

news2025/1/12 23:35:33

一.相关概念

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”);如果找到匹配项,则执行该语句

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Win11+Modelsim SE-64 10.6d搭建UVM环境

1、添加源文件及tb文件 在目录下建立文件夹&#xff0c;将DUT和Testbench添加进去&#xff0c;文件夹内容如下所示&#xff1a; 2、以《UVM实战》中的例子做简单的示例&#xff1a; 2.1 设计文件 &#xff1a;dut.sv 功能很简单&#xff0c;即将接受到的数据原封不动发送出去…

指针与多维数组练习

例题一&#xff1a; 矩阵相乘 首先&#xff0c;如果你没学过线代的话&#xff0c;这边建议你去B站把宋浩的矩阵运算学了再来看题 如果有个矩阵A和一个矩阵B&#xff0c;当A的列数和B的行数相同时&#xff0c;生成一个新矩阵C&#xff0c;且C是通过矩阵乘法得来的 A[3][2]{3…

画中画视频剪辑:批量制作画中画视频,让视频更具吸引力和创意

在今天的视频制作环境中&#xff0c;画中画视频剪辑技术已经成为了一种主流。它不仅能增加视频的视觉吸引力&#xff0c;也可以提升观看体验。画中画视频剪辑是一种制作多个视频画面的技术&#xff0c;它可以将两个或更多的视频画面融合在一起&#xff0c;形成一个全新的视频。…

关于卓越服务的调研报告

NetSuite知识会发起的本次调研从2023年11月2日开始&#xff0c;到11月12日结束。16日已向参与调研的朋友邮件回复&#xff0c;感谢您的付出&#xff01;今朝分享此报告&#xff0c;各位同学参考。 调研问题与反馈总结 问题1&#xff1a;您能想到哪些服务组织能够提供高满意度&…

GIS杂记(三):MaxEnt模型中的图像地理范围不匹配【全网最好的方法,没有之一】

图像地理范围不匹配问题解决方法 1. 问题描述2. 问题范例3. 问题解决4. 其他参考 1. 问题描述 一般在使用全国的的生物气候变量时&#xff0c;由于其地理范围一致&#xff0c;因此不会出现地理范围不匹配的问题。但是&#xff0c;当加入其他影响因子的时候&#xff0c;如海拔、…

vue之浏览器存储方法封装实例

我们在项目中通常会对缓存进行一些操作&#xff0c;为了便于全局调用&#xff0c;会对缓存的设置、获取及删除方法进行封装成一个工具类。 首先我们在src目录下创建一个plugins文件夹&#xff0c;在plugins下创建cache文件夹并创建index.js&#xff0c;代码如下&#xff1a; c…

Linux每日智囊-cat, more, less

每日分享三个Linux命令&#xff0c;悄悄培养读者的Linux技能。 cat 作用 在终端显示文件内容 cat命令允许创建单个或多个文件&#xff0c;查看文件的内容&#xff0c;连接文件并在终端或文件中重定向输出。 语法 cat [选项] 文件 参数&#xff1a; -n:显示行数&#xf…

Egress-TLS-Origination

目录 文章目录 目录本节实战1、出口网关TLS发起2、通过 egress 网关发起双向 TLS 连接关于我最后 本节实战 实战名称&#x1f6a9; 实战&#xff1a;Egress TLS Origination-2023.11.19(failed)&#x1f6a9; 实战&#xff1a;通过 egress 网关发起双向 TLS 连接-2023.11.19(测…

初级程序员如何进阶

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 疑问的无限递归 我刚入…

GMEL:基于地理上下文嵌入的OD流预测

1 文章信息 文章题为“Learning Geo-Contextual Embeddings for Commuting Flow Prediction”&#xff0c;是一篇发表于The Thirty-Seventh AAAI Conference on Artificial Intelligence (AAAI-20)的一篇论文。该论文主要针对交通中OD流预测任务&#xff0c;从地理上下文信息中…

聊聊近些年 CPU 在微架构、IO 速率上的演进过程

大家好&#xff0c;我是飞哥&#xff01; 在上一篇《深入了解 CPU 的型号、代际架构与微架构》 中我们介绍了我手头的一颗 Intel(R) Core(TM) i5 的型号规则&#xff0c;以及它的物理硬件的 Die 图结构。以及它对应的 Skylake 核的微架构实现。 不少同学开始问我其它型号的 CPU…

2023年【金属非金属矿山安全检查(地下矿山)】考试报名及金属非金属矿山安全检查(地下矿山)最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 金属非金属矿山安全检查&#xff08;地下矿山&#xff09;考试报名参考答案及金属非金属矿山安全检查&#xff08;地下矿山&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及金属非金属矿山安全检查&#…

常见树种(贵州省):002杉类

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、杉木 …

超详细vue3选项式父子组件传值

一、问题背景 最近遇到了一个情景&#xff1a; 子组件干完事情&#xff0c;需要对父组件的变量进行更新&#xff0c;因为父组件将该变量传递给子组件&#xff0c;但是不会双向绑定&#xff0c;这时候我们就需要传值或者触发回调去解决这个问题 我们将分为两个部分 1.父组件传…

小美的排列构造

美团2024届秋招笔试第一场编程真题 贪心问题&#xff0c;得到所有n全排列中相邻两数的和&#xff0c;这些和差距要尽可能小。 显然如果1和2排一起&#xff0c;或者让n和n-1相邻都是错误的。最好的方式是让相邻两数的和接近&#xff08;n1&#xff09;/2。 比如:n 1 n-1 2...…

在excel中设置图表的标题

已经在excel做好了一个图&#xff0c;默认是没有标题的&#xff1a; 现在来设置一个标题。 双击图表&#xff0c;进入编辑状态&#xff1a; 右键&#xff0c;选择“插入标题”&#xff1a; 输入标题&#xff1a;

golang学习笔记——接口interfaces

文章目录 Go 语言接口例子空接口空接口的定义空接口的应用空接口作为函数的参数空接口作为map的值 类型断言接口值 类型断言例子001类型断言例子002类型断言例子003巩固练习 Go 语言接口 接口&#xff08;interface&#xff09;定义了一个对象的行为规范&#xff0c;只定义规范…

对象与this

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 最近想再聊聊Java的对象…

vscode pandas无法使用

一、代码内容 import csv csv_reader csv.reader(open("data.csv")) for row in csv_reader:print(row) print(row[2]) 二、错误提示 ModuleNotFoundError: No module named pandas 三、安装pandas 然后我安装pandas&#xff0c;因为我的python的版本是python …

C++类与对象(1)—初步认识

目录 一、面向过程和面向对象 二、类 1、定义 2、类的两种定义方式 3、访问限定符 4、命名规范化 5、类的实例化 6、计算类对象的大小 7、存储方式 三、this指针 1、定义 2、存储位置 3、辨析 四、封装好处 一、面向过程和面向对象 C语言是面向过程的&#xf…