问答 店铺
热搜: ZYNQ FPGA discuz

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

微信扫一扫 分享朋友圈

已有 6 人浏览分享

开启左侧

第二章:必备知识:FPGA DSP的基石

[复制链接]
6 0
       要在FPGA的硬件世界里高效、精确地进行这些运算,我们需要掌握一些与纯软件编程截然不同的基础知识。本章将为你铺设三块至关重要的基石:DSP核心概念、定点数以及关键硬件结构。掌握它们,你才能真正驾驭FPGA进行信号处理的强大能力。
1 数字信号处理核心概念快览(采样、量化、时域与频域)
我们假设你对数字信号处理已有初步了解。这里,我们不深入推导公式,而是通过直观的图示和比喻,快速回顾几个将在后续项目中反复遇到的核心概念。
采样 (Sampling):
比喻:想象一下用相机拍一部电影,每一张照片就是一次“采样”。采样率越高(每秒照片越多),电影就越流畅。
核心:将连续的模拟信号(如声音)在时间上离散化,变成一系列的“快照”。关键在于遵循奈奎斯特采样定理:采样频率必须大于信号最高频率的两倍,否则会发生混叠(Aliasing),高频信号会“伪装”成低频信号。
图示:下图了展示一个正弦波被不同采样率采样后的效果,包含正常采样和欠采样导致混叠的情况。
image.jpg
量化(Quantization):
比喻:拍完照片后,我们用有限的颜色(比如256色)来表示照片的色彩,这就是量化。颜色种类越多(量化位数越多),照片色彩就越逼真。
核心:将采样后得到的每个“快照”的幅度值用有限的二进制位数来表示。这个过程必然会引入量化误差。位数越多,精度越高,但消耗的硬件资源也越多。
图示:下图展示一个正弦波的幅值被粗略(如3位)和精细(如8位)量化后的阶梯状波形对比。
image.jpg
时域 (Time Domain) vs. 频域 (Frequency Domain):
比喻:时域就像乐谱,告诉你每个时刻该弹哪个音;频域就像一份成分表,告诉你这首曲子总共用了哪些音(Do, Re, Mi...),以及每个音的强度。
核心:时域关注信号如何随时间变化。频域通过傅里叶变换(FFT),将信号分解成不同频率的正弦波分量。两者从不同角度描述同一个信号。滤波器就是在频域上做文章,削弱或增强某些频率成分。
图示:下图左边是时域波形(如两个正弦波叠加),右边是其对应的频域频谱图(在两个频率点上有尖峰)。
image.jpg

2 FPGA设计的灵魂:定点数(Fixed-Point)详解
       这是本章最最重要的部分。在PC上编程,我们习惯了使用float和double等浮点数,它们精度高、范围广。但在FPGA中,情况完全不同。

2.1 为什么是定点数而非浮点数?
       资源消耗: 一个标准的32位浮点乘法器在FPGA上可能需要消耗数百个逻辑单元和多个专用DSP模块,而一个16位定点乘法器可能只需要一个DSP模块。浮点运算单元是硬件资源中的“奢侈品”。
       性能: 定点运算本质上是整数运算,电路结构简单,延迟低,更容易实现高时钟频率下的流水线操作。
       可控性: 使用定点数,你作为设计者,对每一个比特的权责都了如指掌,可以精确控制运算过程中的位宽增长、截位和舍入,从而在资源和精度之间做出最优权衡。
       结论:在FPGA DSP设计中,99%的情况下我们都使用定点数。

2.2 Q表示法与位宽选择
定点数,顾名思义,就是小数点的位置是固定的。我们通常使用Q格式来描述它。
  • 格式:Q<整数位数>.<小数位数>

                例如:Q1.15 表示一个16位的有符号数,其中1位是符号位,15位是小数位。
                例如:Q4.12 表示一个16位的有符号数,1位符号位,3位整数位,12位小数位。
  • 总位数 (Word Length): 整数位数 + 小数位数。
  • 表示范围与精度:
                整数位数决定了数的表示范围。整数位太少,运算结果可能会溢出(Overflow)。
                小数位数决定了数的表示精度。小数位太少,量化误差会很大。

2.3 MATLAB实践:浮点到定点的转换与精度分析
理论是枯燥的,让我们立刻打开MATLAB来感受定点数。
场景: 我们有一个浮点小数 0.75,想用一个8位的 Q1.7 格式来表示它。
1.手动计算:
      Q1.7 意味着我们将浮点数乘以 2^7 (128),然后取整。
      0.75 * 128 = 96
      96 的二进制表示是 01100000。
      所以,在硬件中,我们就用整数 96 (二进制 01100000) 来代表浮点数 0.75。当需要恢复其浮点值时,再除以 2^7。
2.使用MATLAB fi 对象:
      MATLAB的 fi (Fixed-Point object) 是我们进行定点数建模和分析的强大工具。
% 创建一个fi对象
% fi(value, signed, word_length, fraction_length)
a_fp = 0.75; % 浮点值
a_fx = fi(a_fp, 1, 8, 7); % 1=signed, 8=word length, 7=fraction length (Q1.7)

% 查看fi对象的属性
disp('Fi Object Properties:');
disp(a_fx);

% 查看其真实的整数值 (Stored Integer)
disp('Stored Integer Value:');
disp(int(a_fx)); % 输出 96

% 查看其二进制表示
disp('Binary Representation:');
disp(bin(a_fx)); % 输出 01100000
运行结果如下:
image.jpg
关键运算规则:
加法: 两个Q格式相同的数相加,小数点位置对齐即可。结果的整数位可能增加1位,需要注意溢出。
           Q1.15 + Q1.15 -> Q2.15
乘法: 两个数相乘,结果的位宽是两者位宽之和,小数位数也是两者小数位数之和。
           Q1.15 * Q1.15 -> Q2.30
挑战: 结果位宽迅速增长!在FPGA中,我们必须在每次运算后进行截位(Truncation)或舍入(Rounding),以保持位宽可控。这正是FPGA DSP设计的核心挑战与艺术所在。
练习: 尝试在MATLAB中用 fi 对象模拟两个 Q1.7 的数相乘,并观察结果的位宽变化。

2.4 Verilog/VHDL中的关键DSP结构
      理解了定点数后,我们来看看如何在Verilog/VHDL中实现这些运算。
寄存器 (Register):
      作用: 存储数据,打断组合逻辑路径,是实现流水线(Pipeline)的基础。在每个时钟沿,数据从一个寄存器传递到下一个。
      代码: always @(posedge clk) 块中的非阻塞赋值 <=。
      图示: 一个简单的D触发器符号
image.jpg
加法树 (Adder Tree):
      作用:当需要将多个数相加时(如FIR滤波器),将它们两两相加,然后将结果再两两相加,形成树状结构。这比串行累加延迟更低。
      代码:assign result = a + b + c + d; 综合工具会自动优化成加法树。
      图示:一个4输入加法树的逻辑结构图
image.jpg
乘法器 (Multiplier) 与 DSP Slice:
      作用:实现定点数乘法。
      代码:assign product = factor1 * factor2;
      关键:Vivado综合工具非常智能,当它看到乘法操作时,会自动调用FPGA芯片内部硬化的、高度优化的DSP Slice(在7系列中称为DSP48E1)来完成,而不是用大量LUT去搭建一个乘法器。这些DSP Slice通常包含一个乘法器、一个加法器和一些寄存器,是实现乘累加(MAC)操作的完美硬件。
      图示: DSP48E1结构示例
image.jpg














您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

10

粉丝

150

主题
精彩推荐
热门资讯
    网友晒图
      图文推荐
        
        • 微信公众平台

        • 扫描访问手机版