基操
-
标识符区分大小写,逻辑值不区分
-
首字符必须为字母/下划线
1. 模块
Module
有I/O功能的黑盒
2.逻辑块
always
-
构建 组合 and 时序 逻辑块:if, case, for...
-
always @(...)
begin
……
end -
上升沿posedge
-
下降沿negedge
generate
-
主要结合for:
-
对向量多个位重复操作
-
对同一模块多次重复实例化
initial
-
初始化
-
不可综合,不出现在RTL代码中
-
除了仿真,没太多用途
3.赋值方式
assign
-
连续
-
两信号间真实的物理连接
-
不可在always块中使用
=
-
阻塞赋值
-
always中使用
-
顺序执行
<=
-
非阻塞赋值
-
always中使用
-
并行执行
基础语法
1.逻辑值与逻辑运算
逻辑值
-
0
-
1
-
x:未知状态
-
z:高阻状态
(x/z不区分大小写
逻辑运算
-
逻辑运算符:&&、== 、|、!=
-
按位运算符:&、|、、~、^、
-
归约运算符:&、|、、~、^、
2.常量
-
十进制整数
-
基数法
-
32 ' b(可每四位一下划线,增添可读性
-
32 ' o
-
32 '
-
32 ' h
-
32位,二/八/十/十六进制
-
-
字符串:“ ”
3.注释
-
//:行注释
-
/* */:块注释
-
同CPP
4.变量
wire
线网型:
-
电路间的物理连接
-
其定义的变量可看作信号端口
-
两wire被assign(连续赋值)时,在逻辑块中会被映射成真实的物理连线
-
assign b = a ;
reg
寄存器型:
-
抽象的数据存储单元
-
对某一时间点状态进行保持
-
always、initial中左值均为reg
-
仅assign中左值为wire
5.向量
//格式:
input/output wire/reg [upper:lower] vector_name
//输入输出型
input [7:0] a,b,
output reg [7:0] out
// 模块中间向量
wire [7:0] c, e;
reg [7:0] d;
6.分支语句
if-else:
-
if
-
else if
-
else
case:
-
case
-
... :
-
default :
-
endcase
模块中的参数传递
定义可传递参数的模块:
module counter
// 参数传递
#(
parameter COUNT_MAX = 25'd24_999_999,
parameter STATE = 1'b0 // 多个参数用逗号隔开
)
(
input wire sys_clk,
output reg led_out
);
// 代码主体
endmodule
带参数模块的实例化:
// 参数传递
#(
.COUNT_NUM( 25'd24_999_999), // 传入参数
.STATE(1'b0)
)
counter1_init // 实例化模块的名称位置
(
.sys_clk (sys_clk),
.led_out(led_out)
);
标签:wire,always,概览,999,Verilog,模块,32,CUMT,reg
From: https://www.cnblogs.com/Weenz-y/p/17926291.html