前言
Verilog 是一种硬件描述语言,用于描述数字电路的行为和结构。它通过模块化的方式来组织设计,每个模块包含输入、输出端口和内部逻辑。Verilog 提供了丰富的语法结构,可以描述从简单的逻辑门到复杂的处理器架构的各种数字电路设计。对于其格式也有一定的规范(如下图,该实例为一简易分频器),下面对其语法进行具体介绍。
//计数器分频:偶数分频
module cnt_freq(
input clk,//基础时钟为50MHz,即周期为20ps
input rst_n,
output reg signal//周期为2us,占空比为50%
);
reg [6:0] cnt;
always @(posedge clk,negedge rst_n)
begin
if(rst_n == 0)//复位有效
cnt <= 7'd0;
else
if(cnt < 49)//记50次20ps的clk,即1us
cnt <= cnt + 7'd1;
else
cnt <= 7'd0;
end
always @(posedge clk,negedge rst_n)
begin
if(rst_n == 0)
signal <= 1'b1;
else
if(cnt == 49)//1us后使输出取反,再过1us后又取反,即signal一个周期为2us
signal <= ~signal;
else
signal <= signal;
end
endmodule
正文
一、Verilog 基本格式
1.写作习惯
Verilog 是区分大小写的。格式自由,可以在一行内编写(不推荐),也可跨多行编写(推荐)。每个语句必须以分号为结束符。空白符(换行、制表、空格)都没有实际的意义,在编译阶段可忽略。例如下面两中编程方式都是等效的。
always @(posedge clk,negedge rst_n) begin if(rst_n == 0) signal <= 1'b1; else if(cnt == 49) signal <= ~signal ; else signal <= signal; end
//将所有代码写一行,编辑器不会报错,但可读度下降。
always @(posedge clk,negedge rst_n)
begin
if(rst_n == 0)
signal <= 1'b1;
else
if(cnt == 49)
signal <= ~signal;
else
signal <= signal;
end
//换行,代码逻辑明了,方便查错和修改。
2.注释
代码注释在编程中起着非常重要的作用,可以解释代码的意图,帮助他人和自己理解代码的逻辑思路。便于项目的维护和交接。良好的注释是一个程序员编写优质代码的重要组成部分。因此,在编程过程中,应该养成注释的良好习惯,注释要清晰、简洁、具有针对性,避免过多或冗长的注释,确保注释与代码保持同步更新。Verilog 中有 2 种注释方式:(在Quartus II 中对应注释的内容会变色)
用 // 进行单行注释:
用 /* 与 */ 进行跨行注释:
3.关键字
由于Verilog 语法参照C语言设计,其标识符也具有一定C语言特点,标识符(identifier)可以是任意一组字母、数字、$ 符号和 _(下划线)符号的合,但标识符的第一个字符必须是字母或者下划线,不能以数字或者美元符开始。另外,标识符是区分大小写的。关键字是 Verilog 中预留的用于定义语言结构的特殊标识符。Verilog 中关键字全部为小写。下面介绍一些常用关键字(后续会补充):
module 模块名称 | 模块开始定义 |
input 端口名称 |