FPGA基础之基础语法

一、基本模块结构

Verilog 代码以 模块(Module) 为单位,每个模块对应一个硬件功能单元(如逻辑门、寄存器等)。
基本格式

复制代码
module 模块名 (
    // 输入输出端口声明
    input  端口1,
    input  端口2,
    output 端口3
);
    // 内部信号或变量声明
    wire  信号1;
    reg   信号2;

    // 逻辑描述(组合逻辑或时序逻辑)
    assign 信号1 = 端口1 & 端口2; // 组合逻辑
    always @(posedge clk) begin   // 时序逻辑
        信号2 <= 端口1;
    end

endmodule

二、端口声明

  • 输入端口input

  • 输出端口output

  • 双向端口inout
    示例

    module example (
    input a, // 单比特输入
    input [7:0] b, // 8位宽输入
    output c // 单比特输出
    );


三、数据类型

  1. 线网类型(Net) :表示电路中的物理连接(如导线),常用 wire

    复制代码
    wire data;     // 单比特线网
    wire [3:0] bus; // 4位宽总线
  2. 寄存器类型(Register) :表示存储单元,常用 reg

    复制代码
    reg counter;      // 单比特寄存器
    reg [31:0] data;  // 32位宽寄存器
  3. 其他类型

    • integer:整数类型(仿真用)。
    • parameter:常量参数(类似宏定义)。
    • real:浮点数(仿真用)。

四、基本语法

1. 赋值语句
  • 连续赋值(组合逻辑) :用 assign 关键字。

    复制代码
    assign out = a & b; // 与门逻辑
  • 过程赋值(时序逻辑) :在 always 块中使用。

    复制代码
    always @(posedge clk) begin
        q <= d; // D触发器,非阻塞赋值
    end
2. 条件语句
  • if-else

    复制代码
    always @(*) begin
        if (sel == 1'b0)
            out = a;
        else
            out = b;
    end
  • case

    复制代码
    always @(*) begin
        case (sel)
            2'b00: out = a;
            2'b01: out = b;
            default: out = 0;
        endcase
    end
3. 循环语句
  • for 循环

    复制代码
    integer i;
    always @(*) begin
        for (i=0; i<4; i=i+1)
            out[i] = a[i] & b[i];
    end
  • whilerepeat(较少用,多用于仿真)。


五、命名规则

  1. 合法字符 :字母、数字、下划线 _,区分大小写。
  2. 首字符:必须是字母或下划线(不能是数字)。
  3. 保留字 :不可使用 Verilog 关键字(如 module, input, always)。
  4. 命名建议
    • 使用有意义的名字(如 clk, reset, data_in)。
    • 总线命名:data[7:0] 表示 8 位数据。
    • 避免混淆:如 l(小写 L)和 1(数字 1)。

示例

复制代码
reg [3:0] counter;  // 合法
wire _enable;       // 合法
reg 4bit_data;      // 非法(首字符是数字)

六、注释

  • 单行注释//

  • 多行注释/* ... */

    // 这是单行注释
    /*
    这是
    多行注释
    */


七、示例代码

1. 与门模块
复制代码
module and_gate (
    input  a,
    input  b,
    output c
);
    assign c = a & b;
endmodule
2. D 触发器
复制代码
module d_flipflop (
    input  clk,
    input  reset,
    input  d,
    output reg q
);
    always @(posedge clk or posedge reset) begin
        if (reset)
            q <= 1'b0; // 复位时清零
        else
            q <= d;    // 时钟上升沿采样
    end
endmodule

八、测试模块(Testbench)

用于验证设计功能的仿真代码:

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

    // 实例化被测试模块
    and_gate u1 (.a(a), .b(b), .c(c));

    initial begin
        a = 0; b = 0;
        #10 a = 1;
        #10 b = 1;
        #10 $finish;
    end
endmodule

九、注意事项

  1. 阻塞赋值(=) vs 非阻塞赋值(<=
    • 组合逻辑用阻塞赋值(=)。
    • 时序逻辑用非阻塞赋值(<=)。
  2. 敏感列表always @(*) 用于组合逻辑,always @(posedge clk) 用于时序逻辑。
  3. 避免锁存器 :组合逻辑中需覆盖所有条件分支(如 if-else 必须有 else)。
相关推荐
小眼睛FPGA7 小时前
【RK3568+PG2L50H开发板实验例程】FPGA部分 | DDR3 读写实验例程
科技·嵌入式硬件·ai·fpga开发·fpga
9527华安7 小时前
FPGA实现SDI转LVDS视频发送,基于GTP+OSERDES2原语架构,提供工程源码和技术支持
fpga开发·音视频·lvds·gtp·sdi·oserdes2
三贝勒文子12 小时前
Synopsys 逻辑综合之 MultiBit Flip-Flop 与 ICG
fpga开发·eda·synopsys
骁的小小站13 小时前
HDLBits刷题笔记和一些拓展知识(十一)
开发语言·经验分享·笔记·其他·fpga开发
千宇宙航20 小时前
闲庭信步使用图像验证平台加速FPGA的开发:第九课——图像插值的FPGA实现
图像处理·计算机视觉·缓存·fpga开发
尤老师FPGA21 小时前
LVDS系列20:Xilinx 7系ISERDESE2原语(一)
fpga开发
XINVRY-FPGA2 天前
XCZU47DR-2FFVG1517I Xilinx FPGA AMD ZynqUltraScale+ RFSoC
人工智能·嵌入式硬件·fpga开发·信息与通信·信号处理·射频工程·fpga
forgeda2 天前
如何将FPGA设计的验证效率提升1000倍以上(3)
fpga开发·在线调试·硬件断点
千宇宙航2 天前
闲庭信步使用图像验证平台加速FPGA的开发:第六课——测试图案的FPGA实现
图像处理·计算机视觉·fpga开发
顾北川_野2 天前
Android ttyS2无法打开该如何配置 + ttyS0和ttyS1可以
android·fpga开发