FPGA - Verilog语法
硬件描述语言Verilog一些语法速记
module hello();
initial begin
$display("Hello World.\n");
end
endmodule
Verilog描述
可综合描述:
- 能够将描述转化(compile)为基本的数字电路底层cell
(综合后在IC芯片、FPGA上实现)
不可综合描述:
- 不能够将描述转化(compile)为基本的数字电路底层cell
标识符
规则:
a.由字符、数字、下划线组成
b.首字母必须是字母或者下划线
c.标识符是区分大小写的
- 举例:moudule、define、parameter
信号名字建议跟信号功能对应:
rstn、clk_core、mem_cs、mem_we、mem_dout、mem_din、men_addr
数据物理类型
“线”性数据
- 用于连续赋值语句(
assign
)描述组合逻辑或module
间的信号连接线
wire
- 线性、可综合
wire a; //1bit位宽
wire [3:0] b; //4bit位宽
wire [7:0] c; //8bit位宽
assign a = 1'b0; //连续赋值语句
assign c = 8'h5a;
tri0/tri1
带下拉/上拉电阻的线性、不可综合
没有驱动时,会有默认值0/1
tri0 s0;
tri [20:0] s1;
寄存器
- 用于过程赋值语句(
always
、initial
)描述组合逻辑或时序逻辑
wire
wire [3:0] din;
reg [3:0] d0; //4bit
reg d1; //1bit
initial begin //过程赋值语句
d1 = 0; #10;
d1 = 1;
end
always(@posedge clk)begin
if(d1) d0 <= din;
end
注意:出现reg时不一定全是描述寄存器,还可能是描述某种组合逻辑!!
区分方法:当捕捉上升沿时(
@posedge clk
)为描述寄存器,当捕捉敏感变量列表时(@(*)
)为描述组合逻辑。
real、integer、time、realtime
real float; //类似于定义C语言的一个浮点数
integer a; //类似于定义C语言的一个整数
//等价于reg [31:0]
time last_chng; //打印Verilog仿真时间
realtime rtime;
在可综合Verilog中,很少使用以上类型,常常多用于行为级建模(behavior model)
数据类型
一维标量类型(常量)
整数型
- 需要明确指定数据位宽
16'd100; //10进制表示的“100”
16'h64; //16进制表示的“100”
16'b0110_0100; //二进制表示的“100”
实数型
- 可综合Verilog目前不可用
1.11
2.22
字符型
- 每个字符按8bit ASCII码的整型存储
"verilog" //占用56个bits
一维标量类型(变量)
整数型
- 需要明确指定数据位宽
wire [3:0] da,db; //unsigned
wire signed [9:0] s0; //signed
wire [15:0] c0;
assign c0 = "ab"; //16'h6162
assign da = db + 4'd1;
实数型
- 可综合Verilog目前不可用
real f0,f1;
always@(*) begin
if(da==0) f0 = 1.11;
else f0 = 2.22;
end
多维标量类型(变量)
wire [3:0] array_0 [0:7]; //8个4bit数组成的数组
reg [13:0] array_1[0:255]; //256个14bit数组成的数组
integer array_2[0:15]; //16个整数组成的数组
reg[7:0] array_3[0:15][0:255]; //多维数组
assign array_0[0] = array_1[255][7:4];
always@(posedge clk) begin
array_1[128] <= array_1[127];
array_1[129] <= {6'h0,array_3[15][255]};
end
运算符
逻辑运算符
按位逻辑运算
- & (and)、|(or)、^(xor)、~(inv)
整体逻辑操作
- && 、|| 、! 、== 、!=
条件运算符(描述MUX)
wire [31:] a0,a1;
wire sel;
wire [31:0] out;
assign out = (sel)?a0:a1;
bit位选择[ ]、拼接{ }
wire [31:0] a0,a1;
wire [17:0] out0,out1;
//--- out0 == out1
assign out0 = {a1[31],a0[31],a1[0+:8],a0[15:8]};
assign out1 = {a1[31],a0[31],a1[7:0],a0[8+:8]};
算数运算符
- +、-、*、<、>、<=、>=、/、%
1.为了保证计算结果不溢出(超过bit的数值表示范围),需要仔细定义数据的位宽
2.记住 /、% 慎用
条件语句
if-else
- 使用方法与C语言相似
if-else if-else
- 使用方法与C语言相似
case、casez、casex
casez和casex非必要不使用
使用方法与C语言相似
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。