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 输出的组合路径,避免成为时序瓶颈
相关推荐
上海芯聚电子1 小时前
ADC与FPGA之间,如何减少板级设计复杂度?
fpga开发·adc
自小吃多3 小时前
高云FPGA ModelSim中的仿真
笔记·嵌入式硬件·fpga开发
通信王663 小时前
适用于 FPGA 和 SoC 的UltraFast 设计方法指南(1)-UG949
fpga开发
明德扬3 小时前
AD9653采集模块、PCIe采集卡和完整采集系统怎么选?
fpga开发·fpga
智塑未来4 小时前
FPGA开发板选型:研发交付能力怎么看
人工智能·fpga开发
泛联新安7 小时前
FPGA功能仿真:VShark正式亮相,换仿真器不用换习惯
fpga开发·编译·仿真·嵌入式软件·代码漏洞扫描
泛联新安12 小时前
FPGA仿真加速:AccEmu正式亮相,一周的回归,一天跑完
机器学习·fpga开发·数据挖掘·回归·自动化·嵌入式软件·代码漏洞扫描
Terasic友晶科技12 小时前
【教程】Agilex 5 SOC FPGA的HPS端如何响应FPGA端中断(四)——设计中断驱动程序
fpga开发·hps·fpga端中断·设计中断驱动程序
szxinmai主板定制专家1 天前
基于 RK3588+RK1820/28 算力卡的国产工控机,适用于机器视觉,机器人等边缘算力场景
人工智能·fpga开发·zynq·控制器·mpsoc·半导体设备
unicrom_深圳市由你创科技1 天前
硬件在环(HIL)测试在FPGA项目中为什么重要?
fpga开发