1. Verilog时序逻辑基础解析
时序逻辑是数字电路设计的核心概念,与组合逻辑最大的区别在于其输出不仅取决于当前输入,还与电路的历史状态相关。在Verilog中,我们主要通过always块和寄存器型变量(reg)来实现时序逻辑。
1.1 时序逻辑的基本特征
时序逻辑电路具有三个典型特征:
- 包含存储元件(通常是触发器)
- 具有反馈路径
- 输出与时钟信号同步
在Verilog中,最常用的时序逻辑建模方式是使用非阻塞赋值(<=)和边沿触发的always块。例如:
verilog复制always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
q <= 1'b0;
end
else begin
q <= d;
end
end
这段代码描述了一个典型的D触发器,它在时钟上升沿采样输入d的值,并在下一个时钟周期输出到q。注意这里使用了非阻塞赋值,这是时序逻辑建模的关键点。
重要提示:在时序逻辑中必须使用非阻塞赋值(<=),如果错误地使用阻塞赋值(=)会导致仿真结果与综合后硬件行为不一致。
1.2 时钟和复位设计规范
实际工程中,时钟和复位信号的处理有一些重要规范:
- 全局时钟信号通常命名为clk,低电平有效的复位信号命名为rst_n
- 复位信号应异步复位、同步释放
- 避免在设计中直接使用门控时钟
- 时钟信号必须来自专用时钟引脚或PLL输出
一个符合工业标准的复位处理示例如下:
verilog复制reg [1:0] rst_sync;
always @(posedge clk or negedge ext_rst_n) begin
if(!ext_rst_n) begin
rst_sync <= 2'b00;
end
else begin
rst_sync <= {rst_sync[0], 1'b1};
end
end
assign sys_rst_n = rst_sync[1];
这种设计确保了复位信号的同步释放,避免了亚稳态问题。
2. 典型时序逻辑电路实现
2.1 计数器设计
计数器是最基础的时序逻辑电路之一。下面是一个带使能和异步复位的4位计数器实现:
verilog复制module counter (
input clk,
input rst_n,
input en,
output reg [3:0] count
);
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
count <= 4'd0;
end
else if(en) begin
count <= count + 4'd1;
end
end
endmodule
实际工程中还需要考虑以下问题:
- 计数器溢出处理
- 同步加载功能
- 可配置计数上限
一个更完整的计数器实现如下:
verilog复制module adv_counter #(
parameter WIDTH = 8,
parameter MAX_VAL = 25
