Verilog中组合时序逻辑、同步异步电路、Latch的概念及避免
文章目录
1.组合、时序逻辑
1.1 组合逻辑概念:
- 组合逻辑电路是指由逻辑门组成的电路,其输出只依赖于
当前时刻的输入
。
组合逻辑电路只考虑当前输入信号对输出信号的影响,不考虑过去或未来的状态`。
- 常见的组合逻辑电路有逻辑门、多路选择器、解码器等
1.2 组合逻辑特点:
- 输入数据和输出数据同一时刻变化。
1.3 时序逻辑概念:
- 时序逻辑电路是指由
触发器、计数器
等时序元件
组成的电路,其输出不仅依赖于当前时刻的输入,还依赖于过去时刻和未来时刻的状态
。
时序逻辑电路考虑的是电路的状态随时间变化的情况,具有记忆性和状态控制的功能。
- 常见的时序逻辑电路有触发器、计数器、时序多路选择器等。
1.4 时序逻辑特点:
- 时序逻辑的特点:由于一般是在时钟
上升沿
采样,所以在一个时钟周期内,两个上升沿之间的毛刺会被过滤掉,时序逻辑对毛刺有极好的屏蔽作用。 - 时序逻辑的输出数据会
延迟
输入数据一拍
:(D触发器为例)假设输入信号和时钟上升沿在同一时刻拉高,因为默认采集到的数据是前一拍
的数据,此时采集到的输入信号还是低电平。在下一个时钟上升沿,采集到输入信号为高电平,所以输出信号会在下一个时钟信号上升沿
拉高。 - 时序逻辑使用非阻塞赋值。
1.5 时序逻辑D触发器:
- D触发器:寄存器具有存储功能,一般是由D触发器构成,由时钟脉冲控制,每个D触发器能够存储一位二进制码。
- 相关的Verilog代码:
module dff(input clk, input d, output reg q);
always @(posedge clk)
q <= d;
endmodule
上述代码中,输入端口包括时钟信号clk和数据输入信号d,输出端口为输出状态信号q。
通过always关键词声明时钟上升沿触发的行为,即在时钟信号上升沿时,
将输入数据d存储到输出状态信号q中
- 当时钟信号为高电平时,将数据输入信号存储到触发器中;当时钟信号为低电平时,触发器维持上一次存储的状态不变。
时钟信号边沿未出现,即使输入信号改变,输出信号仍旧保持原值。
- 寄存器具有复位清零功能:同步复位和异步复位。
2. 同步电路:
2.1 同步电路基本概念:
- 同步电路:由
时序电路(寄存器和各种出发器)
和组合逻辑
构成的电路,是指电路中各个部件的操作都在同一个时钟信号的控制下
完成的。 - 同步电路中的各个部件的操作都是同步的,它们在时钟信号的控制下,在同一时刻开始操作,同一时刻结束操作,一般在
上升沿
或者下降沿
完成。
2.2 典型的同步电路:
- 典型的同步电路包括
计数器
、移位寄存器
、时序控制电路
等。
2.3 同步复位:复位信号有变化需等待时钟上升沿
- 同步复位:同步复位是指在多个模块或设备之间执行复位操作时,这些模块或设备需要在一个
确定的时刻
进行复位,以保证它们都处于相同的初始状态。 - 同步复位的重点:(复位低有效时)同步复位发生于
复位信号拉低
且在时钟的上升沿
生效。当复位信号拉高,不会马上生效
,需要等到时钟的上升沿
检测到复位信号拉高才生效。 - RTL代码:
module sync_reset_module (
input clk, // 时钟信号
input rst, // 复位信号
// 其他模块输入输出端口
);
// 定义一个寄存器用于存储复位状态
reg rst_state;
// 复位状态的同步器
always @(posedge clk) begin
if (rst) begin
rst_state <= 1;
end else begin
rst_state <= 0;
end
end
endmodule
3. 异步电路:
3.1 异步电路基本概念:
- 异步电路:是指电路中各个部件的操作不受时钟信号的控制,它们的操作时间可以随机变化的电路。
- 异步电路的操作是不同步的,没有统一的时钟,它们不会在同一时刻开始或结束操作,通常输入信号在电路处于
稳定状态
时才发生变化。 - 异步电路主要是
组合逻辑电路
,用于产生FIFO和RAM,也用于时序逻辑
。
3.2 典型的异步电路:
- 典型的异步电路包括传感器、触发器、比较器等。
- 异步电路中,
Latch可代替寄存器的角色
。
3.3 异步复位:复位信号有变化则立即变化
- 异步复位:异步复位是一种在数字电路设计中使用的技术,它允许用户通过外部信号来强制电路进入一种特殊的状态,从而重新开始电路功能。在异步复位的情况下,复位信号不需要与其他输入信号进行同步,因此即使在高速系统中也可以保证可靠性和稳定性。
- RTL代码:
module async_reset(input clk,input async_reset_n, // 异步复位信号
input [7:0] data_in,
output reg [7:0] data_out);
always@(posedge clk or negedge async_reset_n) begin
if(!async_reset_n) begin // 当异步复位信号为0时,复位状态被激活
data_out <= 8'h00; // 在复位状态下,数据输出为0
end
else begin
data_out <= data_in; // 否则,数据输出等于数据输入
end
end
endmodule
async_reset_n是一个异步复位信号,当它被拉至低电平时,电路会进入复位状态,数据输出为0。
当该信号恢复到高电平时,电路将恢复正常工作状态,数据输出等于输入数据
- 异步复位的重点:(复位信号低有效) 复位信号拉低,则马上生效,不考虑
时钟沿
。当复位信号拉高,不会马上生效
,需要等到时钟的上升沿
检测到复位信号拉高才生效。
4. Latch的概念及避免:
4.1 Latch的概念:
Latch:一种存储元件,用于存储一个电子信号的状态,具有一个或多个输入和一个输出。
- 异步电路Latch是一种
非理想的状态
,导致未定义的情况发生。 - Latch只在
组合逻辑
才会产生,异步电路中,Latch可代替寄存器的角色
。 - 当输入变化时,Latch会保持输入的状态,并将其存储在输出端口上,直到
输入发生改变
。 - Latch类似于Flip-flop,但是它
没有时钟输入
,因此它的输出取决于输入变化的时间。
4.2 Latch的示例:
reg latch_out;
always @(latch_in)
begin
if(latch_en)
latch_out <= latch_in;
end
a.输入信号latch_in被存储于状态变量latch_out中,当latch_en为真时,
b.这个状态变量latch_out在输入信号latch_in发生变化时被更新,并且保持在输出端口上。
4.3 Latch的危害:
对毛刺敏感 | 占用更多逻辑资源 |
---|---|
不能异步复位 | 额外的延时 |
复杂的静态时序分析 | 功耗过高 |
时序问题 | 设计不确定性 |
- Latch会
一直保持存储的状态
,需要占用更多的电力和空间,从而导致功耗过高; - Latch不像触发器一样具有时钟,它们的输出状态
可以在任何时间被改变
,这可能导致时序问题。 - Latch是
异步元件
,它们可能会导致电路输出的值与输入值之间存在不一致的情况,从而导致电路输出的结果不可预测。 - 在设计中应尽量避免使用Latch,特别是在高速电路和复杂设计中。
- 用更加可控的
触发器
替代Latch,以确保电路的可靠性和正确性。
4.4 Latch的避免(同步电路):
避免以下情况
:
- 组合逻辑if-else条件分支语句缺少else。
- 组合逻辑中case语句未完全列举,缺少default语句。
- 组合逻辑中输出变量赋值给自己。