当前位置: 首页 > article >正文

别再死记硬背了!用这3个真实小项目(呼吸灯、按键消抖、数码管)彻底搞懂Verilog的always、case和assign

用三个实战项目解锁Verilog核心语法从呼吸灯到数码管显示第一次接触Verilog时我被各种语法规则搞得晕头转向——always块的触发方式、case语句的匹配规则、assign连线的使用场景每个概念单独看都明白但一到实际项目中就手足无措。直到我开始用真实项目驱动学习才真正理解这些语法元素的设计初衷和实际应用场景。本文将带你通过三个经典FPGA入门项目在实现功能的同时掌握Verilog的核心语法要点。1. 呼吸灯项目理解always块的时序控制呼吸灯是FPGA入门的Hello World通过PWM调制实现LED亮度渐变效果。这个项目完美展示了always块在时序逻辑中的应用精髓。1.1 周期计数器设计呼吸灯的核心是一个可调节占空比的PWM信号。我们首先需要两个always块来构建基础时序框架reg [15:0] period_cnt; // 周期计数器 reg [15:0] duty_cycle; // 占空比寄存器 reg inc_dec_flag; // 增减方向标志 // 20ms周期计数器50MHz时钟 always (posedge clk or negedge rst_n) begin if(!rst_n) begin period_cnt 16d0; end else if(period_cnt PERIOD_MAX) begin period_cnt 16d0; end else begin period_cnt period_cnt 1b1; end end这个always块展示了时序逻辑的典型结构使用posedge clk明确时钟边沿触发采用非阻塞赋值确保寄存器正确更新包含同步复位逻辑1.2 占空比动态调整第二个always块实现占空比的自动增减形成呼吸效果// 占空比自动调整 always (posedge clk or negedge rst_n) begin if(!rst_n) begin duty_cycle 16d0; inc_dec_flag 1b1; end else if(period_cnt PERIOD_MAX) begin if(inc_dec_flag) begin if(duty_cycle PERIOD_MAX) begin inc_dec_flag 1b0; end else begin duty_cycle duty_cycle 1b1; end end else begin if(duty_cycle 16d0) begin inc_dec_flag 1b1; end else begin duty_cycle duty_cycle - 1b1; end end end end调试提示呼吸灯效果不明显检查PERIOD_MAX值是否足够大确保人眼能观察到亮度变化。1.3 assign实现PWM输出最后用assign语句将计数器与LED输出连接assign led (period_cnt duty_cycle) ? 1b1 : 1b0;这个简单的组合逻辑持续比较计数值与占空比不需要时钟控制适合用assign实现体现了Verilog描述硬件的本质特性2. 按键消抖项目掌握组合逻辑always块机械按键的抖动问题困扰着许多初学者。通过这个项目我们将深入理解组合逻辑always块和case语句的配合使用。2.1 消抖状态机设计按键消抖通常采用有限状态机实现以下是核心代码框架localparam IDLE 2b00; localparam DEBOUNCE 2b01; localparam PRESSED 2b10; localparam RELEASE 2b11; reg [1:0] state; reg [19:0] counter; // 20ms消抖计时器 always (posedge clk or negedge rst_n) begin if(!rst_n) begin state IDLE; counter 20d0; end else begin case(state) IDLE: begin if(!key_in) begin state DEBOUNCE; counter 20d0; end end DEBOUNCE: begin if(counter DEBOUNCE_TIME) begin if(!key_in) begin state PRESSED; end else begin state IDLE; end end else begin counter counter 1b1; end end // 其他状态省略... endcase end end这个设计展示了case语句在状态机中的清晰结构时序always块对状态寄存器的管理计数器在消抖中的应用2.2 组合逻辑检测按键事件使用组合逻辑always块检测按键按下和释放事件reg key_press; reg key_release; always (*) begin key_press (state PRESSED) (state_prev DEBOUNCE); key_release (state IDLE) (state_prev RELEASE); end这个always (*)块自动敏感所有输入信号使用阻塞赋值实现组合逻辑实时响应状态变化常见错误在组合逻辑always块中使用非阻塞赋值会导致仿真与综合结果不一致。3. 数码管显示项目综合运用assign与case数码管驱动需要同时处理段选和位选信号是练习Verilog语法综合运用的理想项目。3.1 段选译码器设计使用case语句实现BCD到7段码的转换reg [7:0] seg_data; always (*) begin case(num) 4h0: seg_data 8b1100_0000; // 0 4h1: seg_data 8b1111_1001; // 1 4h2: seg_data 8b1010_0100; // 2 // 其他数字省略... default: seg_data 8b1100_0000; endcase endcase语句在这里实现查找表功能完备的default分支避免锁存器生成配合组合逻辑always块实现纯硬件译码3.2 动态扫描电路数码管动态扫描需要精确的时序控制reg [19:0] scan_cnt; reg [3:0] scan_pos; always (posedge clk or negedge rst_n) begin if(!rst_n) begin scan_cnt 20d0; scan_pos 4d0; end else begin if(scan_cnt SCAN_MAX) begin scan_cnt 20d0; scan_pos scan_pos 1b1; if(scan_pos POS_MAX) begin scan_pos 4d0; end end else begin scan_cnt scan_cnt 1b1; end end end3.3 assign实现输出驱动最后用assign语句连接译码结果与数码管assign seg (en) ? seg_data : 8hFF; assign dig ~(1b1 scan_pos);这种设计使输出代码简洁明了利用位操作高效实现位选体现了assign在输出驱动中的优势4. 语法要点对比与实战建议通过三个项目实践后让我们系统梳理这些语法元素的应用场景语法元素典型应用场景赋值方式触发条件注意事项always时序寄存器、状态机、计数器非阻塞时钟边沿避免组合逻辑产生锁存器always组合译码器、组合逻辑阻塞输入信号变化(*)确保所有分支都被覆盖assign简单组合逻辑、连线阻塞持续驱动(无触发条件)只能用于wire类型case状态机、查找表视上下文通常在always块内使用必须包含default分支在实际项目中我习惯采用这样的开发流程明确模块的时序需求规划always块结构用assign处理简单的信号连接复杂组合逻辑使用always (*)实现状态机等时序逻辑使用带时钟的always块case语句用于多路选择或查找表调试FPGA项目时最常见的三个语法相关问题是组合逻辑always块中意外生成锁存器原因未覆盖所有输入条件分支解决添加default分支或完整if-else结构仿真与硬件行为不一致原因混淆阻塞/非阻塞赋值解决时序逻辑统一用组合逻辑用信号冲突或多重驱动原因多个always块对同一变量赋值解决确保每个寄存器只在一个always块中被赋值

相关文章:

别再死记硬背了!用这3个真实小项目(呼吸灯、按键消抖、数码管)彻底搞懂Verilog的always、case和assign

用三个实战项目解锁Verilog核心语法:从呼吸灯到数码管显示 第一次接触Verilog时,我被各种语法规则搞得晕头转向——always块的触发方式、case语句的匹配规则、assign连线的使用场景,每个概念单独看都明白,但一到实际项目中就手足无…...

数据离散化实战:如何用Pandas的cut()函数把年龄分成‘青年’‘中年’?

数据离散化实战:用Pandas的cut()函数实现业务驱动的年龄分层 在用户画像构建和业务分析中,我们经常需要将连续型数据转换为具有明确业务含义的类别标签。年龄这个看似简单的数值字段,经过合理的离散化处理,可以揭示出不同人生阶段…...

终极局域网文件传输指南:零配置跨平台共享方案

终极局域网文件传输指南:零配置跨平台共享方案 【免费下载链接】LAN-Share Cross platform LAN File transfer application built with Qt C framework 项目地址: https://gitcode.com/gh_mirrors/la/LAN-Share 在当今数字化办公环境中,局域网文件…...

HarmonyOS 鸿蒙手势开发实战:从基础交互到高级组合逻辑(2026版)

在移动生态中,手势(Gesture)​ 是连接用户意图与应用反馈的核心桥梁。鸿蒙系统通过 ArkUI 框架提供了从基础点击到复杂多指触控的完整手势解决方案。本文将深入剖析鸿蒙手势系统的底层机制,并提供生产环境可用的高级实战代码。 本…...

拯救者工具箱终极指南:5MB轻量工具如何提升30%性能并延长40%续航

拯救者工具箱终极指南:5MB轻量工具如何提升30%性能并延长40%续航 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit …...

软件工具管理化的选型配置与维护

软件工具管理化的选型配置与维护 在数字化转型的浪潮中,软件工具已成为企业高效运营的核心支撑。面对市场上琳琅满目的工具,如何科学选型、合理配置并持续维护,成为许多团队面临的挑战。软件工具管理化不仅关乎成本控制,更直接影…...

告别内存拷贝:手把手带你理解DMA、链式DMA与RDMA的底层逻辑(附Linux内核函数解析)

从物理内存到PCIe域:深度解析Linux内核中的DMA技术实现路径 在Linux内核开发领域,DMA(直接内存访问)技术一直是提升I/O性能的核心手段。当我们需要为自定义PCIe设备编写高性能驱动时,理解DMA如何在内核中实际运作变得…...

当Qt Creator 11遇上Copilot:一个C++老鸟的AI结对编程初体验与效率对比

当Qt Creator 11遇上Copilot:一个C老鸟的AI结对编程初体验与效率对比 作为深耕Qt/C领域十余年的开发者,我经历过从手动编写信号槽到IDE智能补全的进化,但GitHub Copilot的出现彻底重构了我对编程效率的认知。本文将分享在真实商业项目&#x…...

无损剪辑大师:5分钟掌握LosslessCut视频处理核心技巧

无损剪辑大师:5分钟掌握LosslessCut视频处理核心技巧 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 还在为视频剪辑后画质下降而烦恼吗?Lossl…...

从CentOS7到Go 1.19.4:一条yum命令背后的源配置原理与版本选择实战

从CentOS7到Go 1.19.4:深入解析yum源配置与版本选择策略 当技术团队需要在CentOS7系统上部署Go语言环境时,直接执行yum install golang往往会遭遇"没有可用包"的报错。这背后隐藏着Linux包管理系统的复杂机制和版本选择的艺术。本文将带您穿透…...

软件无服务器化的计算抽象与事件驱动

软件无服务器化的计算抽象与事件驱动 在云计算技术快速发展的今天,软件无服务器化(Serverless)已成为一种革命性的计算范式。它通过抽象底层基础设施,让开发者专注于业务逻辑,而无需管理服务器资源。事件驱动架构&…...

AI核心知识136—大语言模型之 自我蒸馏(简洁且通俗易懂版)

Self-Distillation (自我蒸馏) 是 AI 训练领域里一门非常神奇的武功,用一句最通俗的中国互联网黑话来解释,它就像是武侠小说里的“左脚踩右脚上天” 。如果说我们之前聊的 SFT 和 RLHF 是“人类老师手把手教 AI”,那么 Self-Distillation 就是…...

Mac微信防撤回神器:3分钟安装,重要消息永久保存

Mac微信防撤回神器:3分钟安装,重要消息永久保存 【免费下载链接】WeChatIntercept 微信防撤回插件,一键安装,仅MAC可用,支持v3.7.0微信 项目地址: https://gitcode.com/gh_mirrors/we/WeChatIntercept 你是否曾…...

Ubuntu 22.04编译Linux 5.16.5内核,遇到BTF报错别慌,试试这个pahole版本降级脚本

Ubuntu 22.04编译Linux 5.16.5内核的BTF报错深度解决方案 最近在Ubuntu 22.04上编译Linux 5.16.5内核时,不少开发者遇到了一个棘手的BTF报错问题。这个错误不仅会中断编译过程,更让人困扰的是它影响了eBPF相关功能的正常使用。本文将深入分析问题根源&am…...

无损视频剪辑解决方案:基于FFmpeg智能封装的核心架构

无损视频剪辑解决方案:基于FFmpeg智能封装的核心架构 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut LosslessCut是一款基于FFmpeg的无损音视频编辑工具&a…...

本体论不知道在哪用?怎么用?一篇说清楚

有读者问:这个东西到底在什么情况下最有用?我手头的项目值不值得用?今天就来回答这个问题。我把本体论真正派得上用场的场景归纳成六种典型情况,每个都配了具体例子,你可以对照着看看自己遇到的是不是这类问题。场景一…...

中药湿疹膏

看着宝宝娇嫩的皮肤上泛起一片片红疹,因瘙痒而哭闹不休、夜不能寐,初为父母的你,是否感到心急如焚却又束手无策?湿疹,这个困扰着无数0-3岁婴幼儿家庭的常见皮肤问题,背后是家长们深深的焦虑与对安全有效产品…...

2026 江西 GEO 优化服务商实测榜单与企业选型实操指南

随着生成式 AI 对商业流量格局的重构,GEO(生成式引擎优化)已成为江西企业抢占本地流量、实现全域拓客的核心抓手。艾瑞咨询《2026 GEO 行业发展白皮书》显示,江西 GEO 优化市场近三年复合增速高达 28.7%,远超全国平均水…...

贪吃蛇(python版)

安装依赖 pip install pygame完整代码 import pygame import random import sys# 初始化pygame pygame.init()# 游戏配置 WINDOW_WIDTH 800 WINDOW_HEIGHT 600 CELL_SIZE 20 CELL_NUMBER_X WINDOW_WIDTH // CELL_SIZE CELL_NUMBER_Y WINDOW_HEIGHT // CELL_SIZE# 颜色定义…...

小飞手俱乐部招聘平台 中小企业免费招聘软件直连人才

在国内市场主体中,中小企业是最具活力的组成部分,而人才招聘,始终是制约中小企业稳步发展的核心痛点。预算有限、招聘频次灵活、用人需求急、没有专职 HR 团队,是绝大多数中小企业的招聘常态,也让无数企业管理者和负责…...

TensorRT安装后验证的几种实用方法:从sample_mnist到PyTorch/TensorFlow模型

TensorRT环境验证全指南:从基础测试到多框架实战 当你完成TensorRT的安装后,最迫切的问题往往是:"我的环境真的装对了吗?"作为NVIDIA推出的高性能深度学习推理引擎,TensorRT的安装验证远比简单的版本检查复杂…...

别怕概率论!用Python的NumPy和SciPy库,帮你一步步验算期末试卷里的12道填空题

用Python玩转概率论:NumPySciPy实战12道经典填空题 当概率论遇上Python,枯燥的公式瞬间变得生动起来。本文不是简单地教你解题,而是带你用代码「实验」概率,让每个数学概念都变成可运行的代码块。我们将从零开始,用Pyt…...

从随便用到查户口:AI圈的实名暴政,程序员炸了

这两天Anthropic的Claude实名认证风波席卷AI圈,引发全球用户群体的强烈不满和抗议。这一政策变化在科技社区、社交媒体平台上迅速发酵,形成了"全球集体众怒"的舆论风暴。 作为一个写了几十年代码、摸遍国内外AI工具的老程序员,我是…...

YOLOv8性能跃迁:集成可变形注意力机制DAttention的实战指南

1. 为什么YOLOv8需要可变形注意力机制? 目标检测领域近年来最令人头疼的问题之一,就是模型在复杂场景下的表现不稳定。我在实际项目中遇到过这样的情况:同一个检测模型,在空旷场景下mAP能达到85%,但在人群密集的商场监…...

逆向糖豆视频:从动态加载到防盗链破解的实战解析

1. 糖豆视频逆向分析的核心挑战 第一次尝试爬取糖豆视频时,我遇到了几个让人头疼的问题。最明显的就是视频只能播放5秒就中断,这其实是典型的防盗链机制在起作用。糖豆视频采用了动态加载技术,真实视频地址隐藏在层层接口之后,需要…...

5步掌握DoL-Lyra整合包:从零构建个性化游戏体验的完整指南

5步掌握DoL-Lyra整合包:从零构建个性化游戏体验的完整指南 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS Degrees of Lewdity中文模组整合包(DOL-CHS-MODS)是一个…...

告别触摸漂移!手把手教你用tslib校准嵌入式Linux触摸屏(基于Buildroot)

告别触摸漂移!手把手教你用tslib校准嵌入式Linux触摸屏(基于Buildroot) 电阻屏在工业控制、医疗设备等嵌入式场景中依然占据重要地位,但开发者常被一个"幽灵问题"困扰——明明点击了A位置,系统却响应在B位置…...

用ILA抓波形:手把手教你调试XC7K325T的XDMA AXI总线读写时序

用ILA抓波形:深入解析XC7K325T的XDMA AXI总线调试实战 在FPGA开发中,AXI总线协议作为Xilinx系列芯片的核心互联标准,其稳定性和正确性直接决定了系统性能。而XDMA(Xilinx DMA)IP作为PCIe与AXI总线之间的桥梁&#xff0…...

Adobe-GenP终极指南:如何免费解锁Adobe全家桶完整功能?

Adobe-GenP终极指南:如何免费解锁Adobe全家桶完整功能? 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe Creative Cloud系列软件以其强…...

10分钟深度解析:FigmaCN如何实现专业级界面本地化

10分钟深度解析:FigmaCN如何实现专业级界面本地化 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 对于中文设计师来说,Figma英文界面常常是工作效率的隐形障碍。…...