精通VHDL与Verilog:编写整洁组合与时序逻辑
使用VHDL Process或Verilog Always块
VHDL中Process块与Verilog中Always块是描述硬件行为的核心构造。用于建模两类逻辑:
- 组合逻辑——输出仅依赖当前输入。
- 时序逻辑——输出依赖当前输入与过往状态,通常由时钟驱动。
教科书多演示简单组合示例,但实际设计几乎全靠时序块实现寄存器、状态机、流水线级。
为何D触发器关键
每个时序电路核心是D触发器,在时钟沿捕获存储单比特数据的最小元件。理解其时序与建立/保持约束是深入高级HDL代码前提。
不熟悉D触发器基础的读者请先复习基本操作。
Process/Always块中的组合逻辑
虽可用Process或Always块仅做组合赋值,但极少推荐。直接连续赋值更清晰不易错。
VHDL示例
process (input_1, input_2) begin and_gate <= input_1 and input_2; end process;
Verilog示例
always @ (input_1 or input_2) begin and_gate = input_1 & input_2; end
敏感度列表(如input_1, input_2)确保列表中任一信号变化即执行块。但同功能可用更简洁连续赋值表达:
-- VHDL and_gate <= input_1 and input_2;
// Verilog assign and_gate = input_1 & input_2;
二者效果等价,但连续赋值为纯组合逻辑首选。
时序逻辑:常见用例
Process(VHDL)与Always(Verilog)块在建模时钟驱动行为时大放异彩。典型模式含时钟与可选异步复位的敏感度列表:
VHDL时序示例
process (clk, rst_n) begin if rst_n = '0' then q <= '0'; elsif rising_edge(clk) then q <= d; end if; end process;
Verilog时序示例
always @(posedge clk or negedge rst_n) begin if (!rst_n) q <= 1'b0; else q <= d; end
这些片段展示HDL隐式例化D触发器。设计者应在信号需寄存或需维护状态时采用此模式。
最佳实践
- 纯组合逻辑用连续赋值。
- Process/Always块保留给需时钟沿或异步控制的时序逻辑。
- 始终包含清晰复位处理避免推断锁存器。
- 保持敏感度列表显式最小化防仿真不匹配。
遵循这些指南,您将编写既高效综合又易于验证的HDL。
VHDL