FPGA基础 -- Verilog常用关键字

Verilog 是一种硬件描述语言(HDL),用于描述和设计数字电路。下面是 Verilog 的常用语法和关键概念:


1. Verilog 设计结构

Verilog 代码通常由 模块(module) 组成,每个模块表示一个硬件单元,具有输入和输出端口。

verilog 复制代码
module and_gate (
    input wire a,       // 输入信号 a
    input wire b,       // 输入信号 b
    output wire y       // 输出信号 y
);
    assign y = a & b;   // 逻辑与操作
endmodule
  • module 定义一个模块
  • input / output 定义输入输出端口
  • assign 进行组合逻辑赋值

2. 变量类型

Verilog 变量用于存储信号值,常见变量类型:

  • wire ------ 组合逻辑信号(无存储能力)
  • reg ------ 触发器存储信号(用于时序逻辑)
  • integer ------ 存储整数(常用于循环变量)

示例:

verilog 复制代码
wire a, b, y;     // 组合逻辑信号
reg clk, rst;     // 时序信号
integer i;        // 整数变量

3. 组合逻辑

组合逻辑直接由输入信号决定输出信号,不依赖时钟。

3.1 assign 语句

verilog 复制代码
assign y = a & b;  // 逻辑与运算
assign s = a ^ b;  // 异或运算
assign c = (a & b) | (b & c_in) | (a & c_in);  // 组合逻辑表达式

3.2 always @(*) 组合逻辑块

verilog 复制代码
always @(*) begin
    y = a & b;  // 组合逻辑
end

4. 时序逻辑

时序逻辑依赖时钟信号,通常使用 always @(posedge clk) 定义。

verilog 复制代码
always @(posedge clk or negedge rst) begin
    if (!rst)
        q <= 0;  // 复位
    else
        q <= d;  // D 触发器
end
  • posedge clk 表示在 时钟上升沿 触发
  • negedge rst 表示 复位信号下降沿 触发
  • <= 非阻塞赋值(用于寄存器存储)

5. 条件语句

5.1 if-else 语句

verilog 复制代码
always @(posedge clk) begin
    if (a == 1'b1)
        y <= 1'b1;
    else
        y <= 1'b0;
end

5.2 case 语句

verilog 复制代码
always @(posedge clk) begin
    case (sel)
        2'b00: y <= a;
        2'b01: y <= b;
        2'b10: y <= c;
        default: y <= 0;
    endcase
end

6. 循环结构

6.1 for 循环

verilog 复制代码
integer i;
always @(posedge clk) begin
    for (i = 0; i < 8; i = i + 1) begin
        mem[i] <= data[i];
    end
end

6.2 while 循环

verilog 复制代码
integer i = 0;
always @(posedge clk) begin
    while (i < 8) begin
        mem[i] <= data[i];
        i = i + 1;
    end
end

7. 进程间通信

7.1 initial 语句

initial 语句在仿真时执行一次,常用于仿真测试。

verilog 复制代码
initial begin
    a = 0; b = 1;
    #10 a = 1;  // 10 时间单位后 a 变为 1
    #20 b = 0;  // 20 时间单位后 b 变为 0
end

7.2 always 语句

verilog 复制代码
always @(posedge clk) begin
    y <= a & b;
end

8. 任务和函数

8.1 task 任务

任务 task 可以有多个输入输出参数:

verilog 复制代码
task add;
    input a, b;
    output sum;
    begin
        sum = a + b;
    end
endtask

8.2 function 函数

function 只能返回一个值:

verilog 复制代码
function [3:0] add;
    input [3:0] a, b;
    add = a + b;
endfunction

9. 测试平台(Testbench)

测试平台 用于验证 Verilog 设计的正确性。

verilog 复制代码
module testbench;
    reg a, b;
    wire y;

    and_gate uut (.a(a), .b(b), .y(y));  // 连接被测模块

    initial begin
        a = 0; b = 0;
        #10 a = 1;
        #10 b = 1;
        #10 a = 0; b = 0;
        #10 $stop;  // 结束仿真
    end
endmodule

10. 关键语法总结

语法 说明 示例
module 定义模块 module my_module(); ... endmodule
input / output 端口定义 input a, b; output y;
wire 组合逻辑信号 wire a, b, y;
reg 时序逻辑信号 reg clk, rst;
assign 组合逻辑赋值 assign y = a & b;
always @(*) 组合逻辑块 always @(*) y = a & b;
always @(posedge clk) 时序逻辑块 always @(posedge clk) q <= d;
if-else 条件判断 if (a) y = 1; else y = 0;
case 多路选择 case(sel) 2'b00: y = a; endcase
for 循环 for (i = 0; i < 8; i = i + 1)
task 任务 task add(input a, b, output sum);
function 函数 function [3:0] add(input [3:0] a, b);
initial 初始化块 initial begin a = 0; #10 a = 1; end

总结

  1. Verilog 是硬件描述语言(HDL),主要用于 FPGA/ASIC 设计。
  2. 使用 module 组织代码,每个模块表示一个硬件单元。
  3. wire 表示组合逻辑,reg 表示寄存器存储。
  4. 组合逻辑使用 assign 或 always @(*),时序逻辑使用 always @(posedge clk)。
  5. 支持 if-else、case、for 等控制结构。
  6. initial 用于仿真,always 用于时序逻辑。
  7. task 和 function 提供代码复用能力。
  8. 测试平台 testbench 用于验证设计。
相关推荐
156082072194 小时前
JFMZQ28DR、JFMZQ68DR、RFsoc XCZU47DR、XCZU48DR 信号处理板
fpga开发·信号处理
XMAIPC_Robot6 小时前
-40~85℃宽温实测:RK3588 机器人控制器硬件底座,长时间 SLAM 定位稳定性验证
人工智能·fpga开发·机器人·边缘计算·arm+fpga·rk3588+fpga
樱木花道長7 小时前
AMD Ross 深度系列 8:FAQ 七问七答(文末附网盘链接)
人工智能·fpga开发
FPGA小迷弟7 小时前
FPGA 与无人机:从飞控实时性到智能载荷的硬件加速实践
人工智能·ai·fpga开发·架构·无人机·ai编程
低慢小uav8 小时前
(已解决)Zynq芯片lwip协议栈,使用tcp作为服务器Service,接收大量数据时,长度接收正常,接收对数据校验,校验和异常分析
网络协议·tcp/ip·fpga开发
szxinmai主板定制专家11 小时前
ARM+FPGA 数控机床控制器:选 CODESYS SoftMotion CNC,还是基于 LinuxCNC 自研搭建?架构、授权、实时性、量产风险深度对比
arm开发·fpga开发·codesys·数据采集卡·linuxcnc·rk3576
女神下凡11 小时前
芯参谋(79):嵌入式学习进阶_(硬件与软件)深入实践指南
arm开发·单片机·嵌入式硬件·学习·fpga开发·设计规范
路上有只喵13 小时前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇5
单片机·嵌入式硬件·fpga开发
爱吃汽的小橘13 小时前
FPGA/数字IC设计的时序优化
fpga开发
FPGA小迷弟13 小时前
FPGA 与无线电:从软件定义无线电到 5G 基带的硬件实现之路
5g·fpga开发·架构·dsp开发·fpga·无线电