第7章 基于EDA的时序电路设计综合及验证7175Word文档格式.docx
- 文档编号:8649316
- 上传时间:2023-05-12
- 格式:DOCX
- 页数:45
- 大小:812.94KB
第7章 基于EDA的时序电路设计综合及验证7175Word文档格式.docx
《第7章 基于EDA的时序电路设计综合及验证7175Word文档格式.docx》由会员分享,可在线阅读,更多相关《第7章 基于EDA的时序电路设计综合及验证7175Word文档格式.docx(45页珍藏版)》请在冰点文库上搜索。
endcase
endmodule
读者在一开始看这种程序时很容易产生疑问:
触发器是存放数字电路中基本二进制信号的单元电路,也就是寄存器变量Q的值是需要使用触发器来存放,而触发器是由锁存器所构成,用触发器存放的Q来实现一个锁存器显然是不合理的。
这就需要读者理解在VerilogHDL中,采用行为风格编写代码,是为了让程序编写者可用更趋向行为的方式更方便的编写代码,而不需考虑具体的物理细节。
虽然在程序中指定要使用一个寄存器变量Q,但在使用EDA工具进行综合的时候,是不会也不可能用触发器来实现锁存器的,通过综合结果可看出。
2.综合结果
3.测试平台设计
`timescale1ns/1ns
moduletestbench();
regr,s;
wireq,qn;
rs_1test_rs(r,s,q,qn);
initial
begin
r=0;
s=0;
#10s=1;
#10r=1;
#10s=0;
#10r=0;
#10;
end
endmodule
4.功能验证
综合前仿真
综合后仿真
波形说明:
(1)综合前仿真(功能仿真)的结果中,在0~10ns和20~30ns之间,q和qn都是x态。
0~10ns之间产生的x态是因为r和s的值为0,q保持原态;
20~30ns之间产生的x态是因为r和s的值为1,代码中规定了处理为x态。
(2)综合后仿真的结果中,20~30ns之间q和qn并不是x态(都为0),具体状态视20ns时r、s、q的值而定。
7.1.2基本RS锁存器
(二)
modulers_2(R,S,Q,Qn);
nor(Q,R,Qn);
nor(Qn,S,Q);
测试平台与设计一相同。
3.功能验证
波形分析:
对比设计一和设计二的波形,可发现在设计一中,当r,s为1时,Q和Qn均为x,而在设计二中Q和Qn均为0。
由于对RS锁存器来说,R,S同为1是不允许的,故可忽略之。
7.1.3门控D锁存器
modulelatch_1_a(Clk,D,Q);
inputClk,D;
outputQ;
always@(DorClk)
if(Clk)Q<
=D;
程序说明:
(1)当Clk为高电平时,输出Q的数值会随D输入的数据更新,而当Clk为低电平时将保持其高电平时锁入的数据。
(2)Clk由0变为1时,满足if语句的条件,语句“Q<
=D”被执行,将D的数值赋值给Q;
Clk由1变为0时(无论D是否变化),都将执行if语句,但此时Clk=0,语句Q<
=D不被执行,于是Q保持原值不变。
(3)如果敏感信号D发生变化,但Clk为0,Q保持原值不变;
如果敏感信号D发生变化,且Clk为1,则执行语句Q<
=D。
\
`timescale1ns/1ns
moduletestbench_latch;
regclk,D;
wireQ;
initial
begin
clk=0;
#50clk=1;
#100clk=0;
#100clk=1;
end
D=0;
repeat(20)
#20D=$random;
latch_1_atestbench_latch(clk,D,Q);
以下设计使用数据流风格,设计思路、综合结果、测试平台、功能验证结果都相同。
modulelatch_1_b(Clk,D,Q);
assignQ=Clk?
D:
Q;
7.1.4带清零D锁存器
(一)
modulelatch_1_c(Clk,D,Q,Rst);
inputClk,D,Rst;
always@(DorClkorRst)
if(!
Rst)Q<
=0;
//语句1
elseif(Clk)Q<
(1)程序采用具有时序语句特色的进程语句,其中数据信号D、时钟信号Clk和清0(复位)信号Rst都被列于敏感信号表中,实现了Clk的电平触发特性和Rst的异步特性。
(2)异步清0实现的效果,就是当Rst一旦变成0,就马上对输出进行清0,而不需要理会时钟、输入数据等的状态。
也就是Rst是优先级最高的控制信号,在代码(语句1)中,通过“if…elseif…”语句来实现优先级控制。
regclk,D,rst;
wireQ;
initial
begin
#70clk=0;
#80clk=1;
D=0;
repeat(20)
rst=0;
#60rst=1;
#80rst=0;
#40rst=1;
latch_1_ctestbench_latch(clk,D,Q,rst);
7.1.5带清零D锁存器
(二)
modulelatch_1_d(Clk,D,Q,Rst);
assignQ=(!
Rst)?
0:
(Clk?
Q);
程序采用连续赋值语句,使用了条件操作符的嵌套。
实现思路与设计
(一)相同。
综合结果与设计
(一)基本相同,只有元件名称稍有不同。
测试平台、功能验证结果与设计
(一)相同。
7.2触发器
D触发器是最简单、最常用且最具代表性的时序电路,它是数字系统设计中最基本的底层时序单元,JK和T触发器都由D触发器构建而来。
7.2.1D触发器
moduled_ff_1(D,Clk,Q);
inputD,Clk;
outputQ;
regQ;
always@(posedgeClk)
Q<
(1)当Clk的上升沿到达时,立即将D送往输出Q;
若没有Clk的上升沿到达,Q的值保持不变;
(2)该D触发器的设计与门控D锁存器设计非常类似,仅仅是由电平敏感变成了上升沿敏感。
moduletestbench;
regD,Clk;
Clk=0;
parameterclock_period=20;
always#(clock_period/2)Clk=~Clk;
D=0;
repeat(20)
#20D=$random;
d_ff_1testbench_d(D,Clk,Q);
#300$finish;
7.2.2D触发器(异步清零边沿触发)
moduled_ff_2(D,Clk,Q,Rst,En);
inputD,Clk,Rst,En;
always@(posedgeClkornegedgeRst)
if(!
elseif(En)Q<
(1)所谓“异步”是指独立于时钟控制的复位控制端,即在任何时刻,只要Rst=0,D触发器的输出端即刻被清0,与时钟状态无关;
而时钟使能端En的功能是:
只有当En=1时,时钟上升沿才有效。
(2)无论Clk是否有跳变,只要Rst的下降沿到达,即执行Q<
=0,此后如果Rst一直保持为0,则无论是否有Clk的边沿跳变信号,Q均输出0;
如果Rst一直为1,且Clk有上升沿到达,则会执行赋值操作Q<
=D,从而更新Q值。
regD,Rst,Clk,En;
d_ff_2testbench_dff(D,Clk,Q,Rst,En);
initial
#400$finish;
initial
end
Rst=0;
#20Rst=$random;
En=0;
#20En=$random;
7.2.3D触发器(同步清零边沿触发)
moduled_ff_3(D,Clk,Q,Rst);
inputD,Clk,Rst;
if(Rst==1)Q=0;
elseif(Rst==0)Q=D;
所谓“同步”是指某控制信号只有在时钟信号有效时才起作用。
信号敏感表列表中只放了对Clk上升沿的敏感表述,即此过程中的所有其它输入信号都相对于时钟Clk而同步。
7.2.4JK触发器
JK触发器比RS触发器增加了翻转功能,以下设计与RS触发器类似。
modulejk_ff(J,K,Clk,Q,Qn);
inputJ,K,Clk;
always@(posedgeClk)
case({J,K})
b00:
=Q;
=1'
b0;
b1;
=~Q;
default:
测试平台的设计与RS触发器的方法一致,只需把R,S改成J,K,修改对接模块名称即可。
regj,k,Clk;
wireQ,Qn;
j=0;
#20j=$random;
k=0;
#20k=$random;
jk_fftestbench_jk(j,k,Clk,Q,Qn);
7.2.5RS触发器
以下设计是在RS锁存器设计
(一)的基础上,加入上升沿控制而写成。
加入了时钟信号Clk,改变了敏感事件为Clk上升沿触发。
modulers_ff(R,S,Clk,Q,Qn);
inputR,S,Clk;
outputQ,Qn;
assignQn=~Q;
2'
=1;
regR,S,Clk;
parameterclock_period=20;
R=0;
repeat(20)//语句1
#20R=$random;
S=0;
repeat(20)//语句2
#20S=$random;
rs_fftestbench_rs(R,S,Clk,Q,Qn);
initial
//语句3
语句1和语句2要求生成20个随机的R和S,共需要400个单位时间,但语句3却要求在单位时间300时结束,那么程序会按哪一个要求进行呢?
答案可从以下的功能验证波形中看到,程序会在单位时间300时结束。
从波形图上看,综合前和综合后的Q输出结果不一样,综合前仿真的Q输出有很多的x态。
该现象与RS锁存器设计一中出现的现象是同一原因,请参考前面(RS锁存器设计一)的说明。
7.2.6T触发器(异步清零)
modulet_ff(T,Clk,Rst,Q,Qn);
inputT,Clk,Rst;
always@(posedgeClkorposedgeRst)
if(Rst)Q<
elseif(T)Q<
`timescale1ns/1ns
moduletestbench_t;
regT,Clk,Rst;
wireQ,Qn;
always#(clock_period/2)Clk=~Clk;
begin
Rst=0;
#30Rst=1;
#30Rst=0;
#30Rst=0;
T=0;
#20T=$random;
t_fftestbench_t(T,Clk,Rst,Q,Qn);
#400$finish;
假设Rst一直不产生上升沿变化,那么会发生什么事情呢?
如果Rst不产生上升沿变化,则程序代码不被执行,无论T和Clk如何变化,Q和Qn将一直保持x值。
故一般应进行数据的初始化处理。
7.3寄存器
7.3.1基本寄存器
以下讨论由4位D触发器构成的4位寄存器。
对于基本寄存器,数据或代码只能并行送入寄存器中,需要时也只能并行输出。
modulereg4_1(Clr,Clk,D,Q);
output[3:
0]Q;
input[3:
0]D;
inputClk,Clr;
reg[3:
0]Q;
always@(posedgeClkornegedgeClr)
if(!
Clr)Q<
elseQ<
end
regClr,Clk;
wire[3:
initialClk=0;
parameterclock_period=20;
always#(clock_period/2)
Clk=~Clk;
Clr=0;
#20Clr=$random;
reg4_1test_reg(Clr,Clk,D,Q);
说明:
图中Q的输出有些地方为空白,是由于不够位置显示,放大波形即可看到具体的值。
7.3.2基本寄存器(异步清零异步置1)
以下的设计具有异步清零端(Aclr)和异步置1端(Aset),异步清零的优先级比异步置1高。
modulereg4_2(Data,Aclr,Aset,Clock,Q);
input[3:
0]Data;
inputAclr;
inputAset;
inputClock;
output[3:
reg[3:
always@(posedgeClockornegedgeAclrorposedgeAset)
Aclr)
Q<
=4'
b0000;
elseif(Aset)
b1111;
elseQ<
=Data;
reg[3:
regAclr,Aset,Clock;
wire[3:
Clock=0;
always#(clock_period/2)Clock=~Clock;
Data=0;
repeat(20)
#20Data=$random;
Aclr=0;
#20Aclr=$random;
Aset=0;
#200Aset=1;
reg4_2test_reg(Data,Aclr,Aset,Clock,Q);
#300$finish;
由于加入了多个控制信号,故测试平台中对控制信号的状态进行合理搭配也是很重要的,否则可能会出现某些控制信号组合情况未被测试的情况。
因此在测试平台编写过程中应不断的根据实际情况进行调整。
7.3.3移位寄存器(并入并出单向左移)
moduleshift_reg_pipo(Data,Enable,Shiften,Shiftin,Aclr,Clock,Q);
//4位并行输入数据
//异步清0端
inputEnable;
//置数使能端
inputShiften;
//移位使能控制
inputShiftin;
//串行输入端
//时钟信号,上升沿控制
//并行输出端
0]Qaux;
//临时变量
always@(posedgeAclrorposedgeClock)
if(Aclr)
Qaux=0;
elseif(Enable)
Qaux=Data;
elseif(Shiften)
Qaux={Qaux[2:
0],Shiftin};
//通过连接运算符实现左移输入
assignQ=Qaux;
(1)Aclr(异步清0端)的优先级最高,一旦Aclr变为低电平,则输出马上清0。
(2)Enable(并行输入使能控制端)的优先级比Shiften(移位使能控制端)高,当Aclr不为1时,时钟上升沿到来,只要Enable为1,输出Q得到并行输入Data的值。
(3)当Aclr和Enab
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第7章 基于EDA的时序电路设计综合及验证7175 基于 EDA 时序电路 设计 综合 验证 7175