【6.19】知识点清单逐点解答
一、四步学习知识点第 1 步 核心概念问答面向 C 语言、硬件零基础1. wire 和 reg 有什么区别各用在什么场景本质硬件对应wire对应硬件导线物理上就是连接线只能持续传递信号无存储能力reg对应寄存器 / 触发器存储单元能锁存、保存上一拍的数值有记忆功能。赋值规则wire只能用连续赋值assign 变量 表达式不能在always块内赋值reg只能在always / initial过程块内赋值使用阻塞或非阻塞赋值不能用 assign。使用场景wire模块端口、模块内部连线、组合逻辑中间信号线reg时序逻辑触发器输出、always 块内临时存储变量。2. assign 和 always (posedge clk) 有什么区别assign纯组合逻辑硬件对应纯导线、门电路输入一变输出立刻同步变化无时钟、无存储实时连续运算任何时刻输入更新输出马上更新。always (posedge clk)时序逻辑硬件对应D 触发器只有时钟上升沿到来瞬间才会更新输出其余时间输出保持不变具备数据锁存记忆能力。3. 为什么 Verilog 是在 “画电路” 而不是 “写程序”C 语言是顺序执行软件指令CPU 按行逐条串行跑同一时间只执行一行代码 Verilog 是硬件描述语言 HDL所有代码对应真实硬件电路所有电路并行同时工作代码只是描述电路结构 / 连接关系不是执行顺序指令。 比如同时写 3 个 assign硬件里 3 组门电路会同时运算不存在先后执行。第 2 步 3 道基础练习题完整代码 电路解释1. 二输入与门assign 组合逻辑module and2( input a, b, output wire y ); assign y a b; endmodule电路生成一个 2 输入与门a、b 两根导线接入与门输入端输出导线 y 实时输出两者相与结果输入任意一个变化y 立刻更新。2. D 触发器always 时序逻辑module dff( input clk, d, output reg q ); always (posedge clk) begin q d; end endmodule电路生成标准上升沿 D 触发器只有 clk 上升沿瞬间才会把 d 当前值存入寄存器 q其余时刻 q 保持原值不变。3. 4 位加法器assign 组合逻辑module add4( input [3:0] a, b, output wire [3:0] sum, output wire cout ); assign {cout, sum} a b; endmodule电路生成 4 位全加器级联电路4 组加法单元并行运算{cout,sum}拼接进位 4 位和输入 a/b 改变时加法结果立刻更新。第 3 步 代码修改拓展导师自查修改点与门改或门assign y a | b;电路替换为 2 输入或门D 触发器改带复位新增input rst_n敏感列表加入 rst复位时 q 置 0always (posedge clk or negedge rst_n) begin if(!rst_n) q 1b0; else q d; end4 位加法器改减法器assign {borrow, diff} a - b;生成 4 位减法器输出借位 差值。第 4 步 Verilog 对比 C 语言为什么 FPGA/ASIC 比 MCU C 代码快核心并行 vs 顺序C 语言MCU串行顺序执行MCU 只有 1 个 CPU 内核代码逐行串行执行同一时刻只能运算一条指令复杂运算需要分多周期分步完成速度受 CPU 主频、指令周期限制。Verilog硬件电路全并行执行Verilog 综合后生成真实硬件电路所有门、加法器、触发器同一时钟周期同时并行运算。 举例4 位加法C 要循环分步相加Verilog 直接 4 个加法单元同时计算1 个周期出结果天然高吞吐、低延迟。二、课后 4 道练习题标准答案1. assign 实现 3 输入与门 y a b cmodule and3( input a,b,c, output wire y ); assign y a b c; endmodule电路3 输入与门三根输入导线实时相与输出持续更新。2.always (posedge clk) q d;无 clk 上升沿时 q 变不变不会变posedge clk代表敏感事件只有时钟上升沿只有检测到时钟上升沿才会执行qd赋值其余所有时刻触发器锁存原有数值q 保持不变。 和 C 赋值区别C 赋值执行后变量立刻更新Verilog 时序赋值只在指定触发事件发生时才更新。3. wire 和 reg 使用场景总结wire模块输入 / 输出端口、模块内部连接导线仅用于assign连续赋值描述纯组合逻辑连线。regalways / initial过程块内定义变量时序逻辑触发器输出、过程块内临时存储信号具备锁存能力。4. 代码问题always 块内使用阻塞赋值q d;always (posedge clk) q d; // 错误写法时序逻辑禁止用阻塞赋值问题原因阻塞赋值执行时会立刻更新变量会综合出锁存器 / 错误组合逻辑破坏触发器时序行为非阻塞赋值所有右端表达式统一在时钟沿采样所有赋值同时更新精准对应硬件 D 触发器行为是时序逻辑标准写法。核心规则组合逻辑 always 块用阻塞赋值时序逻辑带时钟沿always 块必须用非阻塞赋值。三、核心概念速记总结wire 导线reg 寄存器assign 并行组合逻辑posedge clk 时序触发器Verilog 并行硬件C 串行软件这是速度、语法差异根源时序逻辑时钟块统一用组合逻辑 assign/always 用敏感列表决定电路什么时候更新信号仅触发事件到来才执行赋值。