赞
踩
主线上的硬件描述语言有verilog 和 VHDL 两门, 由于 verilog 语法上比VHDL 语言灵活, 所以现在社区以 verilog 语言开发的项目占比更大。 但是相较于 现在流行的 java/python 计算机语言比起来, 其模块化管理要差很多, 所以现在社区有 类是 java 语言的 Chisel 设计。不过大部分FPGA厂家都只提供了 verilog/VHDL 两门语言的综合逻辑, 所以其他的语言都是最终要转换到 这两门语言上。 下面我们来看看流行的 verilog 语言的一些基本的知识。
Verilog HDL(Hardware Description Language)是在用途最广泛的 C 语言的基础上发展起来的一种硬件描述语言,具有灵活性高、易学易用等特点。Verilog HDL 可以在较短的时间内学习和掌握,目前已经在 FPGA 开发/IC 设计领域占据绝对的领导地位。
Verilog 的特点:
- 能形式化的抽象表示电路的行为和结构;
- 支持逻辑设计中层次与范围的描述;
- 可借用高级语言的精巧结构来简化电路行为和结构;
- 支持电路描述由高层到低层的综合转换;
- 硬件描述和实现工艺无关。
Verilog 的语法:
verilog 命名和 c/c++ 基本相似, 但是命名里面多两个一个$字符
由于 verilog 的数字更多考虑的是逻辑门, 所以通常以 直观的 二进制表示, 而且位数是有效必须指定的, 格式 <位数>'b<二进制数> 如 8’b00000001. 有时候也用 10 进制,16 进制, 格式如 8’d1, 8’ha (8’b00001010), 8 表示的是转换为 2 进制的位数. 16 进制中的加入了 ABCDEF 子母.
verilog 有 3 大数据类型: 寄存器类型(reg), 线网类型(wire)和参数类型(parameter). 下面是其定义方式:
//reg 定义
reg [31:0] delay_cnt; //延时计数器
reg key_flag; //按键标志
//wire 定义
wire data_en; //数据使能信号
wire [7:0] data; //数据
//parameter 定义
parameter DATA_WIDTH = 8; //数据位宽为8位
算术运算 ±* / %, 关系运算 > < >= <= == !=, 逻辑运算 ! && ||, 条件运算符 ? :, 位运算符 & | ^ ~, 移位运算 << >>, 拼接运算 { }, 运算符优先级 与 python 基本一致(都是在 c 语言那里继承的).
模块定义
// 模块定义 module 开头, endmodule 结尾 module led( input sys_clk, // 系统时钟 input sys_rst_n, // 系统复位, 低电平有效 output reg [3:0] led // 4 位 led 灯 ) // 变量定义 parameter WIDTH = 25; parameter COUNT_MAX = 25_000_000; // 板载50MHz时钟 = 20ns, 0.5/20ns = 25MHz, 需要25bit位宽 (25'b1011111010111100001000000) reg [WIDTH-1:0] counter; // reg 信号, 一般情况下代表寄存器 reg [1:0] leg_ctrl_cnt; wire counter_en; // wire 信号, 就是硬件连线 // 程序逻辑 // 计数到最产生一个高电平信号 assign counter_en = (counter == (COUNT_MAX-1'b1))? 1'b1 : 1'b0; // 用于产生0.5秒 使能信号计数器 always @(posedge sys_clk or negedge sys_rst_n) begin // 代表 sys_clk 上升沿或者 sys_rst_n 下降沿触发 // begin/end 中间是一个语句块 if (sys_rst_n == 1'b0) counter <= 1'b0; else if (counter_en) counter <= 1'b0; else counter <= counter + 1'b1; // <= 代表信号是非阻塞赋值 end // led 流水控制计数器 always @(posedge sys_clk or negedge sys_rst_n) begin if (sys_rst_n == 1'b0) led_ctrl_cnt <= 2'b0; else if (counter_en) led_ctrl_cnt <= led_ctrl_cnt + 2'b1; end // 通过控制IO口的高低信号,控制LED的亮灭 always @(posedge sys_clk or negedge sys_rst_n) begin if(sys_rst_n == 1'b0) leg <= 4'b0; else begin // if else 语句, 如果包括多条语句, 需要用 begin/end 括起来 case(led_ctrl_cnt) // case/endcase 中就是case语法块, default是默认分支 2'b00: leg <= 4'b0001; 2'b01: leg <= 4'b0010; 2'b10: leg <= 4'b0100; 2'b11: leg <= 4'b1000; default:; endcase end end endmodule
关键字
编号 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
1 | and | always | assign | begin | buf |
2 | bufif0 | bufif1 | case | casex | casez |
3 | cmos | deassign | default | defparam | disable |
4 | edge | else | end | endcase | endfunction |
5 | endprimitive | endmodule | endspecify | endtable | endtask |
6 | event | for | force | forever | fork |
7 | function | highz0 | highz1 | if | ifnone |
8 | initial | inout | input | integer | join |
9 | large | macromodule | medium | module | nand |
10 | negedge | nor | not | notif0 | notif1 |
11 | nmos | or | output | parameter | pmos |
12 | posedge | primitive | pulldown | pullup | pull0 |
13 | pull1 | rcmos | real | realtime | reg |
14 | release | repeat | rnmos | rpmos | rtran |
15 | rtranif0 | rtranif1 | scalared | small | specify |
16 | specparam | strength | strong0 | strong1 | supply0 |
17 | supply1 | table | task | tran | tranif0 |
18 | tranif1 | time | tri | triand | trior |
19 | trireg | tri0 | tri1 | vectored | wait |
20 | wand | weak0 | weak1 | while | wire |
21 | wor | xnor | xor |
常用关键字
关键字 | 含义 |
---|---|
module | 模块开始定义 |
input | 输入端口定义 |
output | 输出端口定义 |
inout | 双向端口定义 |
parameter | 信号的参数定义 |
wire | wire 信号定义 |
reg | reg 信号定义 |
always | 产生 reg 信号语句的关键字 |
assign | 产生 wire 信号语句的关键字 |
begin | 语句的起始标志 |
end | 语句的结束标志 |
posedge | /negedge 时序电路的标志 |
case | Case 语句起始标记 |
- casex | Case 语句起始标记, 不考虑高阻状态 z |
-casez | Case 语句起始标记, 不考虑高阻状态 z 和不定值 x |
default | Case 语句的默认分支标志 |
endcase | Case 语句结束标记 |
if | if/else 语句标记 |
else | if/else 语句标记 |
for | for 语句标记 |
endmodule | 模块结束定义 |
事件触发器
initial 语句块, 只在初始化时执行一次
always 语句块, 每次时钟周期都执行, 条件可以是电平触发, 时钟触发, 或两者都触发
verilog 类型 wire/reg
wire 类型: 模块输入类型, 顶层模块输出, 部分内部模块输出, 实例化模块的连接, 被 assign 赋值的对象
reg 类型: always/initial 内被赋值的变量, 部分内部模块输出.
PS: 语言只是逻辑的描述, verilog 语言就是硬件语言的逻辑描述,
参考
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。