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

别再死记硬背了!用这3个真实电路例子,彻底搞懂Verilog里的always、case和assign

用3个实战电路打通Verilog核心语法任督二脉刚接触Verilog的工程师常陷入一个怪圈语法规则背得滚瓜烂熟真到写代码时却无从下手。这就像背熟了菜谱却从不下厨——永远尝不到数字电路这盘菜的真实味道。今天我们用三个工业级实用电路带你看懂always、case和assign如何在实际设计中各司其职。1. 状态机设计always块的时空法则在FPGA开发中状态机堪称万能胶水。我们以智能家居中常见的窗帘控制器为例需要根据光照强度和用户指令在开启、关闭、暂停三种状态间切换。先看核心代码框架module curtain_controller( input clk, input rst_n, input [7:0] light_sensor, input manual_open, input manual_close, output reg motor_dir ); // 状态编码 localparam CLOSED 2b00; localparam OPENING 2b01; localparam CLOSING 2b10; reg [1:0] current_state, next_state; // 时序逻辑always块 always (posedge clk or negedge rst_n) begin if(!rst_n) current_state CLOSED; else current_state next_state; end // 组合逻辑always块 always (*) begin case(current_state) CLOSED: next_state (light_sensor 150 || manual_open) ? OPENING : CLOSED; OPENING: begin motor_dir 1b1; next_state manual_close ? CLOSING : (light_sensor 50) ? CLOSED : OPENING; end CLOSING: begin motor_dir 1b0; next_state manual_open ? OPENING : CLOSED; end endcase end endmodule这个案例揭示了always块的两个关键特性时钟驱动型时序逻辑使用posedge clk触发必须用非阻塞赋值对应硬件D触发器组电平敏感型组合逻辑使用(*)敏感列表必须用阻塞赋值对应硬件门电路组合实际调试中发现如果在组合逻辑always块中误用非阻塞赋值会导致仿真通过但实际电路出现竞争冒险。这是新手最易踩的坑之一。状态机设计时建议遵循这个黄金结构明确状态编码二进制/独热码用时序always块更新当前状态用组合always块计算次态和输出所有条件分支必须完备加default2. PWM呼吸灯assign的硬件直连哲学呼吸灯效果看似简单却是理解连续赋值语句assign的绝佳案例。不同于always块的过程赋值assign语句直接描述了信号间的静态连接关系。我们实现一个可调占空比的PWM发生器module pwm_breath( input clk, input rst_n, output led ); reg [15:0] counter; reg [15:0] duty_cycle; reg direction; // 计数器always块 always (posedge clk or negedge rst_n) begin if(!rst_n) begin counter 16d0; duty_cycle 16d0; direction 1b0; end else begin counter counter 1; // 呼吸效果控制 if(counter 16hFFFF) begin if(direction) duty_cycle duty_cycle - 100; else duty_cycle duty_cycle 100; if(duty_cycle 16hFF00) direction 1b1; else if(duty_cycle 16h0100) direction 1b0; end end end // 关键assign语句 assign led (counter duty_cycle) ? 1b1 : 1b0; endmoduleassign语句在这里展现了三大优势实时性比较器输出立即反映到led无时钟延迟简洁性一行代码替代整个always块方向性只能从右向左赋值符合硬件数据流特点与always块对比的选型原则特性assign语句always块执行时机输入变化立即更新时钟沿/敏感列表触发适用逻辑纯组合逻辑组合/时序逻辑均可可综合性完全可综合需注意阻塞/非阻塞代码量简洁相对冗长实际工程中像数据选择器、简单逻辑运算这类场景优先考虑assign语句。但在需要条件分支或复杂运算时always块更合适。3. 按键消抖模块case语句的状态解码术机械按键的抖动问题堪称数字电路设计的第一课。我们用case语句实现一个带状态记录的智能消抖模块支持单击、双击和长按识别module key_debounce( input clk, input key_in, output reg key_press, output reg key_double, output reg key_long ); // 状态定义 localparam IDLE 3d0; localparam PRESS_DOWN 3d1; localparam DEBOUNCE 3d2; localparam RELEASE_WAIT 3d3; localparam DOUBLE_CHECK 3d4; reg [2:0] state; reg [19:0] counter; reg key_reg; always (posedge clk) begin key_reg key_in; // 同步打拍 case(state) IDLE: begin key_press 1b0; key_double 1b0; key_long 1b0; if(!key_reg) begin state PRESS_DOWN; counter 20d0; end end PRESS_DOWN: begin if(counter 20d100_000) // 10ms消抖 counter counter 1; else begin if(!key_reg) begin state DEBOUNCE; counter 20d0; end else state IDLE; end end DEBOUNCE: begin if(key_reg) begin state RELEASE_WAIT; counter 20d0; key_press 1b1; end else if(counter 20d5_000_000) begin // 500ms长按 state IDLE; key_long 1b1; end else counter counter 1; end RELEASE_WAIT: begin key_press 1b0; if(counter 20d300_000) begin // 30ms内检测第二次按下 counter counter 1; if(!key_reg) begin state DOUBLE_CHECK; counter 20d0; end end else begin state IDLE; end end DOUBLE_CHECK: begin if(counter 20d100_000) begin counter counter 1; if(key_reg counter 20d50_000) begin state IDLE; key_double 1b1; end end else state IDLE; end endcase end endmodule这个案例展示了case语句的三大实战技巧状态编码艺术使用localparam定义语义化状态名状态转移条件明确写在每个case分支default分支处理异常情况时序控制诀窍每个状态内用counter实现超时机制关键时间点如10ms消抖通过计数器值判断输出控制策略脉冲信号key_press只在特定状态产生保持信号key_long需要持续判断在复杂状态机中case语句相比if-else具有明显优势可读性更强状态转移一目了然综合后电路结构更规整便于添加新状态而不影响原有逻辑4. 语法元素组合实战智能温控系统现在我们把always、case和assign组合使用设计一个完整的智能温控系统。该系统需要通过PWM控制风扇转速根据温度阈值自动调节支持手动模式覆盖module temp_control( input clk, input rst_n, input [7:0] temp_data, input manual_mode, input [1:0] manual_speed, output fan_pwm ); // 温度区间定义 localparam COOL 2b00; localparam MILD 2b01; localparam WARM 2b10; localparam HOT 2b11; reg [1:0] temp_state; reg [7:0] pwm_duty; wire [1:0] speed_level; // 温度状态判断always块 always (posedge clk or negedge rst_n) begin if(!rst_n) temp_state COOL; else begin case(temp_data) 8d00..8d25: temp_state COOL; 8d26..8d35: temp_state MILD; 8d36..8d45: temp_state WARM; default: temp_state HOT; endcase end end // 速度等级assign语句 assign speed_level manual_mode ? manual_speed : (temp_state HOT) ? 2b11 : (temp_state WARM) ? 2b10 : (temp_state MILD) ? 2b01 : 2b00; // PWM生成always块 always (posedge clk or negedge rst_n) begin if(!rst_n) pwm_duty 8d0; else begin case(speed_level) 2b00: pwm_duty 8d0; // 停转 2b01: pwm_duty 8d85; // 33% 2b10: pwm_duty 8d170; // 66% 2b11: pwm_duty 8d255; // 100% endcase end end // PWM输出assign语句 assign fan_pwm (pwm_counter pwm_duty) ? 1b1 : 1b0; endmodule这个综合案例展示了Verilog三大语法的默契配合always块负责时序敏感的操作温度状态寄存器更新PWM占空比寄存器更新case语句处理多路分支温度区间划分速度等级映射assign语句实现即时转换手动/自动模式选择PWM比较输出在真实的FPGA项目中这种组合使用模式几乎无处不在。掌握它们的配合要领就能写出既高效又易维护的硬件描述代码。

相关文章:

别再死记硬背了!用这3个真实电路例子,彻底搞懂Verilog里的always、case和assign

用3个实战电路打通Verilog核心语法任督二脉 刚接触Verilog的工程师常陷入一个怪圈:语法规则背得滚瓜烂熟,真到写代码时却无从下手。这就像背熟了菜谱却从不下厨——永远尝不到"数字电路"这盘菜的真实味道。今天我们用三个工业级实用电路&#…...

tidal-cli:用命令行与AI智能体自动化管理Tidal音乐流媒体

1. 项目概述:当终端遇上流媒体音乐如果你和我一样,是个重度命令行用户,同时又对音乐流媒体服务有深度依赖,那你肯定经历过这种割裂感:想快速搜首歌、建个播放列表,或者只是看看某个乐队的全部专辑&#xff…...

神经网络分类

神经网络分类:从架构到应用的全景解析 神经网络作为人工智能领域的核心技术,经历了从简单感知器到深度学习模型的跨越式发展。随着计算能力的提升和应用场景的拓展,神经网络已发展出多种架构类型,针对不同数据结构、学习方式和任务需求提供最优解决方案。本文将系统梳理神…...

中文AI智能体开发实战:基于Awesome资源库构建企业知识问答系统

1. 项目概述与核心价值最近在GitHub上闲逛,又发现了一个宝藏仓库,名字叫“awesome-chinese-ai-agents”。看到这个标题,我的第一反应是:终于有人系统性地整理中文AI智能体相关的资源了。作为一个在AI应用开发领域摸爬滚打多年的从…...

K8s调度器说内存不足?教你用一条kubectl命令看清‘资源账本’

K8s调度器说内存不足?教你用一条kubectl命令看清‘资源账本’ 当Kubernetes调度器报出"内存不足"错误时,很多工程师的第一反应是查看节点实际内存使用量,却忽略了调度器真正关心的是申明式资源请求(Requests&#xff09…...

别再手动查维基了!用Python的wikipedia-api库,5行代码批量抓取并分析词条数据

用Python玩转维基百科:从批量抓取到智能分析的完整指南 维基百科作为全球最大的知识库,蕴藏着海量结构化信息。但手动查阅和整理这些数据既低效又容易出错。想象一下,当你需要研究"机器学习"领域的所有相关概念时,传统方…...

APM飞控参数调校避坑指南:从悬停不稳到航线丝滑,这20个参数是关键

APM飞控参数调校避坑指南:从悬停不稳到航线丝滑,这20个参数是关键 当你的多旋翼无人机在悬停时像喝醉了一样左右摇摆,或是执行航线任务时轨迹像蚯蚓爬行般扭曲,问题往往出在飞控参数的调校上。APM/Pixhawk作为开源飞控的标杆&…...

手把手教你用OpenCV方框滤波(cv2.boxFilter)给图像‘美白’?聊聊归一化踩坑与图像变白的原因

从图像变白现象解密OpenCV方框滤波的核心机制 那天下午,我正在调试一个图像处理脚本,突然发现所有输出都变成了刺眼的纯白色。反复检查代码逻辑后,最终锁定问题出在cv2.boxFilter的一个参数设置上——normalize0。这个看似简单的布尔值开关&…...

从泊车辅助到车道线检测:聊聊IPM鸟瞰图在ADAS里的那些‘坑’与最佳实践

从泊车辅助到车道线检测:IPM鸟瞰图在ADAS中的工程化挑战与解决方案 当你在停车场使用自动泊车功能时,车辆是如何"看见"那些看不见的车位线的?这背后离不开一项关键技术——逆透视变换(IPM)。但现实世界远比教…...

如何零门槛掌握浏览器资源嗅探?猫抓Cat-Catch工具深度解析

如何零门槛掌握浏览器资源嗅探?猫抓Cat-Catch工具深度解析 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾经遇到过这样的情况…...

5步快速上手DeepLabV3Plus:从零开始的语义分割实战教程

5步快速上手DeepLabV3Plus:从零开始的语义分割实战教程 【免费下载链接】DeepLabV3Plus-Pytorch Pretrained DeepLabv3 and DeepLabv3 for Pascal VOC & Cityscapes 项目地址: https://gitcode.com/gh_mirrors/de/DeepLabV3Plus-Pytorch 你是否想快速掌握…...

工业物联网网关:Waveshare CM4-IO-POE-4G-Box全解析

1. 工业物联网新选择:Waveshare CM4-IO-POE-4G-Box深度解析 在工业物联网(IIoT)领域,设备的稳定性、接口丰富性和环境适应性往往是项目成败的关键。Waveshare最新推出的CM4-IO-POE-4G-Box正是针对这些需求而设计的完整解决方案。作…...

JupyterLab Desktop 终极指南:从零开始掌握数据科学桌面神器 [特殊字符]

JupyterLab Desktop 终极指南:从零开始掌握数据科学桌面神器 🚀 【免费下载链接】jupyterlab-desktop JupyterLab desktop application, based on Electron. 项目地址: https://gitcode.com/gh_mirrors/ju/jupyterlab-desktop 想要在本地轻松运行…...

Cursor Pro破解工具完整指南:3步实现永久免费AI编程

Cursor Pro破解工具完整指南:3步实现永久免费AI编程 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial…...

智能超表面(FIM)在6G通信中的物理层革新

1. 智能超表面技术概述:6G通信的物理层革新在移动通信技术从5G向6G演进的过程中,智能超表面(Flexible Intelligent Metasurface, FIM)正成为最具突破性的物理层技术之一。与传统的刚性天线阵列(Rigid Antenna Array, RAA)不同,FIM由可编程的电…...

2026 数字孪生前沿科技:全景迭代报告 —— 镜像视界生成式孪生(Generative DT)技术白皮书

2026 数字孪生前沿科技:全景迭代报告 —— 镜像视界生成式孪生(Generative DT)技术白皮书文档信息版本:V1.0(2026 年 4 月)定位:行业前沿技术白皮书・战略级关键词:生成式孪生、Gene…...

GitHub任务可视化:基于Chrome扩展的AI任务管理集成方案

1. 项目概述:一个让GitHub任务管理可视化的Chrome插件如果你和我一样,日常开发工作流重度依赖GitHub,同时又在尝试用AI辅助工具(比如基于Claude的claude-task-master)来拆解和管理项目任务,那你可能遇到过和…...

手把手教你用RobotStudio和西门子1200 PLC玩转Modbus TCP虚拟调试(附完整RAPID代码)

虚拟调试实战:RobotStudio与西门子S7-1200的Modbus TCP全流程解析 在工业自动化领域,虚拟调试技术正以惊人的速度改变着传统工程实施方式。想象一下,在咖啡厅用笔记本电脑就能完成机器人产线的通讯测试——这正是RobotStudio与TIA Portal仿真…...

CentOS7日志管理终极指南:从journalctl持久化配置到自动清理(防磁盘爆满)

CentOS7日志管理终极指南:从journalctl持久化配置到自动清理(防磁盘爆满) 当服务器运行数月后突然告警磁盘空间不足,80%的运维工程师首先会检查/var/log目录——这个看似不起眼的日志仓库往往隐藏着吞噬磁盘的"隐形杀手"…...

强化学习算法-:熵坍缩以及奖励坍缩问题机制分析及解决措施

1.安装环境准备 1.1.查看物理内存 [rootaiserver ~]# free -m 1.2.操作系统版本 [rootaiserver ~]# cat /etc/redhat-release 1.3.操作系统内存 [rootaiserver ~]# df -h /dev/shm/ 1.4.磁盘空间 [rootaiserver ~]# df -TH [rootaiserver ~]# df -h /tmp/ [rootaiserver ~]# d…...

分钟Mac本地跑通B wen!免费GPT-o替代,还能分钟造个会开浏览器+执行Shell的AI Agent

本文能帮你解决什么? 1. 搞懂FastAPI异步(async/await)到底在什么场景下能真正提升性能。 2. 掌握在FastAPI中正确使用多线程处理CPU密集型任务的方法。 3. 避开常见的坑(比如阻塞操作、数据库连接池耗尽、GIL限制)。 …...

3个核心功能+5步实战:PvZ Toolkit让你重新定义植物大战僵尸体验

3个核心功能5步实战:PvZ Toolkit让你重新定义植物大战僵尸体验 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 有没有想过,在植物大战僵尸这个经典游戏中,你不再…...

别再死记硬背了!用Python+Matplotlib动态可视化逻辑函数转换(真值表/卡诺图/波形图一键生成)

用Python动态可视化逻辑函数:从真值表到波形图的一站式解决方案 数字电路课程中那些抽象的逻辑函数概念,是否曾让你在深夜对着课本抓狂?当我第一次接触卡诺图时,那些密密麻麻的方格和看似随机的填1操作简直像天书。直到发现用Pyth…...

思源宋体CN终极指南:7种免费商用字体快速上手技巧

思源宋体CN终极指南:7种免费商用字体快速上手技巧 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为商业项目中文字体选择而烦恼吗?😟 担心字体…...

Skillpilot:一键集成AI编码技能,提升开发效率与代码安全

1. 项目概述:一键唤醒AI编码副驾驶 如果你和我一样,每天都在和Cursor、Claude Code、Windsurf这些新一代的AI编码工具打交道,那你肯定也遇到过这个痛点:面对一个具体的开发任务,比如“给我的Next.js项目加个用户认证”…...

PlantUML甘特图进阶玩法:自定义样式、关联JIRA任务、嵌入Confluence,打造可视化项目管理中心

PlantUML甘特图企业级实战:从可视化工具到项目管理中枢的蜕变之路 当团队规模超过20人、项目周期跨越季度时,静态的甘特图已经无法满足协作需求。上周我为一个跨国团队调试PlantUML工作流时发现,他们虽然每天更新JIRA任务,却要手动…...

NCM文件解密工具全面解析:轻松转换网易云音乐加密格式

NCM文件解密工具全面解析:轻松转换网易云音乐加密格式 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM文件无法在其他播放器使用而烦恼吗?ncmdump是一款实用的NCM文件解密工具&…...

告别依赖地狱:Win H + WSL CentOS 搭建 Synopsys EDA 工具链实践

一、语言特性:Java 26 与模式匹配进化 1.1 Java 26 语言级别支持 IDEA 2026.1 EAP 最引人注目的变化之一,就是新增 Java 26 语言级别支持。这意味着开发者可以提前体验和测试即将在 JDK 26 中正式发布的语言特性。 其中最重要的变化是对 JEP 530 的全…...

如何设计一个扛住千万级流量的系统?

前面我们对 Kafka 的整体架构和一些关键的概念有了一个基本的认知,本文主要介绍 Kafka 的一些配置参数。掌握这些参数的作用对我们的运维和调优工作还是非常有帮助的。 写在前面 Kafka 作为一个成熟的事件流平台,有非常多的配置参数。详细的参数列表可以…...

从‘消费者-订单’到‘汽车-驾驶员’:用Mermaid erDiagram讲好你的业务模型故事

业务模型可视化的艺术:用ER图讲好你的领域故事 在数字化转型的浪潮中,清晰表达业务逻辑的能力已成为技术团队的核心竞争力。我曾参与过一个汽车共享平台的项目,当开发团队用"用户-订单"这样的通用术语讨论时,业务方频频…...