FPGA - Verilog语法

N 人看过

硬件描述语言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;

寄存器

  • 用于过程赋值语句(alwaysinitial)描述组合逻辑或时序逻辑

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语言相似



ENDING
感兴趣可以分享给身边的小伙伴哦!

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。