FPGA基础 -- Verilog 数据流建模之幅值比较器

一、什么是幅值比较器(Magnitude Comparator)?

幅值比较器用于比较两个数的大小关系,输出三种可能的状态:

  • A > B
  • A == B
  • A < B

假设输入 A, BN 位二进制数,输出是三个布尔信号:

verilog 复制代码
gt : A > B
eq : A == B
lt : A < B

二、什么是数据流建模?

数据流建模(Dataflow Modeling )强调用布尔表达式、条件表达式、算术表达式建模逻辑功能,着重描述信号间的关系,而不是硬件结构。

Verilog 中通常使用 assign 语句来描述:

verilog 复制代码
assign y = a & b;  // 数据流建模

三、从 1 位幅值比较器讲起

3.1 真值表

A B gt eq lt
0 0 0 1 0
0 1 0 0 1
1 0 1 0 0
1 1 0 1 0

3.2 Verilog 数据流描述(1 位)

verilog 复制代码
module comp1 (
    input  wire A,
    input  wire B,
    output wire gt,
    output wire eq,
    output wire lt
);
    assign gt =  A & ~B;
    assign eq = ~A & ~B | A & B;
    assign lt = ~A &  B;
endmodule

四、N 位幅值比较器(以 4 位为例)

4.1 方法一:直接使用数据流表达式(推荐入门)

Verilog 允许使用关系运算符 ><==

verilog 复制代码
module comp4 (
    input  wire [3:0] A,
    input  wire [3:0] B,
    output wire gt,
    output wire eq,
    output wire lt
);
    assign gt = (A > B);
    assign eq = (A == B);
    assign lt = (A < B);
endmodule

优点:

  • 简洁明了,适用于数据流建模
  • 综合工具识别逻辑清晰

⚠️ 注意:

  • 比较操作符综合为层级比较器电路,适用于小宽度位数(≤8位)比较;宽度大时建议手动优化或使用流水化。

五、进阶:递归式数据流比较器设计(结构更清晰)

对于大位宽的比较器,我们可以采用**"最高位优先判断法"**,数据流描述如下:

verilog 复制代码
module compN #(
    parameter N = 8
)(
    input  wire [N-1:0] A,
    input  wire [N-1:0] B,
    output wire gt,
    output wire eq,
    output wire lt
);
    assign gt = (A > B);
    assign eq = (A == B);
    assign lt = (A < B);
endmodule

如果要完全避免使用比较操作符,可以使用如下逐位比较法(递归或分层描述):

verilog 复制代码
// 不使用 > < ==,适合用作某些敏感综合场景(如 ASIC 或高频域)

assign gt = (A[3] & ~B[3]) |
            (A[3] == B[3] & A[2] & ~B[2]) |
            (A[3:2] == B[3:2] & A[1] & ~B[1]) |
            (A[3:1] == B[3:1] & A[0] & ~B[0]);

六、数据流建模在幅值比较器中的注意点

关键点 说明
无状态 不涉及寄存器、时序逻辑,只描述纯逻辑组合
可综合性强 assign 表达式直接映射为门级逻辑
运算符清晰 > < == 可综合,===!== 为仿真使用,不可综合
适合模块化 可以组合构建 8 位、16 位甚至 32 位比较器,适合构建 AXI Sorter、优先队列等模块

七、实际工程中的应用举例

  1. 图像阈值判断

    verilog 复制代码
    assign mask = (pixel_value > threshold);
  2. 流水线排序比较器

    verilog 复制代码
    assign swap = (a > b);
    assign max = swap ? a : b;
    assign min = swap ? b : a;
  3. 优先级编码器输出选择

    verilog 复制代码
    assign valid = (req0 | req1 | req2 | req3);
    assign out   = (req3) ? 2'd3 :
                   (req2) ? 2'd2 :
                   (req1) ? 2'd1 :
                            2'd0 ;

八、拓展方向建议(为项目实践做准备)

场景 建议实现方式
高速流水线排序网络 采用流水化的比较器链(bitonic sorter)
异构接口协议比较 比较不同接口优先级状态、地址、Tag 等字段
图像分析 像素值与阈值比较,比较器打包为图像核
高位宽(32bit以上) 使用流水化 + 结构优化,避免组合路径过长
时钟约束 注意 gt/eq/lt 输出的组合路径,避免成为时序瓶颈
相关推荐
sz66cm3 小时前
FPGA基础 -- Verilog行为建模之循环语句
fpga开发
hexiaoyan8276 小时前
XC7K325T数据采集卡设计原理图:786-基于X86 CPU+XC7K325T的16路16bit 1M sps同步数据采集卡
fpga开发·xc7k325t·高速数据采集卡·pcie接口卡·xc7k325t开发板·工业监测处理
9527华安1 天前
Xilinx系列FPGA纯逻辑实现HDMI2.0视频收发,基于GTY高速接口,支持4K@60Hz分辨率,提供7套工程源码和技术支持
fpga开发·高速接口·gty·hdmi2.0·4k
GateWorld1 天前
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- 实战基于CSI2 Rx 构建高性能摄像头输入系统
fpga开发·mipi csi2
hahaha60162 天前
模拟信号三极管等效模型
fpga开发
Ronin-Lotus3 天前
嵌入式硬件篇---常见电平标准
嵌入式硬件·fpga开发·常见的电平标准
燎原星火*3 天前
杜勇书籍摘抄
fpga开发
hahaha60163 天前
低温对FPGA的核心影响
fpga开发
FF-Studio3 天前
【DSP笔记 · 第5章】数字滤波器的蓝图:从数学公式到硬件实现的艺术
笔记·fpga开发·自动化·音视频·音频·信号处理