基于Verilog的同或门FPGA设计实战案例

从零开始:用Verilog在FPGA上“造”一个同或门

你有没有想过,计算机是怎么判断两个数据是否相等的?
别急着说“这还不简单”,其实背后藏着最基础、也最关键的数字逻辑单元之一——同或门(XNOR Gate)。它就像电路世界的“裁判员”,专门负责回答一个问题:“这两个信号,一模一样吗?”

今天,我们就来亲手用VerilogFPGA上实现一个同或门。这不是简单的代码抄写,而是一次完整的硬件设计实战:从真值表出发,到代码编写、仿真验证,再到实际应用场景拓展。哪怕你是第一次接触HDL,也能一步步走完全程。


同或门到底是什么?别被名字吓到

先别管那些复杂的术语,“同或”其实就是“相同才为真”。它的行为非常直观:

AB输出 Y
001
010
100
111

看出规律了吗?只要两个输入一样,输出就是1;不一样就输出0。换句话说,它是异或门(XOR)的反相结果:

$$
Y = A \odot B = \overline{A \oplus B}
$$

也可以展开成与或表达式:
$$
Y = AB + \bar{A}\bar{B}
$$

这意味着我们可以用“与门+非门+或门”搭出来。但在FPGA里,这一切都由查找表(LUT)自动搞定——你只需要告诉综合器“我要什么功能”,剩下的交给工具链。

为什么要在FPGA上做这个?

因为FPGA不是单片机,它不跑程序,而是“变成电路”。你在Verilog里写的每一行逻辑,最终都会映射成实实在在的硬件资源。而像XNOR这样的基础门,在现代FPGA中通常只占用1个LUT6(比如Xilinx Artix-7系列),几乎不占地方,却能并行执行成千上万个。

更重要的是,掌握这种最小粒度的设计思维,是你构建复杂系统的第一步。


Verilog实现:三种写法,哪种最好?

我们先来看最核心的功能模块代码:

module xnor_gate ( input wire A, input wire B, output wire Y ); assign Y = A ~^ B; endmodule

就这么四行?对,就这么简单。

关键点解析:

  • wire是线网类型,用于组合逻辑连接;
  • assign是连续赋值语句,适用于纯组合逻辑;
  • ~^是Verilog内置的按位同或操作符,直接对应XNOR逻辑。

✅ 推荐使用A ~^ B,语义清晰,可读性强,综合效果最优。

但如果你看到别人写成这样呢?

assign Y = ~(A ^ B); // XOR后取反

或者更“教科书式”的结构化写法:

assign Y = (A & B) | (~A & ~B);

这三种写法有什么区别?

写法特点建议场景
A ~^ B最简洁,意图明确日常开发首选
~(A ^ B)逻辑等价,稍绕一步兼容老标准或教学演示
(A&B)\|(~A&~B)完全还原布尔公式初学者理解原理时使用

📌重点提醒:虽然写法不同,但在综合阶段,现代EDA工具(如Vivado、Quartus)会自动优化为相同的底层LUT配置。所以优先选择可读性高的写法,而不是“看起来更底层”的结构化描述。


怎么证明你的电路是对的?靠仿真!

写完代码只是第一步,关键是要验证功能正确。这就需要一个测试平台(Testbench)

下面是完整的testbench代码:

`timescale 1ns / 1ps module tb_xnor; reg A, B; wire Y; // 实例化被测模块 xnor_gate uut ( .A(A), .B(B), .Y(Y) ); initial begin $dumpfile("xnor_wave.vcd"); $dumpvars(0, tb_xnor); // 施加所有输入组合 A = 0; B = 0; #10; A = 0; B = 1; #10; A = 1; B = 0; #10; A = 1; B = 1; #10; $finish; end // 控制台实时监控 initial begin $monitor("Time=%0t | A=%b B=%b | Y=%b", $time, A, B, Y); end endmodule

运行后你会看到输出:

Time= 0 | A=0 B=0 | Y=1 Time=10 | A=0 B=1 | Y=0 Time=20 | A=1 B=0 | Y=0 Time=30 | A=1 B=1 | Y=1

完全符合真值表!🎉

再打开波形文件(.vcd)用GTKWave查看,你会发现每个信号的变化都精准对齐时间轴——这就是硬件仿真的魅力:时间就是一切


别小看它,同或门能干大事!

你以为这只是个玩具案例?错。同或门是很多高级功能的基础构件。举几个真实应用场景:

1. 8位数据比较器:判断两数是否相等

module comparator_8bit ( input [7:0] A, input [7:0] B, output equal ); wire [7:0] cmp; genvar i; generate for (i = 0; i < 8; i = i + 1) begin : bit_comp xnor_gate single (.A(A[i]), .B(B[i]), .Y(cmp[i])); end endgenerate assign equal = &cmp; // 所有位都匹配才算相等 endmodule

👉 每一位做XNOR,最后来个“归约与”(AND reduction)。只要有一位不同,equal就是0。

这类结构广泛用于地址匹配、状态同步、冗余校验等场景。


2. 二值神经网络(BNN)中的乘法替代

在AI边缘计算中,为了降低功耗和面积,有些模型把权重和激活值都压缩成+1/-11/0。这时候传统的乘法可以用XNOR + 计数来近似:

  • 1 x 1 = 1→ XNOR得1
  • 1 x 0 = 0→ XNOR得0
  • 0 x 1 = 0→ XNOR得0
  • 0 x 0 = 1→ XNOR得1

你会发现:当两个比特相同时,XNOR输出为1,正好对应乘积为1的情况

于是整个矩阵乘法就可以转化为大量并行的XNOR运算 + 统计1的个数(POP_COUNT)。这种方法在FPGA上效率极高,已经被用于低功耗AI加速器设计。


3. 双核锁步系统的故障检测

在航天、汽车电子等高可靠性系统中,常用双核锁步架构(Lockstep Dual-Core):两个CPU同时运行相同代码,输出实时比对。

怎么比对?用的就是一大排XNOR门!

一旦发现某个时刻输出不一致(即某位XNOR结果为0),立即触发错误中断,防止系统失控。


开发实践中要注意这些“坑”

别以为写了代码就能顺利烧板子。以下是新手常踩的雷区:

❌ 忘记覆盖所有输入分支 → 综合出锁存器(Latch)

如果你写的是组合逻辑但没处理所有条件,例如:

always @(*) begin if (A == 1) Y = B; // 没写else! end

综合器会认为你需要“记住”上次的值,从而推断出latch。这在同步设计中可能引发亚稳态问题。

✅ 正确做法:要么补全else,要么用assign写纯组合逻辑。


✅ 最佳实践清单

建议说明
使用命名端口连接.A(A)避免接错线,提升可读性
添加$dumpvars$monitor调试利器,尤其适合初学者
信号命名要有意义data_match,bit_eq而非tmp1,sig_a
合理使用generate结构构建重复逻辑时更清晰
开启综合警告(Synthesis Warnings)查看是否有未连接信号、悬空输出等问题

写在最后:小门背后的大世界

你可能会觉得:“就为了一个同或门写了这么多?”
但正是这种看似简单的练习,教会了我们最重要的东西:

  • 硬件思维:不是“顺序执行”,而是“并发存在”;
  • 模块化设计:从最小单元出发,层层搭建复杂系统;
  • 验证先行:没有仿真的设计等于赌博;
  • 抽象与映射:你写的A ~^ B,最终变成了FPGA里的一个LUT配置比特流。

下一步你可以尝试:

  • 把同或门扩展成多输入版本(树形结构);
  • 加一个使能端,做成可控制的比较器;
  • 结合D触发器,做一个带采样的状态监测电路;
  • 试着用SystemVerilog重写,并加入随机测试激励。

随着FPGA越来越多地应用于自动驾驶、智能传感、5G通信等领域,对底层逻辑的掌控能力反而变得更加重要。越高级的应用,越依赖扎实的基本功。

而这个小小的同或门,正是你通往硬件设计自由之路的第一块基石。

如果你正在学习FPGA,欢迎在评论区分享你的第一个成功仿真的瞬间——那往往是热爱开始的地方。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1146425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vivado2022.2安装后基本设置操作指南(适合初学者)

Vivado 2022.2 安装后必做的三件事&#xff1a;让 FPGA 开发从“能用”走向“好用”你是不是也经历过这样的场景&#xff1f;刚按照vivado2022.2安装教程成功装完软件&#xff0c;兴冲冲打开 Vivado&#xff0c;结果一上来就卡在“找不到 FIFO IP 核”、“仿真报错库未编译”、…

设备树电源域管理在ARM64系统中的应用

设备树如何让ARM64系统的电源管理“活”起来&#xff1f;你有没有遇到过这样的场景&#xff1a;系统明明处于空闲状态&#xff0c;但电池却在悄悄流失电量&#xff1f;或者某个外设反复通信失败&#xff0c;最后发现只是因为它的电源被提前关掉了&#xff1f;这些问题背后&…

2026,“硅基经济”的时代正在悄然来临

文&#xff5c;熔财经作者&#xff5c;一文那个过去曾在各种影视作品中无处不在的机器人未来&#xff0c;或许真的不远了。去年十一期间&#xff0c;机器人俨然就掀起了一股新的消费潮&#xff0c;500台单价9998元的“小布米”机器人在两天内被一抢而空&#xff0c;2.99万元起售…

ResNet18应用指南:智能零售货架分析系统开发

ResNet18应用指南&#xff1a;智能零售货架分析系统开发 1. 引言&#xff1a;通用物体识别在智能零售中的价值 随着AI技术的普及&#xff0c;智能零售正从概念走向落地。其中&#xff0c;货架商品识别与状态监控是核心应用场景之一。传统人工巡检效率低、成本高&#xff0c;而…

毫秒级推理响应|CPU优化ResNet18镜像技术深度解析

毫秒级推理响应&#xff5c;CPU优化ResNet18镜像技术深度解析 核心摘要&#xff1a;本文深入剖析“通用物体识别-ResNet18”这一轻量级、高稳定性AI服务镜像的技术实现路径。聚焦于CPU环境下的极致性能优化策略&#xff0c;从模型选型、架构设计、推理加速到WebUI集成&#xff…

touch在工控屏中的稳定性设计:全面讲解抗干扰方案

工业触摸屏为何总“抽风”&#xff1f;一文讲透工控场景下的抗干扰设计你有没有遇到过这样的情况&#xff1a;一台注塑机的操作屏&#xff0c;在液压阀动作的瞬间突然自动点击&#xff1b;数控机床的HMI面板&#xff0c;明明没人碰&#xff0c;坐标却在不停漂移&#xff1b;仓储…

ResNet18优化教程:多线程推理加速方案

ResNet18优化教程&#xff1a;多线程推理加速方案 1. 背景与挑战&#xff1a;通用物体识别中的性能瓶颈 在当前AI应用广泛落地的背景下&#xff0c;通用物体识别已成为智能监控、内容审核、辅助驾驶等场景的核心能力之一。基于ImageNet预训练的ResNet-18模型因其结构简洁、精…

ResNet18应用指南:电商平台商品自动标注

ResNet18应用指南&#xff1a;电商平台商品自动标注 1. 引言&#xff1a;通用物体识别与ResNet-18的工程价值 在电商领域&#xff0c;海量商品图像的自动化标注是提升搜索效率、优化推荐系统和构建智能图库的核心前提。传统人工标注成本高、效率低&#xff0c;而基于深度学习…

Multisim仿真下OTL功率放大器的设计与优化深度剖析

从零开始&#xff1a;用Multisim设计一个“听得见”的OTL功放你有没有试过&#xff0c;在仿真软件里搭了一个看起来完美的电路&#xff0c;结果一跑波形——声音没放大&#xff0c;反而“噼里啪啦”全是失真&#xff1f;尤其是做音频功放时&#xff0c;那种明明理论算得清清楚楚…

ResNet18图像分类指南:常见问题与解决方案

ResNet18图像分类指南&#xff1a;常见问题与解决方案 1. 引言&#xff1a;通用物体识别中的ResNet-18价值 在计算机视觉领域&#xff0c;通用物体识别是构建智能系统的基础能力之一。从自动驾驶中的环境感知&#xff0c;到内容平台的自动标签生成&#xff0c;精准、高效的图…

ResNet18实战教程:工业质检图像识别应用

ResNet18实战教程&#xff1a;工业质检图像识别应用 1. 引言&#xff1a;从通用识别到工业落地的桥梁 在智能制造与自动化检测快速发展的今天&#xff0c;图像识别技术正成为工业质检系统的核心组件。传统人工检测效率低、成本高、易出错&#xff0c;而基于深度学习的视觉方案…

ResNet18模型微调:提升特定场景识别准确率

ResNet18模型微调&#xff1a;提升特定场景识别准确率 1. 引言&#xff1a;通用物体识别的局限与优化需求 1.1 通用ResNet-18模型的应用现状 在当前AI图像分类领域&#xff0c;ResNet-18 作为轻量级深度残差网络的代表&#xff0c;凭借其40MB左右的小体积、毫秒级推理速度和…

ResNet18部署详解:生产环境配置要点

ResNet18部署详解&#xff1a;生产环境配置要点 1. 背景与技术选型 1.1 通用物体识别的工程挑战 在AI服务落地过程中&#xff0c;通用物体识别是许多智能系统的基础能力&#xff0c;广泛应用于内容审核、智能相册、零售分析和安防监控等场景。尽管近年来更复杂的模型&#x…

ResNet18性能测试:长期运行的稳定性评估

ResNet18性能测试&#xff1a;长期运行的稳定性评估 1. 引言&#xff1a;通用物体识别中的ResNet-18价值定位 在当前AI视觉应用广泛落地的背景下&#xff0c;轻量级、高稳定、可离线部署的图像分类模型成为边缘计算与本地服务的核心需求。尽管Transformer架构和更大规模的CNN…

无需联网也能精准识图?ResNet18大模型镜像实战解析

无需联网也能精准识图&#xff1f;ResNet18大模型镜像实战解析 在边缘计算、隐私保护和低延迟识别需求日益增长的今天&#xff0c;离线可用、高精度、轻量级的图像分类方案正成为开发者和企业的刚需。本文将深入解析一款基于 PyTorch 官方 ResNet-18 模型构建的 “通用物体识别…

ResNet18实战教程:医疗X光片自动分类

ResNet18实战教程&#xff1a;医疗X光片自动分类 1. 引言&#xff1a;从通用物体识别到医疗影像分类的迁移 深度学习在计算机视觉领域的成功&#xff0c;很大程度上得益于卷积神经网络&#xff08;CNN&#xff09; 的发展。其中&#xff0c;ResNet&#xff08;残差网络&#…

基于三极管开关电路解析的继电器驱动设计完整指南

三极管驱动继电器&#xff1a;从原理到实战的硬核设计全解析你有没有遇到过这种情况——明明代码写得没问题&#xff0c;MCU也正常输出高电平&#xff0c;可继电器就是“抽风”&#xff0c;时而吸合、时而不吸&#xff1f;或者更糟&#xff0c;用着用着三极管发烫冒烟&#xff…

ResNet18入门必读:图像分类基础与实践

ResNet18入门必读&#xff1a;图像分类基础与实践 1. 引言&#xff1a;通用物体识别中的ResNet18 在计算机视觉领域&#xff0c;通用物体识别是深度学习最成熟、应用最广泛的任务之一。其目标是从一张图像中自动识别出存在的物体或场景类别&#xff0c;例如“猫”、“汽车”、…

工业网关中I2C通信协议桥接转换:项目应用详解

工业网关中I2C通信协议桥接转换&#xff1a;从原理到实战的深度解析在智能制造与工业物联网&#xff08;IIoT&#xff09;加速融合的今天&#xff0c;工业网关早已不再是简单的“数据搬运工”&#xff0c;而是承担着边缘计算、多协议适配和设备协同控制的关键角色。而在众多底层…

ResNet18应用案例:工业缺陷检测系统

ResNet18应用案例&#xff1a;工业缺陷检测系统 1. 引言&#xff1a;从通用识别到工业场景的延伸 在智能制造与自动化质检日益普及的今天&#xff0c;深度学习驱动的视觉检测系统正逐步替代传统人工巡检。尽管许多AI模型专注于特定任务&#xff08;如目标检测、语义分割&…