在学习数字电路时,组合逻辑电路是一个重要的基础概念。组合逻辑电路的特点是其输出完全依赖于当前的输入信号,这意味着一旦输入发生变化,输出就会立即反映这一变化。然而,这种特性也导致了一个常见的问题——抖动。
抖动现象指的是输入信号在短时间内快速切换的状态,比如在一个按钮按下或松开时,电信号可能会因为接触不良而在高电平和低电平之间快速波动。这种快速变化会让组合逻辑电路产生误判,导致输出信号的不稳定,甚至出现错误结果。例如,假设我们设计了一个简单的灯光控制电路,如果输入信号抖动,灯光可能会闪烁,而不是保持稳定的状态。
为了有效解决抖动问题,我们引入了时序逻辑电路。与组合逻辑电路不同,时序逻辑电路的输出不仅依赖于当前的输入,还与之前的状态有关。这种电路的更新是由一个时钟信号控制的,通常是在时钟信号的上升沿(或者下降沿)读取输入。这意味着,在每个时钟周期结束时,电路才会根据输入信号的状态来更新输出。这样,即使输入信号在短时间内抖动,时序逻辑电路也能在稳定的时刻做出反应,从而有效避免错误。
例如,在一个计数器电路中,时钟信号的作用就像是一个节拍器,确保每次计数都是在一个固定的时刻进行,减少了由于输入抖动造成的误判。这种方式不仅提高了电路的可靠性,也为设计更复杂的数字系统打下了基础。
通过引入时序逻辑电路,我们可以更好地管理和控制信号的变化,确保输出稳定,减少由抖动带来的问题。
1、介绍
寄存器是计算机和数字电路中用于临时存储数据和控制信息的高速存储单元,它通过在每个时钟周期捕获并保持输入信号的值,确保数据的稳定性。寄存器有效对抗抖动的方式在于其时钟控制机制,只有在信号稳定时才更新数据,从而避免因输入信号的瞬时波动引起的错误输出,确保系统的可靠运行。
2、实战任务
用四个寄存器通过串联搭建一个四位环形计数器。
3、程序框图
根据实战任务可知,设计一个四位环形计数器电路,输入端口为 D,输出端口为 Q。该电路由 4 个触发器串联而成,每个触发器均需时钟信号和复位信号。因此,电路需包含一个时钟端口和一个复位端口,以便在时钟信号的控制下进行数据移位,并在复位信号有效时将所有触发器的输出清零。
4、波形图
根据模块框图以及寄存器功能可以画出该模块的波形,波形如下图所示:
5、程序编写
module register (
input sys_clk, // 系统时钟信号
input sys_rst_n, // 系统复位信号(低电平有效)
output reg [3:0] Q // 4 位输出
);
// 初始化寄存器
always @(posedge sys_clk) begin
if (!sys_rst_n)
Q <= 4'b0001; // 复位时设置第一个位为高
else
Q <= {Q[2:0], Q[3]}; // 将高位循环到低位
end
endmodule
2
3
4
5
6
7
8
9
10
11
12
13
14
15
程序注释:
第 1 - 5 行:根据系统框图的功能定义,两个输入信号,分别为系统时钟 和 系统复位 ,输出信号分别为四位宽的信号 Q ,用于寄存器内部循环使用。
第 8 - 13 行:这里出现了一个新的名词 posedge (是 "positive edge" 的缩写,指的是信号从低电平变为高电平的瞬间,也就是上升沿。)在系统时钟上升沿来领之际,进行数据位移。如果系统复位为低电平时,等待系统时钟上升沿来临后将输出 Q 重新赋值。
6、仿真编写
`timescale 1ns/1ns // 仿真单位/仿真精度
module register_mod();
//reg define
reg sys_clk; // 系统时钟信号
reg sys_rst_n; // 系统复位信号(低电平有效)
//wire define
wire [3:0] Q; // 4 位输出信号
always #10 sys_clk = ~sys_clk;
initial begin
sys_clk = 1'd0; // 初始化时钟为低电平
sys_rst_n = 1'd0; // 初始化复位信号为低电平(复位状态)
#200;
sys_rst_n = 1'd1; // 解除复位,使能寄存器
end
// 例化
register u_register (
.sys_clk (sys_clk), // 连接系统时钟信号
.sys_rst_n (sys_rst_n), // 连接系统复位信号
.Q (Q) // 连接输出信号
);
endmodule
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
程序注释:
第 5 - 10 行:根据系统框图的功能定义,重新定义使用的信号。
第 15 - 22 行:这里主要是将 系统时钟 和 系统复位初始了,最重要的一点就是 系统复位,这样就能避免 输出 Q 出生未知情况。
第 24 - 29 行:进行I/O绑定,例化。
8、工程创建
开始使用 Gowin 创建项目工程了,接着在 Gowin 的 Design 窗口空白地方右键点击选择 Add Files... 添加文件,分别创建所需的文件 register.v 和 register_mod.v,如下图所示:
添加完对应程序后,然后开始仿真,新建工程将 Project_Name 和 Default Library Name 都改成 register 名称,如下图所示:
分别添加我们仿真所需的文件 register.v和 register_mod.v,如下图所示:
接下来选择 Compile->Compile All ,编译没有问题后,在 Add Simulation Configuration 配置好对应的文件,如下图所示:
仿真结果如下:
7、RTL 原理图
由于设置时钟频率太快,固不做实践操作,接下来在过程管理窗口 Process > Place & Route > Run,来对代码布局布线进行综合,再点击 tools -> Shematic Viewer -> RTL Design Viewer 然后查看 RTL 电路图,如下图所示:
然后查看 RTL 电路图,在软件里 4 级串联环形寄存器电路 是怎样的,如下图所示: