标签:语句 begin wire end FPGA 语法 Verilog 信号 reg
基本语法
1. 模块类声明类语法
module···endmodule
在Verilog中都会出现这个语法,这是一个固定的语法,所有的功能实现语法最终都包含在···中。module的语法如下所示:
module my_first_prj(<端口信号列表>···)
<逻辑代码>
endmodule
module后面的my_first_prj为该module的命名,随后的括号内罗列出该模块的所有的输入/输出端口信号名
2. 端口声明
input,output,inout
对于本地module而言,这些信号无非可以归为3类,即输入信号(input),输出信号(output),双向信号(inout),最常见的3中端口声明实例如下:
input clk;
input wire rst_cn;
input [7:0] data_in
第一个声明表示1bit的名称为clk的输入信号端口,第2个声明表示wire类型的1bit的名称为rst_n的输入信号,第3个声明表示8bit的名称为data_in的输入信号。
3. 参数定义
parameter
一个基本的module如下:
module <模块命名>(<端口命名1>,<端口命名2>,...)
//输入端口声明
input<端口命名1>;
input wire<端口命名1>;
input[<最高位>:<最低位>]<端口命名3>;
...
//输出端口声明
output<端口命名4>;
output[<最高位>:<最低位>]<端口命名5>;
output reg[<最高位>:<最低位>]<端口命名6>;
...
//双向端口声明
inout<端口命名7>;
inout[<最高位>:<最低位>]<端口命名8>;
...
//参数定义
parameter<参数命名1>=<默认值>;
parameter[<最高位>:<最低位>]<参数命名2>=<默认值2>;
...
//具体功能逻辑代码
...
endmodule
4. 信号类型
wire,reg等
如下图所示就是reg和wire的示例图,reg就是两个寄存器,而wire就是两个reg之间直接连接的线。
作为input和output的信号端口只能是wire型,而output则可以是wire也可以是reg。wire和reg的一些常见用法示例如下:
//定义一个wire信号
wire<wire变量名>;
//给一个定义的wire信号直接连接赋值
//该定义等同于分别定义一个wire信号和使用assign语句进行赋值
wire<wire变量名>=<变量或变量赋值>;
//定义一个多bit的wire信号
wire[<最高位>:<最低位>]<wire变量名>;
//定义一个reg信号
reg<reg变量名>;
//定义一个赋初值的reg信号
reg<reg变量名> = <初始值>;
//定义一个多bit的reg信号
reg[<最高位>:<最低位>]<reg变量名>;
//定义一个多bit的赋初值的reg信号
reg[<最高位>:<最低位>]<reg变量名>=<初始值>;
//定义一个二维的多bit的reg信号
reg[<最高位>:<最低位>]<reg变量名>[<最高位><最低位>];
5. 多语句定义
begin…end
通俗地说,begin…end就是C语言里的“{}”,用于单个语法的多个语句定义,其使用示例如下:
//含有命名的begin语句
begin:<块名>
//可选声明部分
//具体逻辑
end
//基本的begin语句
begin
//可选声明部分
//具体逻辑
end
6. 比较语句
if…else, case…default…endcase
判断语法,if…else及case语句是最常用的功能语法,其基本的使用示例如下:
//if判断语句
if(<判断条件>)
begin
//具体逻辑
end
//if...else判断语句
if(<判断条件>)
begin
//具体逻辑
end
else
begin
//具体逻辑
end
//if...else if ...else判断语句
if(<判断条件1>)
begin
//具体逻辑
end
else if(<判断条件2>)
begin
//具体逻辑
end
else
begin
//具体逻辑
end
//case语句
case(<判断变量>)
<取值1>:<具体逻辑>
<取值2>:<具体逻辑>
<取值3>:<具体逻辑>
defualt:<具体逻辑>
endcase
7. 循环语句
for循环语句用得也比较少,但是也会在一些特定的设计中使用它,其示例如下:
//for语句
for(<变量名>=<初值>;<判断表达式>;<变量名>=<新值>)
begin
//具体逻辑
end
8. 任务定义
task…endtask
task更像是C语言中的子函数,task中可以有input,output和inout端口作为出入口参数,他可以用于实现一个时序控制。task没有返回值,因此不可以用在表达式中,其基本用法如下:
task<task命名>:
//可选声明部分,如本地变量声明
begin
//具体逻辑
end
endtask
9. 连续赋值
assign和问号表达式(?)
assign用于直接互联不通的信号或直接给wire变量赋值:
assign<wire 变量名>=<变量或常量>;
问号表达式就是简单的if…else语句,但更多地用在组合逻辑中:
(判断条件)?(判断条件为真时的逻辑处理):(判断条件为假时的逻辑处理)
10. always模块
always
敏感表可以为电平,沿信号posedge/negedge;通常和@连用,在组合逻辑电路中,用法如下:
always@(*)
begin
//具体逻辑
end
always后若有沿信号(上升沿posedge,下降沿negedge),则多位时序逻辑,基本用法如下:
//单个沿触发的时序逻辑
always@(沿变化)
begin
//具体逻辑
end
//多个沿触发的时序逻辑
always@(<沿变化1>or<沿变化2>)
begin
//具体逻辑
end
11. 运算操作符
Verilog中绝大多数运算操作符都是可综合的,其列表如下:
12. 赋值符号
=和<=
标签:语句,begin,wire,end,FPGA,语法,Verilog,信号,reg 来源: https://blog.csdn.net/qq_42580947/article/details/100701562
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。