【FPGA篇章三】FPGA常用语句:Verilog基本语法要素
欢迎大家关注我的微信公众账号,支持程序媛写出更多优秀的文章
Verilog中总共有十九种数据类型,我们先介绍四个最基本的数据类型,他们是:
reg型、wire型、integer型、parameter型
1 常量
1.1 数字integer
整数:b二进制 d十进制 h十六进制 o八进制
表达方式:<位宽=default><进制=d><数字>
Eg. 8‘b10100100,2'h0a3,3'o455,4’d2435
注意,当仅有位宽被忽略时,即'b, 'd, 'o'等形式,数据默认位宽为当前机器的字节宽度,常为32位。
X与Z值:x代表不定值,z代表高阻值
可以用于定义当前进制数的1位(如h下可表达1位十六进制数)。
负数:位宽前加减号
下划线:分割数的表达,提高可读性,无意义
1.2 参数parameter
定义一个标识符代表一个常量,即标识符形式的常量。提高可读性。格式如下:
parameter para1=3'b010, para2=4'd1432,...,paran=2'h6a;
parameter ave_delay = (r+f)/2;
常用于定义延迟时间和变量宽度,以及改变在被引用模块或实例中已定义的参数。如:
module Decode(A,F);
parameter Width=, Polarity=;
...
endmodule
module Top;
wire[:] A4;
wire[:] A5;
wire[:] F16;
wire[:] F32;
Decode #(,) D1(A4,F16);//w=4,p=0
Decode #() D2(A5,F32);//w=5
endmodule
在实例时使用 #() 的方式来更改引用模块参数。
2 变量
2.1 net(default)
网络数据类型net表示结构实体(如门)之间的物理连接,它不能储存值,而且必须受到驱动器的驱动。如无驱动器连接,则呈现高阻Z态。
wire(default)
单门驱动或连续赋值语句驱动的网络型数据。
常用来表示以assign关键字指定的组合逻辑信号。
tri
多驱动器驱动的网络型数据。
(多驱动源下,若无定义逻辑强度,逻辑值会发生冲突产生不确定值X)
wire [n-:] name1, name2, ... , namei;
wire [n:] name1, name2, ... , namei;
wire name;
2.2 register
寄存器是数据储存单元的抽象,通过赋值语句可以改变寄存器储存的值,作用与改变触发器储存的值相当。
常用来表示always块内的指定信号,代表触发器。
always块中被赋值的每一个信号都必须定义成reg型。
reg被赋值如同一组触发器存储单元的值被改变。
reg [n-:] name1, name2, ... , namei;
reg [n:] name1, name2, ... , namei;
reg rega;
默认初始值为x。可以赋正负值,但当该reg是一个表达式中的操作数时,被作为无符号数处理。
reg型只表示被定义的信号将用在always块内,虽常为寄存器、触发器的输出,但并非总是如此。
2.3 memory
Verilog通过建立reg型变量的数组来对存储器进行建模,描述RAM/ROM型存储器和reg文件。
Verilog中不存在多维数组,memory型数据通过扩展reg型数据的地址范围来生成。
reg [n-:] mem1[m-:]; reg [n-:] mem2[m:]; reg [:] mem[:]; //定义了一个名为mem 的存储器,该存储器拥有 256个 数据位宽为8 存储器,地址范围是从0到255 reg [n-:] rega; // rega 是一个n位的寄存器
rega = ; // rega 可以由一个赋值语句赋值
reg mema[n-:]; // mema 是一个由n个1位寄存器单元构成的存储器
mema[] = ;
mema[] = ;
...
mema[n-] = ; // mema 必须一个一个单元地赋值
如果想对memory中的存储单元进行读写操作,必须指定该单元在存储器中的地址。
3 基本运算符号
按操作数个数: 有单目、双目、三目运算符,分别可带一个、两个、三个操作数。
按功能:
1) 算术运算符+、-、×、/、%
加、减、乘、除、求余
整数除法结果值略去小数部分,取模运算符号位采用模运算式中第一个操作数的符号位。
2) 赋值运算符=、<=
同一个always块中,只能全使用阻塞赋值或全使用非阻塞赋值。
* 非阻塞赋值<=:当前语句的执行不会阻塞下一语句的执行。
在块语句结束时才完成赋值操作,块内的赋值语句同时赋值。
可以看作两个步骤的过程:
赋值时刻开始时,计算非阻塞赋值右操作数表达式。
赋值时刻结束时,更新非阻塞赋值左操作数。
reg a=, b=, c=, d=;
always @(posedge clk)
{
a <= b;
b <= c;
c <= d;
}
并行,电路实现往往与触发沿有关,常被综合成时序逻辑电路。
* 阻塞赋值=:完成当前语句后才能做下一句的操作
在该语句结束时就完成赋值操作,块内的阻塞赋值语句顺序执行。
顺序执行,一般不能设定有延迟,常被综合成组合逻辑电路。
3)关系运算符>、<、>=、<=
4)逻辑运算符&&、||、!
&&和 || 是双目运算符,优先级低于算术运算符
! 是单目运算符,优先级高于算术运算符
(a>b) && (x>y) 相当于 a>b && x>y
(a==b) || (x==y) 相当于 a==b || x==y
(!a) || (a>b) 相当于 !a || a>b
5)条件运算符 ? :
6)位运算符~、|、^、&、^~
取反、或、异或、与、同或
// 除相应双目位运算外还可用作单目运算符缩减运算 reg [:] A = ;
reg B;
B = &A;
// 相当于B = 0 & 1 & 0 & 1
// 即将A的所有位进行位运算
7)移位运算符<<、>>
a>>n; // 将操作数a右移n位,去尾,缩小
a<<n; // 将操作数a左移n位,补0 ,放大
8)拼接运算符{ }
把两个/多个信号的某些位拼接起来运算。
a = 'b0;
b = 'b11101100;
c = 'b1; //用法1
r = {a, b[:], c, 'b101};
//此时r = 0 1100 1 101 //用法2
r = {{a}};
//此时r = 0000
//嵌套用法
r = {b[:], {{c,a}}};
//此时r = 111 101010
易混知识点:
位运算符:按位进行运算,原来的操作数有几位,结果就有几位,若2个操作数位数不同,则位短的数据左端会自动补0
逻辑运算符:如果操作数是多位的,则将操作数看作整体,若操作数中每一位都是0值,则为逻辑0值,若操作数中有1,则为逻辑1值
4 块语句
4.1 顺序块
块内语句顺序执行,上一条语句行完毕后,下一条语句才能执行
每条语句的延迟时间是相对于前一条语句的仿真时间而言的(也就是说,顺序块内一条语句的延迟时间是指从前一条语句仿真完毕到当前语句仿真完毕的间隔)
直到最后一条语句执行完,程序流程控制才跳出该语句块。
begin
语句1;
语句2;
end begin:block_name
assignments;
语句1;
语句2;
end
4.2 并行块
1)块内语句同时执行,程序流程控制一进入到该并行块,块内语句则开始同时并行地执行,
2)块内每条语句的延迟时间是相对于程序流程控制进入到块内的仿真时间的(也就是说,并行块内一条语句的延迟时间是指从程序流程控制进入到块内到该条语句执行完毕的间隔;这个延迟时间是用来给赋值语句提供执行时序的),
3)当按延迟时间的时序中排在最后的语句执行完毕或一个disable语句执行时,程序流程控制跳出该程序块。
fork
语句1;
语句2;
join fork:块名
assignments;
语句1;
语句2;
end
4.3 生成块
generate生成块的本质是使用循环内的一条语句来代替多条重复的Verilog语句,简化用户的编程
用法:
1. generate 语法有 generate for 、genreate if 和 generate case 三种
2. generate for 语句必须有 genvar 关键字定义 for 的变量
3. for 的内容必须加 begin 和 end
4. 必须给 for 语段起个名字
. generate for例子:
generate
genvar i; //generate 8 samll fifo for in_data[i] 8X72
for(i=; i<NUM_QUEUES; i=i+)
begin: in_arb_queues //NUM_QUEUES = 8
small_fifo
#( .WIDTH(DATA_WIDTH+CTRL_WIDTH), .MAX_DEPTH_BITS())
in_arb_fifo
(// Outputs
.dout ({fifo_out_ctrl[i], fifo_out_data[i]}),
.full (),
.nearly_full (nearly_full[i]),
.prog_full (),
.empty (empty[i]),
// Inputs
.din ({in_ctrl[i], in_data[i]}),
.wr_en (in_wr[i]),
.rd_en (rd_en[i]),
.reset (reset),
.clk (clk));
end // block: in_arb_queues
endgenerate .generate if例子:
generate
if (REG_WIDTH == WRITE_WIDTH)
begin : new_data_a_generation
assign new_data_a = merge_update ? merge_wr_data : held_wr_data_a;
end
else begin
assign new_data_a = merge_update ?
{{(REG_WIDTH - WRITE_WIDTH - ){merge_wr_data_sign}}, merge_wr_data} :
{{(REG_WIDTH - WRITE_WIDTH){held_wr_data_sign_a}}, held_wr_data_a};
end
endgenerate .generate还可以进行多个assign赋值!
module anytest_v(
input clk,
input[:] datain,
output[:] dataout,
output finish
); wire[:] mem[:];
wire[*-:] xxx;
//reg[7:0] i; generate
genvar i;
for(i=;i<=;i=i+)
begin :wiertech
assign mem[i]= 'b0;
end
endgenerate endmodule
【FPGA篇章三】FPGA常用语句:Verilog基本语法要素的更多相关文章
- 【数据库】 SQL 常用语句之系统语法
[数据库] SQL 常用语句之系统语法 1. 获取取数据库服务器上所有数据库的名字 SELECT name FROM master.dbo.sysdatabases 2. 获取取数据库服务器上所有非系 ...
- FPGA学习笔记(四)——Verilog基本语法
###### [该随笔部分内容转载自小梅哥] ######### 组合逻辑: 多路选择器.加法器.译码器.乘法器 时序逻辑: 计数器.分频器.定时器.移位寄存器 一.Verilog文件的基 ...
- sql server常用函数、常用语句
一.常用函数 1.字符串函数 : charindex(':','abc:123') --寻找一个字符在一段字符串中起始的位置 len('zhangsan') --获取一段字符串的长度 lef ...
- 使用Intel的FPGA电源设计FPGA 供电的常用反馈电阻阻值
使用Intel的FPGA电源设计FPGA 供电的常用反馈电阻阻值. 当前仅总结使用EN5339芯片的方案 Vout = Ra*0.6/Rb + 0.6 芯片手册推荐Ra取348K,则 3.3V时,取R ...
- 【FPGA篇章一】FPGA工作原理:详细介绍FPGA实现编程逻辑的机理
欢迎大家关注我的微信公众账号,支持程序媛写出更多优秀的文章 FPGA(Field Programmable Gate Array),即现场可编程逻辑门阵列,它是作为专用集成电路(ASIC)领域中一种半 ...
- MySQL 常用语句 (汇集)
原文地址:MySql常用语句作者:wuyanle 一.mysql常用语句 创建,删除和最基本查询: 显示数据库 mysql->show databases; 创建数据库 mysql-> ...
- JavaScript快速入门(三)——JavaScript语句
JavaScript基本语句 基本概述 JavaScript是脚本语言,从上到下解释执行,最小单位为语句或语句块,每个语句以分号结尾,每个语句块以右大括号结尾. JavaScript可以将多条语句或语 ...
- FPGA+ARM or FPGA+DSP?
网上有人说.现在的FPGA,ARM功能已经强大到无需DSP协助处理了,未来DSP会不会消声灭迹?是DSP取代FPGA和ARM,还是ARM,FPGA取代DSP呢?担心好不容易学精了DSP,结果DSP变成 ...
- MySQL 常用语句大全
MySQL 常用语句大全 一.连接 MySQL 格式: mysql -h 主机地址 -u 用户名 -p 用户密码 1.例 1:连接到本机上的 MYSQL. 首先在打开 DOS 窗口,然后进入目录 my ...
随机推荐
- elasticsearch7.6.2实战(2)-es可视化及分析平台-kibana
1. 场景描述 elasticsearch部署完成后,es官方提供了可视化.分析及管理平台-kibana,部署下,有需要朋友参考下,不谢! 2. 解决方案 2.1 下载 (1)地址:https://w ...
- stand up meeting 11/30/2015
part 组员 今日工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云 完善了UI的各项功能,弹窗的显示格式等方面的规范:解决logic部分调用该dll的问题:解决鼠标事件的捕捉中~ ...
- stand up meeting 11/19/2015
队员 今日工作 工作耗时/h 明日计划 计划耗时/h 冯晓云 利用昨天编写的调用必应词典API的DLL,完成了UWP版本查词APP的试水,证实了DLL可调和在线查词的可行性:和其他部分的同学就接口数据 ...
- 掷骰子 dp
B. 掷骰子 单点时限: 2.0 sec 内存限制: 512 MB 骰子,中国传统民间娱乐用来投掷的博具,早在战国时期就已经被发明. 现在给你 n 个骰子,求 n 个骰子掷出点数之和为 a 的概率是多 ...
- 22-Java-Hibernate框架(二)
Hibernate的了解.Hibernate的搭建.Hibernate的基本使用流程等内容请阅读21-Java-Hibernate(一) 五.Hibernate的Query查询接口(重中之重) 1.H ...
- vue2.x学习笔记(二十二)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12633051.html. 自定义指令 简介 除了核心功能默认内置的指令([v-mode]和[v-show]等),v ...
- sftp的用法
linux sftp远程连接命令 sftp -oPort=60001 root@192.168.0.254 使用-o选项来指定端口号. -oPort=远程端口号 sftp> get /var/w ...
- mybatis源码学习:插件定义+执行流程责任链
目录 一.自定义插件流程 二.测试插件 三.源码分析 1.inteceptor在Configuration中的注册 2.基于责任链的设计模式 3.基于动态代理的plugin 4.拦截方法的interc ...
- 从"UDF不应有状态" 切入来剖析Flink SQL代码生成
从"UDF不应有状态" 切入来剖析Flink SQL代码生成 目录 从"UDF不应有状态" 切入来剖析Flink SQL代码生成 0x00 摘要 0x01 概述 ...
- py安装教程
https://www.runoob.com/w3cnote/pycharm-windows-install.html