1.1,组合逻辑与数字逻辑
组合逻辑:只与当前输入逻辑电平有关,与电路原始状态无关(无记忆器件)。与、或非组成的网络。
时序逻辑:不仅与当前输入电平有关,还与电路目前所处的状态有关。由多个触发器和组合逻辑块组成的网络。
同步有限状态机是同步时序逻辑电路的基础。电路状态的变化只能在同一时钟跳变沿时刻发生
1.2、需要将时序逻辑电路的信号进行存储
由于组合逻辑是输出的函数且无时延,所以与理想布尔方程计算的完全一致。
但时序逻辑电路中含有逻辑门与布线时延,导致需要对时序逻辑电路的稳定输出进行保存,从而消除毛刺等不理想状态。
带使能端与复位端的时钟同步8位寄存器组逻辑和模块接口。(代码,测试平台以及仿真波形如下)
module register8 (
input ena,
input clk,
input rst,
input [7:0] data,
output reg [7:0] out
);
always @(posedge clk ) begin
if(!rst)
out<=0;
else if(ena) begin
out<=data;
end
else
out<=out;
end
endmodule //register8
`timescale 1ns / 1ps
`include "./register8.v"
module tb_register8;
// register8 Parameters
parameter PERIOD = 10;
// register8 Inputs
reg ena = 0 ;
reg clk = 0 ;
reg rst = 0 ;
reg [7:0] data = 0 ;
// register8 Outputs
wire [7:0] out ;
initial
begin
forever #(PERIOD/2) clk=~clk;
end
register8 u_register8 (
.ena ( ena ),
.clk ( clk ),
.rst ( rst ),
.data ( data [7:0] ),
.out ( out [7:0] )
);
initial
begin
$dumpfile("test.vcd");
$dumpvars;
clk=0;
rst=0;
#100
rst=1;
ena=1;
data=8'h11;
#100
ena=0;
data=8'h12;
#100
ena=1;
data=8'h13;
#100
ena=0;
data=8'h14;
$finish;
end
endmodule
1.3、数据流动控制
简单的加减乘除组合逻辑的运算结果需要被当作下级输入保存起来,所以需要保存在寄存器组中,且这一过程由同步状态机来实现。(开关逻辑应用举例)
1.4、同步时序逻辑的启用
一、同步时序逻辑是指表示状态的寄存器组的值只能在唯一确定的触发条件下改变,如
always @(posedge clock)
二、 Verilog HDL设计中需避免使用异步时序逻辑。
①许多综合器不支持异步综合
②异步逻辑很难控制竞争冒险
③电路复杂时,异步时序无法调试
三、时钟频率过高可能会导致逻辑紊乱
一个寄存器的输入与输出是在两个时钟沿完成的,中间有足够的时间使得其达到稳定状态以保证正确输出,但时钟频率过高则会导致逻辑紊乱,从而产生错误,此时应降低时钟频率。
四、毛刺的产生与抑制方法
等待c的值稳定后再进行计算则可解决。
Verilog语法中的非阻塞赋值方法'<='的含义:如果在begin end中同时含有多个非阻塞赋值,则它们的赋值是同事的,而不是按照先后顺序的。从而避免了组合逻辑产生的竞争冒险。
实际上它们表示的是同时赋入上一个时钟沿时刻送人寄存器的值。这与使用同一时钟沿触发的许多寄存器在同一个使能控制信号下赋值是完全一致的。所有被赋的值在上一时钟沿前就已经保存在寄存器中,它们有足够的时间传送到被赋值的寄存器的数据端口。当时钟沿到来时被赋值都已经稳定﹐所以存入的寄存器的数值是可靠的。用这种方法可以避免由组合逻辑产生的冒险与竞争。
1.5、数据接口的同步方法
①将前级数据保存至RAM,再用后级时钟对其进行采样读取。
②利用加同步码的方式从而校验使其同步。
注:参考夏宇闻《Verilog数字系统设计》