第1章:FPGA基础与Verilog快速入门
大家好,我是你们的硬件量化策略讲师。今天咱们聊聊FPGA——这个在量化回测系统里扮演“加速引擎”的芯片。
说实话,我第一次接触FPGA时,心里也犯嘀咕:这东西跟CPU有啥区别?后来在项目中踩过坑、流过汗,才慢慢摸透了它的脾气。今天这章,我就把最核心的FPGA内部结构、Verilog基础语法,以及两个经典小例子(加法器、寄存器)掰开揉碎了讲给你听。
本章核心脉络:FPGA内部结构 → 组合逻辑 vs 时序逻辑 → Verilog实现加法器与寄存器
1.1 FPGA内部结构:四个核心“积木块”
FPGA的全称是现场可编程门阵列。说白了,它就是一盒“乐高积木”,你可以通过编程把里面的小单元拼成任意数字电路。我当年第一次用FPGA做项目时,最头疼的就是搞不清它内部到底有啥。后来拆解了四个核心部件,一下子就通了。
1. LUT(查找表)—— 万能逻辑门
LUT本质上是一个小型的RAM。你输入几个比特,它直接查表输出结果。比如一个4输入LUT,内部存了16种输出组合。你想想看,任何组合逻辑(与、或、异或)都能用LUT实现。我在项目中经常用LUT做地址译码器,比用一堆逻辑门省事多了。
2. FF(触发器)—— 记忆单元
FF是时序逻辑的基础。它能在时钟边沿“记住”一个比特。没有FF,你就没法做状态机、没法做流水线。我记得有一次调试一个计数器,死活不工作,最后发现是FF的复位信号没接对——嗯,这种坑踩过一次就记住了。
3. BRAM(块RAM)—— 片上存储
BRAM是FPGA内部专用的存储块,容量从几Kb到几Mb不等。在量化回测系统里,BRAM常用来存历史行情数据。我建议你优先用BRAM,别用LUT搭RAM——那太浪费资源了。
4. DSP(数字信号处理单元)—— 算力担当
DSP单元专门做乘法、加法、乘累加。在量化策略里,计算收益率、协方差矩阵时,DSP能比CPU快几十倍。我做过一个统计套利策略,用DSP做矩阵运算,回测速度提升了15倍。
我的经验:选FPGA芯片时,先看DSP数量和BRAM容量。做量化回测,DSP比LUT更重要。
1.2 组合逻辑 vs 时序逻辑
这两个概念,是数字电路设计的“阴阳两面”。搞混了,代码就跑飞了。
组合逻辑
输出只取决于当前输入。没有记忆,没有时钟。比如一个加法器:A + B = C,输入变了,输出立刻变。我刚开始写Verilog时,总喜欢把所有逻辑都写成组合的——结果发现时序一乱,数据全错。
时序逻辑
输出不仅取决于当前输入,还取决于之前的状态。需要时钟和触发器。比如一个计数器:每个时钟周期加1。时序逻辑是“有记忆的”。
避坑指南:我曾经在同一个always块里混用组合逻辑和时序逻辑,结果综合出来一堆奇怪的锁存器。记住:组合逻辑用 always @(*),时序逻辑用 always @(posedge clk),别混着写。
1.3 Verilog实现:加法器与寄存器
光说不练假把式。咱们直接上代码。这两个例子,是我每次教新人必讲的“Hello World”。
1. 加法器(组合逻辑)
module adder (
input [7:0] a, // 8位输入
input [7:0] b, // 8位输入
output [8:0] sum // 9位输出(防止溢出)
);
assign sum = a + b;
endmodule
这个加法器很简单。但注意输出位宽是9位——因为两个8位数相加,最大是511,需要9位才能表示。我见过有人用8位输出,结果数据溢出,回测结果全错了。
2. 寄存器(时序逻辑)
module register (
input clk, // 时钟
input rst_n, // 异步复位(低有效)
input [7:0] d, // 数据输入
output [7:0] q // 数据输出
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
q <= 8'b0; // 复位清零
else
q <= d; // 时钟上升沿采样
end
endmodule
这里有个细节:复位信号是低有效(rst_n),这是业界惯例。我建议你统一用低有效复位,别一会儿高一会儿低,容易出bug。
关键区别:加法器用 assign(组合逻辑),寄存器用 always @(posedge clk)(时序逻辑)。前者没有时钟,后者依赖时钟。
1.4 实战小贴士:如何快速上手
- 先画框图:写代码前,先在纸上画出模块的输入输出、内部逻辑。我每次画完框图,代码基本就写完了80%。
- 仿真先行:别急着上板子。用ModelSim或Vivado仿真,看波形对不对。我吃过亏:直接上板,结果LED不亮,查了三天发现是复位极性搞反了。
- 资源估算:写代码时心里要有数——这个模块用多少LUT?多少FF?别等到综合报错才改。
我的习惯:每个模块都写一个简单的testbench,哪怕只有几行。仿真能帮你发现90%的bug。
好了,这一章就到这里。FPGA的基础打牢了,后面咱们才能玩转量化回测系统。记住:LUT、FF、BRAM、DSP这四个积木块,加上组合逻辑和时序逻辑的区分,就是FPGA设计的“内功心法”。