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

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

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

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

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

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 输出的组合路径,避免成为时序瓶颈
相关推荐
FPGA小徐1 小时前
FPGA 部署 YOLO 完整指南:从模型量化到 Zynq PS+PL 硬件加速
yolo·fpga开发
dadaobusi5 小时前
学习:chiesel,scala
学习·fpga开发·scala
爱吃汽的小橘6 小时前
异步FIFO核心揭秘:格雷码与指针同步
fpga开发
璞致电子7 小时前
基于 P201Pro | 接收端基础知识——Costas环锁定后为何仍会错?DQPSK与前导码相位校正(6)
经验分享·fpga开发·ad9361·软件无线电·sdr·qpsk·pzsdr
璞致电子1 天前
基于 AD9361 (PZSDR‑P201Pro) 软件无线电实战综述:从板卡选型、硬件平台升级到 GNU Radio QPSK 完整收发链路
经验分享·嵌入式硬件·fpga开发·软件无线电·sdr·璞致电子
炎龙铠甲会合体1 天前
从 SPEC 到上板:在 Zynq-7020 上用 RTL 手写一个 YOLO 卷积加速器(完整教程)
yolo·fpga开发·axi·芯片验证
FPGA小徐1 天前
Vivado 按键消抖与复位模块代码修复详解:KEY_TOP、key、rst_gen 完整实战
fpga开发
炎龙铠甲会合体1 天前
AXI2ICACHE— AXI4-Full 四路组相联指令 Cache 设计与 UVM 验证
fpga开发·面试·芯片验证
bingcheby1 天前
FMQL15/20/45 (复旦微青龙系列 PSOC)新手使用说明
fpga开发
漫漫长远1 天前
低功耗UPF介绍(一)
笔记·嵌入式硬件·学习·fpga开发