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 输出的组合路径,避免成为时序瓶颈
相关推荐
HIZYUAN6 小时前
AG32嵌入式系统如何实现加密与固件升级(一)
stm32·单片机·嵌入式硬件·mcu·fpga开发·创业创新
hhh123987_7 小时前
以太网基础③ARP 协议的原理与 FPGA 实现
fpga开发
LabVIEW开发1 天前
LabVIEW与FPGA超声探伤
fpga开发·labview·labview功能
cycf1 天前
FPGA设计中的数据存储
fpga开发
FPGA之旅3 天前
FPGA从零到一实现FOC(一)之PWM模块设计
fpga开发·dubbo
XMAIPC_Robot3 天前
基于ARM+FPGA的光栅尺精密位移加速度测试解决方案
arm开发·人工智能·fpga开发·自动化·边缘计算
cycf3 天前
状态机的设计
fpga开发
szxinmai主板定制专家3 天前
【精密测量】基于ARM+FPGA的多路光栅信号采集方案
服务器·arm开发·人工智能·嵌入式硬件·fpga开发
千宇宙航3 天前
闲庭信步使用SV搭建图像测试平台:第三十二课——系列结篇语
fpga开发
千宇宙航3 天前
闲庭信步使用SV搭建图像测试平台:第三十一课——基于神经网络的手写数字识别
图像处理·人工智能·深度学习·神经网络·计算机视觉·fpga开发