目录
一、电路中的亚稳态以及解决方式
1、什么是建立时间与保持时间
建立时间:触发器在时钟上升沿到来之前,数据输入端的数据必须保持不变的时间。
保持时间:触发器在时钟上升沿到来之后,数据输入端的数据必须保持不变的时间。
2、为什么需要建立时间与保持时间
由于触发器内部数据形成需要时间,若不满足建立时间以及保持时间的要求,触发器将进入亚稳态,进入亚稳态后的触发器输出不确定。
3、如何解决亚稳态以及方式亚稳态的传播
使用两级触发器。输出亚稳态数据在一段时间后必稳定下来,在下一个脉冲沿到来时,第二级触发器将不会出现亚稳态,因为其输入端的数据满足其建立保持时间。
二、系统最高时钟频率计算&流水线思想
1、系统最高频率
系统的最高频率由以下三个因素决定:
名称 | 含义 | 决定因素 |
---|---|---|
T s e t u p T_{setup} Tsetup | 触发器的建立时间 | 电路器件工艺 |
T c o T_{co} Tco | 触发器的输入数据在时钟信号来时被打入触发器到输出到达触发器输出端的延迟时间 | 电路器件工艺 |
T d e l a y T_{delay} Tdelay | 组合电路的延迟时间 | 设计的组合路逻辑延迟 |
因此系统:
最小时钟周期:
T
m
i
n
T_{min}
Tmin =
T
s
e
t
u
p
T_{setup}
Tsetup+
T
c
o
T_{co}
Tco+
T
d
e
l
a
y
T_{delay}
Tdelay
最大时钟频率:
f
m
a
x
f_{max}
fmax =1/
T
m
i
n
T_{min}
Tmin = 1 /(
T
s
e
t
u
p
T_{setup}
Tsetup+
T
c
o
T_{co}
Tco+
T
d
e
l
a
y
T_{delay}
Tdelay)
增加系统的最大值时钟频率的方法,就是减小
T
d
e
l
a
y
T_{delay}
Tdelay组合电路的延迟时间,这是关键所在。
2、流水线思想
由于需要减小 T d e l a y T_{delay} Tdelay组合电路的延迟时间,因此,提出了流水线设计。
可以将较大的组合逻辑分解为较小的 N 块,通过适当的方法平均分配组合逻辑,然后在中间插入触发器,并和原触发器使用相同的时钟,避免在两个触发器之间出现过大的延时,提高电路的工作频率。
推荐阅读: FPGA中流水线的设计思想.
三、Verilog语言实现一个频占比达50%的5分频
1、n.v
使用两个频占比为60%的5分频,相与生产频占比为50%的5分频波形。
module n(
input clk,
input rst_n,
output clk_5);
reg clk_p5;
reg clk_n5;
reg [2:0] cnt;
always@(posedge clk or negedge rst_n)
if(~rst_n)
cnt <= 0;
else if(cnt ==4)
cnt <= 0;
else
cnt <= cnt +1;
always@(posedge clk or negedge rst_n)//生成一个频占比为60%的5分频波形
if(~rst_n)
clk_p5 <= 0;
else if(cnt==0)
clk_p5 <= 0;
else if(cnt==2)
clk_p5 <= 1;
else;
always@(negedge clk or negedge rst_n)//生成另一个频占比为60%的5分频波形
if(~rst_n)
clk_n5 <= 0;
else if(cnt==0)
clk_n5 <= 0;
else if(cnt==2)
clk_n5 <= 1;
else;
assign clk_5 = clk_p5&clk_n5;//相与生成一个频占比为50%的5分频波形
endmodule
2、testbench.v
仿真文件。
module tb();
reg mclk;
reg rst_n;
wire div5_clk;
initial begin
rst_n = 0;
mclk = 0;
#10
rst_n = 1;
end
always #5
mclk = ~ mclk;
n n
(.clk(mclk),
.clk_5(div5_clk),
.rst_n(rst_n)
);
endmodule
3、仿真波形
clk_5为输出波形,clk_p5以及clk_n5为占空比为60%的波形,rst_n为复位信号。
tips:
- input只能为wire型;output可以为wire或者reg型;inout只能为wire型;因此在书写格式时input可以省略 wire,而output尽量表征出时wire型还是reg型;
- parameter的变量通常使用大写;其余的input、output、inout通常使用的时小写变量;
- 在使用if else等语句中,变量的赋值应该完备,就算变量的值没有发生改变,都应该写上去count<=count;