一、课程导论与硬件基础:FPGA选型指南、编码器类型详解、脉冲输出基本原理

各位同学,大家好。我是你们这门课的老朋友。

做FPGA这行十几年了,我最大的感触就是:搞脉冲输出和编码器接口,说白了就是跟“时间”和“位置”打交道。你想想看,电机转了多少圈、机械臂停在哪个角度、传送带走了多长距离——这些信息最终都要变成电信号,送到FPGA的管脚上。

今天这第一节课,咱们不急着写代码。先把地基打牢。我会从三个最核心的问题入手:选什么芯片、接什么编码器、怎么产生脉冲

1.1 FPGA选型指南——别让芯片拖了后腿

我个人习惯,选FPGA第一件事不是看逻辑单元有多少,而是看IO Bank的电压域和差分对数量

为什么?因为编码器信号通常是差分输入(RS-422、RS-485),或者单端高速信号。你选了个只有3.3V Bank的芯片,结果编码器输出是5V电平,那就得加电平转换,麻烦不说,还容易引入抖动。

核心选型维度(我自己的checklist):

  • 逻辑资源:脉冲计数+编码器解码,一般10K~50K LUT就够了。别贪多,够用就行。
  • 硬核资源:有没有PLL?有没有DSP Slice?我建议至少要有2个PLL,用来产生不同频率的脉冲。
  • IO标准:必须支持LVDS、LVTTL、HSTL。尤其是LVDS,差分编码器信号的首选。
  • 温度范围:工业级(-40°C ~ 85°C)是底线。我在项目里吃过亏,用了商业级芯片,夏天车间一热就丢脉冲。

举个例子。我之前做的一个伺服驱动器项目,编码器是海德汉的ERN1387,输出1Vpp正弦波。这种信号需要高速ADC采样,然后FPGA内部做CORDIC算法解算角度。那时候我选了Xilinx的Artix-7系列,因为它的模拟混合信号模块刚好能处理这种差分正弦信号。你要是选了个纯数字的FPGA,那就得外挂ADC,布线麻烦,延迟还大。

一个小技巧:选型时多看看芯片的封装。BGA封装的散热好,但手工焊接难。QFP封装好焊,但高速信号容易串扰。我个人偏好BGA,前提是工厂有X光检测能力。

1.2 编码器类型详解——增量式 vs 绝对式

编码器这东西,说白了就是把机械位置变成电信号。市面上最常见的就是两种:增量式和绝对式。

1.2.1 增量式编码器

增量式编码器输出的是脉冲序列。它不告诉你“现在在哪儿”,只告诉你“动了多少”。

典型的信号有三根:A相、B相、Z相

  • A相和B相:相位差90°,用来判断方向。A超前B是正转,B超前A是反转。
  • Z相:每转一圈出一个脉冲,用来归零校准。

我在项目中遇到过一个问题:编码器线太长,A相和B相的边沿变得很缓,FPGA采样时老是误判方向。后来我加了施密特触发器做整形,问题才解决。嗯,这里要注意:长线传输一定要考虑信号完整性

1.2.2 绝对式编码器

绝对式编码器就高级一些。它直接输出当前位置的二进制码。断电再上电,位置信息还在,不用重新找零。

常见的协议有:

  • SSI:同步串行接口,时钟+数据,简单可靠。
  • BiSS:双向同步串行,速度快,支持CRC校验。
  • EnDat:海德汉的专利协议,精度高,但需要授权。

你想想看,如果做机器人关节控制,用增量式编码器,每次开机都要回零,多麻烦。绝对式编码器一上电就知道角度,直接干活。

避坑指南:我曾经在一个项目中选了某品牌的绝对式编码器,结果发现它的SSI时钟频率最高只有1MHz。而我的FPGA内部PLL输出是100MHz,分频后根本匹配不了。最后只能外挂一个低速时钟域,白白浪费了资源。所以,选编码器前一定要确认通信时序

1.3 脉冲输出基本原理——FPGA怎么“吐”出脉冲

脉冲输出,说白了就是让FPGA的某个管脚按照你想要的频率和占空比,高低电平来回跳

最简单的办法:用计数器。比如你想输出1kHz的脉冲,系统时钟是50MHz,那就计50000个数,前25000个数输出高,后25000个数输出低。这就是一个50%占空比的方波。

但实际工程中,我们往往需要可调频率、可调占空比、甚至可调相位。这时候就要用到PWM(脉宽调制)或者DDS(直接数字频率合成)。

我给你们看一段最基础的脉冲生成代码(Verilog):

module pulse_gen (
    input  wire       clk,      // 系统时钟 50MHz
    input  wire       rst_n,    // 异步复位
    input  wire [31:0] period,  // 周期计数值
    input  wire [31:0] duty,    // 高电平计数值
    output reg        pulse_out // 脉冲输出
);

reg [31:0] cnt;

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        cnt <= 32'd0;
        pulse_out <= 1'b0;
    end else begin
        if (cnt >= period - 1) begin
            cnt <= 32'd0;
        end else begin
            cnt <= cnt + 1'b1;
        end

        if (cnt < duty) begin
            pulse_out <= 1'b1;
        end else begin
            pulse_out <= 1'b0;
        end
    end
end

endmodule

这段代码很简单,但有个坑:当period和duty变化时,输出脉冲可能会产生毛刺。我建议在更新参数时,先让计数器归零,再加载新值。或者用双缓冲寄存器,避免异步更新。

脉冲输出的三个关键指标:

  • 频率精度:取决于系统时钟和计数器位数。32位计数器,50MHz时钟,理论精度可以达到0.01Hz。
  • 抖动:主要来自时钟源和逻辑路径延迟。用PLL产生的时钟比内部RC振荡器好得多。
  • 最小脉宽:受限于FPGA的IO翻转速率。一般LVCMOS33能到100MHz以上,LVDS能到1GHz以上。

最后,我用一张图来总结本章的知识体系。这张图是我自己画的,你们可以保存下来,以后做项目时对照着看。

第一章:课程导论与硬件基础 知识体系 FPGA选型指南 编码器类型详解 脉冲输出基本原理 逻辑资源 / 硬核资源 IO标准 / 电压域 温度范围 / 封装 增量式:A/B/Z相 绝对式:SSI / BiSS / EnDat 信号完整性 / 长线传输 计数器法 / PWM / DDS 频率精度 / 抖动 / 最小脉宽 Verilog代码实现 核心目标:选对芯片 → 接对编码器 → 产生精准脉冲 为后续章节的编码器解码、脉冲控制、闭环系统打下基础

好了,这就是第一章的全部内容。记住:硬件基础决定上层建筑。选型时多花点时间,后面调试就能少掉点头发。

课后小作业:去你们实验室或者网上找一款增量式编码器的数据手册,看看它的A/B相时序图,试着用示波器抓一下波形。下次课我会讲怎么用FPGA解码这个信号。

专注资料整理