1. 模块声明:
module ModuleName (input Wire1, input Wire2, output Reg1);
// 模块的内容
endmodule
- module关键字用于声明一个Verilog模块。
- input和output用于声明输入和输出端口。
2. 数据类型:
reg [7:0] reg_variable; // 8位寄存器
wire [15:0] wire_variable; // 16位线网
- reg用于声明寄存器,用于存储状态信息。
- wire用于声明线网,用于连接模块内的各个部分。
3. 时序块:
always @(posedge clk or negedge rst_n) begin
// 时序逻辑
end
- always块用于描述时序逻辑。
- @(posedge clk)表示在时钟上升沿触发。
- @(negedge rst_n)表示在负边缘触发(通常用于异步复位)。
4. 组合逻辑块:
always @* begin
// 组合逻辑
end
- @*表示当任何与之关联的输入发生变化时触发。
- 用于描述组合逻辑,不依赖于时钟。
5. 模块实例化:
ModuleName U1 (.input1(wire1), .input2(wire2), .output1(wire3));
- 通过模块名实例化模块,连接输入和输出。
6. 立即赋值:
assign wire_variable = reg_variable1 & reg_variable2;
- 使用assign关键字进行立即赋值。
7. if-else语句:
if (condition) begin
// 如果条件为真的代码
end else begin
// 如果条件为假的代码
end
- 用于条件判断。
8. case语句:
case (selector)
2'b00: // 当selector等于2'b00时
// 代码
2'b01: // 当selector等于2'b01时
// 代码
default: // 当selector没有匹配的情况
// 代码
endcase
- 用于多路选择。
9. always_ff块:
always_ff @(posedge clk) begin
// 时序逻辑
end
- always_ff块用于描述时钟边沿触发的时序逻辑。
示例:
module Adder (input [3:0] A, input [3:0] B, output [4:0] Sum);
assign Sum = A + B;
endmodule
这是一个简单的4位加法器的Verilog模块。它有两个4位输入(A和B),一个5位输出(Sum),其中低4位存储和,最高位存储进位。
这只是Verilog语法的基础,Verilog还包括其他丰富的特性,如生成块、参数化模块、任务和函数等,以支持更复杂的设计。
转载请注明出处:http://www.zyzy.cn/article/detail/15087/Verilog