【6.19】Verilog 小白零基础入门保姆教程

【6.19】Verilog 小白零基础入门保姆教程
前言解决90%新手的核心困惑很多刚学Verilog的小伙伴都会遇到同一个难题代码单词看得懂每一行是干嘛的完全不知道运行结果摸不着头脑知识点杂乱看不懂。根本原因只有一个你在用C语言软件思维学Verilog硬件语言。我们熟悉的STM32、51单片机C语言是串行顺序执行CPU按代码一行行跑而Verilog是并行硬件描述语言代码写完不是给CPU跑的指令是直接搭建一套真实的硬件电路所有模块同时工作。这篇博客专门为纯小白打造不讲晦涩理论全程通俗比喻、逐行拆解代码、讲清每一步运行过程和结果帮你从零入门Verilog。一、核心认知FPGA与单片机的本质区别入门必看想要学好Verilog第一步必须扭转思维搞懂软硬件的核心差异。1.1 单片机MCU/STM32—— 现成房子工人干活单片机的硬件是固定死的出厂是什么结构就是什么结构。C语言代码相当于指挥CPU工人按顺序一步步做事跑完上一行才会执行下一行属于串行执行。局限性只能修改执行步骤无法更改硬件结构。1.2 FPGA —— 一堆空白乐高积木FPGA内部是大量可自由组合的逻辑单元没有固定电路结构。Verilog代码相当于拼乐高、搭电路代码综合后会直接生成硬件电路所有电路模块、逻辑门同时并行工作。优势硬件结构由你定义想搭与门、计数器、加法器都可以灵活实现。一句话总结C语言是「软件指令顺序执行」Verilog是「硬件连线并行运行」。二、Verilog最小单元Module模块所有代码的根基任何Verilog代码都必须包裹在module和endmodule之间它是Verilog的最小独立单元。通俗理解module 一块独立的芯片有输入输出引脚内部是你搭建的硬件电路。2.1 三大核心引脚定义input wire芯片输入引脚外部信号通过导线流入模块wire是纯物理导线只传信号、不存数据。output wire芯片输出引脚模块内部电路处理后的信号向外输出。2.2 零基础完整模板逐行注释// 定义一个名为and_gate的与门硬件模块 module and_gate ( input wire a, // 输入引脚a外部输入0/1信号 input wire b, // 输入引脚b第二路外部输入信号 output wire y // 输出引脚y电路最终结果输出 ); // 硬件电路逻辑搭建与门电路永久绑定信号关系 assign y a b; endmodule2.3 C语言 vs Verilog 核心对比对比维度C语言Verilog Module程序入口main() 函数module 硬件模块数据载体内存变量可存储数据wire导线仅传信号、reg寄存器存数据编译结果CPU执行指令硬件逻辑电路运行方式串行顺序执行全局并行运行三、六大核心关键词小白必背零基础吃透这6个关键词是Verilog所有代码的基础搞懂它们就能看懂80%的基础代码全程人话解读无晦涩术语。关键词通俗解释硬件本质实操示例module定义一块独立硬件模块封装好的电路单元module add(...)搭建加法器电路input模块外部信号输入引脚电路板输入焊盘input wire clk时钟信号输入output模块信号对外输出引脚电路板输出焊盘output wire led控制LED输出wire纯导线只传信号、无记忆电路板铜线wire mid;电路中间连接线reg寄存器可存储0/1数据有记忆D触发器存储单元reg q;保存时钟触发的数据assign永久连线赋值实时联动硬件固定飞线assign yab;实时运算与门重点Wire 和 Reg 终极区分新手最大误区Wire纯导线无记忆、不存数据输入变输出立刻变只能用assign驱动。Reg带记忆的触发器平时数据保持不变只有时钟触发时才更新数据。四、核心重难点组合逻辑 vs 时序逻辑所有Verilog代码只分为这两种逻辑彻底搞懂就能打通所有代码逻辑。4.1 组合逻辑无时钟、无记忆、实时响应核心特点输出只由当前输入决定和历史状态无关不需要时钟输入变、输出立刻变。固定写法assign wire 阻塞赋值代码示例逐行拆解wire y; // 定义一根输出导线 assign y a b;// 永久连线y永远等于a、b的与运算结果运行过程与结果硬件生成一个独立的与门电路实时运算规则a0b0 → y0a0b1 → y0a1b1 → y1核心属性无延迟、无记忆全程实时联动4.2 时序逻辑有时钟、有记忆、边沿更新核心特点依赖时钟信号自带记忆功能不会随输入实时变化只有时钟上升沿瞬间才更新数据。固定写法always (posedge clk) reg 非阻塞赋值代码示例逐行拆解reg q; // 定义寄存器用于存储数据 always (posedge clk)// 敏感列表仅时钟上升沿0跳1瞬间触发 q d; // 时钟到来时将d的值存入q保存运行过程与结果时钟未触发时无论输入d怎么变化q的值保持不变锁住历史数据时钟上升沿瞬间瞬间抓取d的当前值更新保存到q中硬件生成D触发器存储电路具备记忆功能极简记忆口诀assign 对应组合逻辑实时连线无记忆always时钟块对应时序逻辑边沿触发存数据。五、新手必踩坑赋值符号 和 区别90%新手报错、仿真结果异常都是因为赋值符号用错直接记死规则即可无需深究原理。5.1 固定使用规则万能准则组合逻辑 assign 中只用 阻塞赋值时序逻辑 always 时钟块中只用 非阻塞赋值5.2 正确与错误示范// 正确组合逻辑使用 assign y a b; // 正确时序逻辑使用 always (posedge clk) begin q d; end // 错误时序块禁止用会导致时序错乱、仿真出错 always (posedge clk) begin q d; end5.3 人话通俗解释 阻塞赋值立即同步更新适合纯导线连线的实时逻辑 非阻塞赋值所有信号统一在时钟边沿同步更新避免硬件电路互相干扰六、高频运算符讲解含C语言差异对比Verilog运算符看似和C语言一样但硬件行为完全不同新手极易混淆。6.1 按位运算符硬件高频使用 按位与、| 按位或、^ 按位异或、~ 按位取反规则对二进制每一位单独运算示例3b101 3b011 3b0016.2 逻辑运算符和C语言一致 逻辑与、|| 逻辑或、! 逻辑非规则只判断整体真假多用于条件判断6.3 独有运算符拼接 {}C语言无此运算符作用是拼接多组二进制数据示例{3b101,2b11}拆解3位二进制101 2位二进制11拼接结果为5位二进制101116.4 核心本质差异C语言abCPU复用同一个加法器分时软件计算Verilogab直接生成一个全新的硬件加法器全程并行工作七、完整可运行实战案例串联所有知识点需求搭建带时钟寄存的与门电路实时计算a、b与运算结果仅在时钟上升沿保存并输出结果。module test_demo( input wire clk, // 时钟输入 input wire a, // 输入信号a input wire b, // 输入信号b output reg q_out // 寄存器输出存储结果 ); // 1. 组合逻辑实时计算a、b与运算 wire mid_and; assign mid_and a b; // 2. 时序逻辑时钟边沿保存结果 always (posedge clk) begin q_out mid_and; end endmodule全程运行流程详解上电后组合逻辑持续工作mid_and 随a、b实时变化无延迟时钟无上升沿时q_out 锁住原有数据不会跟随输入变化时钟0→1上升沿瞬间抓取当前mid_and的值更新保存到q_out最终硬件与门电路 D触发器电路双模块全程并行工作。八、小白入门终极避坑总结看完这篇彻底告别Verilog入门迷茫记住这4条核心准则即可思维转变放弃C语言顺序执行思维牢记Verilog是硬件并行电路。信号区分单纯连线用wire需要存储数据、时钟更新用reg。逻辑区分实时无记忆用assign组合逻辑时钟记忆更新用always时序逻辑。赋值规则assign只用时钟always块只用绝不混用。