《数字逻辑与EDA设计》课件-第7章_第1页
《数字逻辑与EDA设计》课件-第7章_第2页
《数字逻辑与EDA设计》课件-第7章_第3页
《数字逻辑与EDA设计》课件-第7章_第4页
《数字逻辑与EDA设计》课件-第7章_第5页
已阅读5页,还剩353页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章基于EDA的时序电路

设计、综合及验证

7.1锁存器7.2触发器7.3寄存器7.4寄存器传输7.5计数器7.6有限状态机7.7时序逻辑电路的综合性设计实例学习基础:

第3章介绍了时序逻辑电路的基础知识。在学习本章前,应先掌握第3章的知识。

第4章介绍了VerilogHDL的基本语法及简单设计的建模方法。

5.5~5.7节的综合实例,介绍了EDA工具LiberoIDE的使用方法。本章所有综合和验证均基于LiberoIDE环境实现。阅读指南:

本章讲述内容对应第3章的知识,把相应功能通过VerilogHDL语言进行实现。对每个电路设计的基础知识和理解请参考第3章。

本章多处对同一个设计提供了多种设计思路和实现方法,并不是所有都是最优的方法,只是方便对比和学习。读者可根据情况选择合适的方法。

7.4节、7.6节、7.7节中讨论了第3章中没有涉及的理论知识和多个综合例子,这些知识和例子综合性强,较难理解,但却是数字系统实际开发中非常重要和实用的内容,对于想进入数字系统设计实践阶段的读者来说很有实际意义。

7.1锁存器

7.1.1基本RS锁存器(一)

1.使用Verilog进行描述

modulers_1(R,S,Q,Qn);

inputR,S;

outputQ,Qn; //Qn表示,而不是时序电路中的现态Qn。

regQ;

assignQn=~Q;regQ;

assignQn=~Q;

always@(RorS)

//通过case语句,按真值表方式写出程序逻辑。

case({R,S})

2'b01:Q=1;

2'b10:Q=0;

2'b11:Q=1'bx;

endcase

endmodule读者在一开始看到这种程序时很容易产生疑问:触发器是存放数字电路中基本二进制信号的单元电路,也就是寄存器变量Q的值是需要使用触发器来存放,而触发器是由锁存器所构成的,用触发器存放的Q来实现一个锁存器显然是不合理的。

这就需要读者理解在VerilogHDL中,采用行为风格编写代码,是为了让程序编写者可用更趋向行为的方式更方便地编写代码,而不需考虑具体的物理细节。虽然在程序中指定要使用一个寄存器变量Q,但在使用EDA工具进行综合的时候,是不会也不可能用触发器来实现锁存器的,这通过综合结果可看出。

2.综合结果

综合结果如图7-1和图7-2所示。图7-1RTL视图图7-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.功能验证

仿真结果如图7-3和图7-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-3综合前仿真图7-4综合后仿真7.1.2基本RS锁存器(二)

1.使用Verilog进行描述

modulers_2(R,S,Q,Qn);

inputR,S;

outputQ,Qn;

nor(Q,R,Qn);

nor(Qn,S,Q);

endmodule

2.综合结果

综合结果如图7-5和图7-6所示。图7-5RTL视图图7-6工艺视图

3.功能验证

测试平台与设计(一)相同。仿真结果如图7-7所示。

波形分析:对比设计(一)和设计(二)的波形,可发现在设计(一)中,当r、s为1时,Q和Qn均为x;而在设计(二)中Q和Qn均为0。由于对RS锁存器来说,R、S同为1是不允许的,故可忽略之。图7-7功能仿真结果7.1.3门控D锁存器

1.使用Verilog进行描述

modulelatch_1_a(Clk,D,Q);

inputClk,D;

outputQ;

regQ;

always@(DorClk)

if(Clk)Q<=D;

endmodule程序说明:

(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。

2.综合结果

综合结果如图7-8和图7-9所示。图7-8RTL视图图7-9工艺视图

3.测试平台设计

`timescale1ns/1ns

moduletestbench_latch;

regclk,D;

wireQ;

initial

begin

clk=0;

#50clk=1;

#100clk=0;

#100clk=1;

end

initial

begin

D=0;

repeat(20)

#20D=$random;

end

latch_1_atestbench_latch(clk,D,Q);

endmodule

4.功能验证

仿真结果如图7-10所示。图7-10功能仿真结果7.1.4带清零D锁存器(一)

1.使用Verilog进行描述

modulelatch_1_c(Clk,D,Q,Rst);

inputClk,D,Rst;

outputQ;

regQ;

always@(DorClkorRst)

if(!Rst)Q<=0; //语句1

elseif(Clk)Q<=D;

endmodule程序说明:

(1)程序采用具有时序语句特色的进程语句,其中数据信号D、时钟信号Clk和清0(复位)信号Rst都被列于敏感信号表中,实现了Clk的电平触发特性和Rst的异步特性。

(2)异步清0实现的效果,就是当Rst一旦变成0,就马上对输出进行清0,而不需要理会时钟、输入数据等的状态。也就是Rst是优先级最高的控制信号,在代码(语句1)中,可通过“if…elseif…”语句来实现优先级控制。

2.综合结果

综合结果如图7-11和图7-12所示。图7-11RTL视图图7-12工艺视图

3.测试平台设计

`timescale1ns/1ns

moduletestbench_latch;

regclk,D,rst;

wireQ;

initial

begin

clk=0;

#50clk=1;

#70clk=0;

#80clk=1;

endinitial

begin

D=0;

repeat(20)

#20D=$random;

end

initial

begin

rst=0;

#60rst=1;

#80rst=0;

#40rst=1;

end

latch_1_ctestbench_latch(clk,D,Q,rst);

endmodule

4.功能验证

仿真结果如图7-13所示。图7-13功能仿真结果7.1.5带清零D锁存器(二)

modulelatch_1_d(Clk,D,Q,Rst);

inputClk,D,Rst;

outputQ;

assignQ=(!Rst)?0:(Clk?D:Q);

endmodule

程序采用连续赋值语句,使用了条件操作符的嵌套,实现思路与设计(一)相同。综合结果与设计(一)基本相同,只有元件名称稍有不同。测试平台、功能验证结果与设计(一)相同。

7.2触发器

D触发器是最简单、最常用且最具代表性的时序电路,它是数字系统设计中最基本的底层时序单元,JK和T触发器都由D触发器构建而来。7.2.1D触发器

1.使用Verilog进行描述

moduled_ff_1(D,Clk,Q);

inputD,Clk;

outputQ;

regQ;

always@(posedgeClk)

Q<=D;

endmodule程序说明:

(1)当Clk的上升沿到达时,立即将D送往输出Q;若没有Clk的上升沿到达,则Q的值保持不变。

(2)该D触发器的设计与门控D锁存器设计非常类似,仅仅是由电平敏感变成了上升沿敏感。

2.综合结果

综合结果如图7-14和图7-15所示。图7-14RTL视图图7-15工艺视图

3.测试平台设计

`timescale1ns/1ns

moduletestbench;

regD,Clk;

wireQ;

parameterclock_period=20;

always#(clock_period/2)Clk=~Clk;

initial

begin

D=0;Clk=0;

repeat(20)

#20D=$random;

end

initial

#300$finish;

d_ff_1testbench_d(D,Clk,Q);

endmodule

4.功能验证

仿真结果如图7-16所示。图7-16功能仿真结果7.2.2D触发器(异步清零边沿触发)

1.使用Verilog进行描述

moduled_ff_2(D,Clk,Q,Rst,En);

inputD,Clk,Rst,En;

outputQ;

regQ;

always@(posedgeClkornegedgeRst)

begin

if(!Rst)Q<=0;

elseif(En)Q<=D;

end

endmodule程序说明:

(1)所谓“异步”是指独立于时钟控制的复位控制端,即在任何时刻,只要Rst=0,D触发器的输出端即刻被清0,与时钟状态无关;而时钟使能端En的功能是,只有当En=1时,时钟上升沿才有效。

(2)无论Clk是否有跳变,只要Rst的下降沿到达,即执行Q<=0,此后如果Rst一直保持为0,则无论是否有Clk的边沿跳变信号,Q均输出0;如果Rst一直为1,且Clk有上升沿到达,则会执行赋值操作Q<=D,从而更新Q值。

2.综合结果

综合结果如图7-17和图7-18所示。图7-17RTL视图图7-18工艺视图

3.测试平台设计

`timescale1ns/1ns

moduletestbench;

regD,Rst,Clk,En;

wireQ;

d_ff_2testbench_dff(D,Clk,Q,Rst,En);

initial

Clk=0;

#400$finish;

parameterclock_period=20;

always#(clock_period/2)Clk=~Clk;initial

begin

D=0;

repeat(20)

#20D=$random;

end

initial

begin

Rst=0;

repeat(20)

#20Rst=$random;

end

initial

begin

En=0;

repeat(20)

#20En=$random;

end

endmodule

4.功能验证

仿真结果如图7-19所示。图7-19功能仿真结果7.2.3D触发器(同步清零边沿触发)

moduled_ff_3(D,Clk,Q,Rst);

inputD,Clk,Rst;

outputQ;

regQ;

always@(posedgeClk)

if(Rst==1)Q=0;

elseif(Rst==0)Q=D;

endmodule

程序说明:所谓“同步”是指某控制信号只有在时钟信号有效时才起作用。信号敏感表列表中只放了对Clk上升沿的敏感表述,即此过程中的所有其它输入信号都相对于时钟Clk而同步。7.2.4JK触发器

1.使用Verilog进行描述

JK触发器比RS触发器增加了翻转功能,以下设计与RS触发器类似。

modulejk_ff(J,K,Clk,Q,Qn);

inputJ,K,Clk;

outputQ,Qn;

regQ;

assignQn=~Q;

always@(posedgeClk)

case({J,K})

2'b00:Q<=Q;

2‘b01:Q<=1’b0;

2‘b10:Q<=1’b1;

2‘b11:Q<=~Q;

default:Q<=1’bx;

endcase

endmodule

2.综合结果

综合结果如图7-20和图7-21所示。图7-20RTL视图图7-21工艺视图

3.测试平台设计

测试平台的设计与RS触发器的方法一致,只需把R,S改成J,K,修改对接模块名称即可。

`timescale1ns/1ns

moduletestbench;

regj,k,Clk;

wireQ,Qn;

parameterclock_period=20;

always#(clock_period/2)Clk=~Clk;initial

begin

j=0;Clk=0;

repeat(20)

#20j=$random;

end

initial

begin

k=0;

repeat(20)

#20k=$random;

end

initial

#300$finish;

jk_fftestbench_jk(j,k,Clk,Q,Qn);

endmodule

4.功能验证

仿真结果如图7-22所示。图7-22功能仿真结果7.2.5RS触发器

1.使用Verilog进行描述

以下设计是在RS锁存器设计(一)的基础上,加入上升沿控制而写成的。加入了时钟信号Clk,改变了敏感事件为Clk上升沿触发。

modulers_ff(R,S,Clk,Q,Qn);

inputR,S,Clk;

outputQ,Qn;

regQ;

assignQn=~Q;

always@(posedgeClk)

case({R,S})

2‘b01:Q<=1;

2’b10:Q<=0;

2‘b11:Q<=1’bx;

endcase

endmodule

2.综合结果

综合结果如图7-23和图7-24所示。图7-23RTL视图图7-24工艺视图

3.测试平台设计

`timescale1ns/1ns

moduletestbench;

regR,S,Clk;

wireQ,Qn;

parameterclock_period=20;

always#(clock_period/2)Clk=~Clk;

initial

begin

R=0;Clk=0;

repeat(20) //语句1

#20R=$random;

endinitial

begin

S=0;

repeat(20) //语句2

#20S=$random;

end

rs_fftestbench_rs(R,S,Clk,Q,Qn);

initial

#300$finish; //语句3

endmodule程序说明:语句1和语句2要求生成20个随机的R和S,共需400个单位时间,但语句3却要求在单位时间300时结束,那么程序会按哪一个要求进行呢?答案可从以下的功能验证波形中看到,程序会在单位时间300时结束。

4.功能验证

仿真结果如图7-25和图7-26所示。

波形分析:从波形图上看,综合前和综合后的Q输出结果不一样,综合前仿真的Q输出有很多的x态。该现象与RS锁存器设计(一)中出现的现象是同一原因,请参考前面(RS锁存器设计一)的说明。图7-25综合前仿真结果图7-26综合后仿真结果7.2.6T触发器(异步清零)

1.使用Verilog进行描述

modulet_ff(T,Clk,Rst,Q,Qn);

inputT,Clk,Rst;

outputQ,Qn;

regQ;

assignQn=~Q;

always@(posedgeClkorposedgeRst)

if(Rst)Q<=0;

elseif(T)Q<=~Q;

endmodule

2.综合结果

综合结果如图7-27和图7-28所示。图7-27RTL视图图7-28工艺视图

3.测试平台设计

`timescale1ns/1ns

moduletestbench_t;

regT,Clk,Rst;

wireQ,Qn;

parameterclock_period=20;

always#(clock_period/2)Clk=~Clk;

initial

begin

Rst=0;Clk=0;

#30Rst=1;

#30Rst=0;#30Rst=1;

#30Rst=0;

end

initial

begin

T=0;

repeat(20)

#20T=$random;

end

t_fftestbench_t(T,Clk,Rst,Q,Qn);

initial

#400$finish;

endmodule

4.功能验证

仿真结果如图7-29所示。

波形分析:假设Rst一直不产生上升沿变化,那么会发生什么事情呢?如果Rst不产生上升沿变化,则程序代码不被执行,无论T和Clk如何变化,Q和Qn将一直保持x值。故一般应进行数据的初始化处理。图7-29功能仿真结果

7.3寄存器

7.3.1基本寄存器

以下讨论由4位D触发器构成的4位寄存器。对于基本寄存器,数据或代码只能并行送入寄存器中,需要时也只能并行输出。

1.使用Verilog进行描述

modulereg4_1(Clr,Clk,D,Q);

output[3:0]Q;

input[3:0]D;

inputClk,Clr;

reg[3:0]Q;

always@(posedgeClkornegedgeClr)

begin

if(!Clr)Q<=0;

elseQ<=D;

end

endmodule

2.综合结果

综合结果如图7-30和图7-31所示。图7-30RTL视图图7-31工艺视图

3.测试平台设计

`timescale1ns/1ns

moduletestbench;

regClr,Clk;

reg[3:0]D;

wire[3:0]Q;

parameterclock_period=20;

always#(clock_period/2)

Clk=~Clk;

initial

begin

D=0;Clk=0;

repeat(20)

#20D=$random;

end

initial

begin

Clr=0;

repeat(20)

#20Clr=$random;

end

initial

#400$finish;

reg4_1test_reg(Clr,Clk,D,Q);

endmodule

4.功能验证

仿真结果如图7-32所示。

说明:图中Q的输出有些地方为空白,是由于位置不够显示,放大波形即可看到具体的值。图7-32功能仿真结果7.3.2基本寄存器(异步清零异步置1)

1.使用Verilog进行描述

以下的设计具有异步清零端(Aclr)和异步置1端(Aset),异步清零的优先级比异步置1高。

modulereg4_2(Data,Aclr,Aset,Clock,Q);

input[3:0]Data;

inputAclr,Aset,Clock;

output[3:0]Q;

reg[3:0]Q;

always@(posedgeClockornegedgeAclrorposedgeAset)

if(!Aclr)

Q<=4‘b0000;

elseif(Aset)

Q<=4’b1111;

elseQ<=Data;

endmodule

2.综合结果

综合结果如图7-33所示。

篇幅所限,在此不列出工艺视图,请读者自行综合并与其它设计进行对比分析。图7-33RTL视图

3.测试平台设计

`timescale1ns/1ns

moduletestbench;

reg[3:0]Data;

regAclr,Aset,Clock;

wire[3:0]Q;

initial

Clock=0;

parameterclock_period=20;

always#(clock_period/2)Clock=~Clock;initial

begin

Data=0;

repeat(20)

#20Data=$random;

end

initial

begin

Aclr=0;

repeat(20)

#20Aclr=$random;

endinitial

begin

Aset=0;

#200Aset=1;

end

initial

#300$finish;

reg4_2test_reg(Data,Aclr,Aset,Clock,Q);

endmodule程序说明:由于加入了多个控制信号,故测试平台中对控制信号的状态进行合理搭配也是很重要的,否则可能会出现某些控制信号组合情况未被测试的情况。因此在测试平台编写过程中应不断根据实际情况进行调整。

4.功能验证

仿真结果如图7-34所示。图7-34功能仿真结果7.3.3移位寄存器(并入并出单向左移)

1.使用Verilog进行描述

moduleshift_reg_pipo(Data,Enable,Shiften,Shiftin,Aclr,Clock,Q);

input[3:0]Data; //4位并行输入数据

inputAclr; //异步清0端

inputEnable; //置数使能端

inputShiften; //移位使能控制

inputShiftin; //串行输入端

inputClock; //时钟信号,上升沿控制

output[3:0]Q; //并行输出端

reg[3:0]Qaux; //临时变量always@(posedgeAclrorposedgeClock)

begin

if(Aclr)

Qaux=0;

elseif(Enable)

Qaux=Data;

elseif(Shiften)

Qaux={Qaux[2:0],Shiftin};

//通过连接运算符实现左移输入

end

assignQ=Qaux;

endmodule程序说明:

(1) Aclr(异步清0端)的优先级最高,一旦Aclr变为低电平,则输出马上清0。

(2) Enable(并行输入使能控制端)的优先级比Shiften(移位使能控制端)高,当Aclr不为1时,时钟上升沿到来,只要Enable为1,输出Q得到并行输入Data的值。

(3)当Aclr和Enable不为1时,时钟上升沿到来,如果Shiften为1,则实现右移输入操作,左移输入Shiftin的数据(串行输入)。

2.综合结果

综合结果如图7-35所示。图7-35RTL视图7.3.4移位寄存器(并入串出单向左移)

1.使用Verilog进行描述

moduleshift_reg_piso(Data,Enable,Shiften,Shiftin,Aclr,Clock,Shiftout);

input[1:0]Data;

inputAclr;

inputEnable;

inputShiften;

inputShiftin;

inputClock;

outputShiftout;

reg[1:0]Qaux;

always@(posedgeAclrorposedgeClock)

begin

if(Aclr)

Qaux=0;

elseif(Enable)

Qaux=Data;

elseif(Shiften)

Qaux={Qaux[0],Shiftin}; //语句1

end

assignShiftout=Qaux[1]; //语句2

endmodule程序说明:

(1)程序实现2位移位寄存器,串行输出左向移位。

(2)程序逻辑与7.7.3节的一致,只是在最后输出的时候,7.3.3节的设计是并行输出整个结果,而本设计是输出最高位,达到串行输出的结果。

(3)如果要改为右移,语句1应改为“Qaux={Shiftin,Qaux[1};”,并且语句2改为输出最低位Qaux[0]。

2.综合结果

综合结果如图7-36所示。图7-36RTL视图

3.测试平台设计(1)

`timescale1ns/1ns

moduletestbench;

reg[1:0]Data;

regAclr,Enable,Shiften,Shiftin,Clock;

wireShiftout;

parameterclock_period=20;

always#(clock_period/2)Clock=~Clock;

initial

begin

Data=0;

repeat(20)

#20Data=$random;

endinitial

begin

Clock=0; //时钟信号的初始化,可放在任一个initial过程中

Aclr=0;

#40Aclr=1;

#100Aclr=0;

end

initial

begin

Enable=0;

#100Enable=1;

#100Enable=0;

endinitial

begin

Shiften=0;

repeat(20)

#20Shiften=$random;

end

initial

begin

Shiftin=0;

repeat(10)

#40Shiftin=$random;

end

initial

#400$finish;

shift_reg_pisotestbench_piso(Data,Enable,Shiften,Shiftin,Aclr,Clock,Shiftout);

endmodule

4.功能验证(1)

仿真结果如图7-37所示。

为了查看效果更完整,要把Qaux也输出显示到Wave窗口中,需要在“sim”窗口中选择“testbench_piso”实例,然后在“objects”窗口中找到Qaux变量,把该变量设置在Wave窗口中显示。如果不把Qaux加入到波形中,光从Shiftout是很难看出其移位过程的。

从图中可看出,在时钟控制下(上升沿):

清零端Aclr为1时,输出为0;

Aclr为0,Enable(置数使能端)为1时,输出Data的最高位;

Aclr为0,Enable为0,Shiften(移位使能端)为1时,根据Shiftin的输入进行左移位。图7-37功能仿真结果

5.测试平台设计(2)

在测试平台设计(1)中,对于每一个控制信号,要么指定变化的时间,要么周期性用随机数生成,这样可以产生不同的测试信号组合。但这样的设计很容易产生一些无意义的状态组合和有些组合情况未能列出。

在测试平台设计(2)中,Aclr和Clock的信号单独产生;另外3个控制和输入信号(Enable,Shiften,Shiftin)则通过循环方法,生成所有可能出现的组合情况;Data输入则随机产生。`timescale1ns/1ns

moduletestbench2;

reg[1:0]Data;

regAclr,Enable,Shiften,Shiftin,Clock;

wireShiftout;

reg[2:0]CtrlVec;

integerI;

parameterperiod=20;

always

#(period/2)Clock=~Clock;initial

begin

Clock=0;

Aclr=0;

#160Aclr=1;

end

initial

begin

Data=0;

repeat(12)

#20Data=$random;

endinitial

begin

for(I=0;I<=11;I=I+1)

begin

CtrlVec=I;

{Enable,Shiften,Shiftin}=CtrlVec;

#20;

end

end

initial

#240$finish;

shift_reg_pisotestbench_piso2(Data,Enable,Shiften,Shiftin,Aclr,Clock,Shiftout);

endmodule程序说明:

(1) I的循环只需要8次即可列举出Enable、Shiften、Shiftin三个控制信号的8种状态组合,但为了测试Aclr为0时的结果,增加了4次循环(I等于8~11时)。

(2) Enable、Shiften、Shiftin的组合情况从000~111变化后,又重新从000开始,因为当I为8(即‘b1000)时,Enable、Shiften、Shiftin分别获得了低位的0,而最高位的1没有被任何变量获得,这是一个常用技巧。

6.功能验证(2)

仿真结果如图7-38所示。图7-38功能仿真结果波形说明:

(1)该波形所显示的变量是“testbench_piso2”实例中的变量,操作方法是:选择“sim”窗口中“testbench_piso”实例,然后在“objects”窗口中,设置在Wave窗口中显示相应

变量。

(2)从Shiftout的波形来看,产生了很少的输出,并且很难从Shiftout的波形看出移位、并行输入的变化过程。

(3)具体的移位和并行输入的结果,要从Qaux波形上才能看出:Qaux第1、2次的变化,是移位操作得到的结果;第3、4次的值,是并行输入得到的结果;第5次的值,是异步清0的结果。7.3.5移位寄存器(串入并出单向左移)

1.使用Verilog进行描述

moduleshift_reg_sipo(Shiften,Shiftin,Aclr,Clock,Q);

inputShiften,Shiftin,Aclr,Clock;

output[3:0]Q;

reg[3:0]Qaux;

always@(posedgeAclrorposedgeClock)

begin

if(Aclr)

Qaux=0;

elseif(Shiften)

Qaux={Qaux[2:0],Shiftin};

end

assignQ=Qaux;

endmodule

2.综合结果

综合结果如图7-39所示。图7-39RTL视图7.3.6移位寄存器(串入串出单向移位)

1.使用Verilog进行描述

moduleshift_reg_siso(Shiften,Shiftin,Aclr,Clock,Shiftout);

inputShiften,Shiftin,Aclr,Clock;

outputShiftout;

reg[3:0]Qaux;

always@(posedgeAclrorposedgeClock)

begin

if(Aclr)

Qaux=0;

elseif(Shiften)

Qaux={Qaux[2:0],Shiftin};

end

assignShiftout=Qaux[3];

endmodule

2.综合结果

综合结果如图7-40所示。图7-40RTL视图

7.4寄 存 器 传 输

寄存器传输(RegisterTransferLevel,RTL)是数字逻辑电路的一种设计方法。利用寄存器传输设计时,必须详细说明数据在不同寄存器之间处理及传输的过程,一般使用中等规模的功能模块作为基本单元。

7.4.1基本概念

寄存器存储数据的运动及完成的处理称为寄存器传输操作(RegisterTransferOperation),又称为微操作(microoperation)。

对于n位寄存器,下标从0到n-1。小端(Littleendian):0位在最右端,n-1位在最左端。

大端(Bigendian):0位在最左端,n-1位在最右端。

最常用的寄存器图示方法如图7-41所示。

以“←”表示从一个寄存器到另一个寄存器的数据传输。例如R2←R1,表示将寄存器R1的内容传至寄存器R2,其中,R2表示目标寄存器,R1表示源寄存器。

所有的寄存器传输操作都可以用相应的硬件来实现。如K1:R2←R1,表示若K1=1,则R2←R1,对应的电路和波形如图7-42所示。图7-41常用寄存器图7-42寄存器传输操作7.4.2微操作的种类

有以下4种微操作:

(1)传输:从一个寄存器到另一个寄存器传输数据。

(2)算术运算:寄存器存储数据的算术运算。

(3)逻辑运算:寄存器存储数据的位运算。

(4)移位:寄存器存储数据的移位。7.4.3单寄存器微操作

所有微操作的结果均只涉及一个目标寄存器,且该寄存器又作为源寄存器使用。由于寄存器与微操作之间的紧密耦合,实现微操作的组合逻辑部分成为寄存器的一部分,称为专用逻辑(dedicatedlogic)。而使用多目标寄存器的情况则称为共享逻辑(sharedlogic)。

考虑一个寄存器在不同时间从不同的数据源接收数据的情况:

K1:R0←R1,K1#K2:R0←R2

表示根据K1、K2的值选择将寄存器R1或R2的内容传至目标寄存器R0,可以利用数据选择器实现,其结构如图7-43所示。图7-43结构图图7-44所示为该电路的逻辑细节。图7-44逻辑细节7.5计数器

7.5.1计数器(四位二进制加法)

1.使用Verilog进行描述

modulecnt4_1(qout,reset,clk);

output[3:0]qout;

inputclk,reset;

reg[3:0]qout;

always@(posedgeclk)

begin

if(reset)qout<=0;

else qout<=qout+1;

end

endmodule

2.综合结果

综合结果如图7-45所示。图7-45RTL视图

3.测试平台设计

`timescale1ns/1ns

modulecoun4_testbench;

regclk,reset;

wire[3:0]out;

parameterDELY=20;

always#(DELY/2)clk=~clk;

cnt4_1test_count(out,reset,clk);

initial

begin

clk=0;reset=0;

#(DELY*2) reset=1;

#DELY reset=0;

#(DELY*18)$finish;

end

endmodule

4.功能验证

仿真结果如图7-46所示。

从波形图可看出:

(1)由于测试平台一开始没有给out赋值,故在没有reset上升沿信号来临前,out的值一直为x,没有进行计数。

(2) reset为1时,qout被清零。

(3)输出qout为4位向量,当计数到4'b1111(即15)后,再计数的话会产生高位溢出,重新变为4'b0000。图7-46功能仿真结果7.5.2计数器(带置数)

1.使用Verilog进行描述

modulecnt4_2(clock,q,aclr,sload,data);

inputclock,aclr,sload;

output[3:0]q;

input[3:0]data;

reg[3:0]qaux;

always@(posedgeclockorposedgeaclr)

begin

if(aclr)

qaux<=4‘b0000;

elseif(sload)

qaux<=data;

elseqaux<=qaux+1;

end

assignq=qaux;

endmodule

2.综合结果

综合结果如图7-47所示。图7-47RTL视图

3.测试平台设计

`timescale1ns/1ns

moduletestbench;

regclock,sload,aclr;

reg[3:0]data;

wire[3:0]q;

parameterDELY=20;

always#(DELY/2)clock=~clock;

initial

begin

sload=0;clock=0;

repeat(15)

#DELYsload=$random;

endinitial

begin

aclr=0;

#DELYaclr=1;

#60aclr=0;

end

initial

begin

data=0;

repeat(15)

#DELYdata=$random;

end

initial

#300$finish;

cnt4_2test_cnt_42(clock,q,aclr,sload,data);

endmodule

4.功能验证

仿真结果如图7-48所示。图7-48功能仿真结果7.5.374HC161设计

3.4.2节中讨论了4位二进制同步计数器的设计,以下代码按照74HC161芯片功能表写出。

//74HC161.v

moduleHC161(CP,CEP,CET,MRN,PEN,Dn,Qn,TC);

inputCP;

inputCEP,CET;

output[3:0]Qn;

inputMRN,PEN;

input[3:0]Dn;

outputTC;reg[3:0]qaux;

regTC;

always@(posedgeCP) //同步

begin

if(!MRN)

qaux<=4'b0000; //复位

elseif(!PEN)

qaux<=Dn; //并行输入

elseif(CEP&CET)

qaux<=qaux+1; //计数

elseqaux<=qaux; //保持

end

always@(posedgeCP)

begin

if(qaux==4‘b1111) //进位输出

TC=1’b1;

elseTC=1‘b0;

end

assignQn=qaux;

endmodule

在后面章节的综合实例中(7.7.1节),该设计将作为基本模块进行调用。在此不列出测试平台和综合结果,读者可自行设计和验证。

7.6有 限 状 态 机

时序逻辑电路的显著特点是内部包含状态寄存器,电路在不同的状态之间切换。由于状态寄存器数目有限,电路可以达到的状态有限,因此,时序逻辑电路有时称为有限状态机(FiniteStateMachine,FSM)。

FSM是表示实现有限个离散状态及其状态之间的转移等行为动作的数学模型。状态机主要包含状态及转移两方面的内容。有限状态机特别适合描述那些发生有先后顺序或者有逻辑规律的事情,状态机的本质就是对具有逻辑顺序或时序规律事件的一种描述方法。有限状态机及其设计技术是数字逻辑电路设计中的重要组成部分,是实现高效率、高可靠性逻辑控制的重要途径。大部分数字逻辑电路都可以划分为控制单元和数据单元(存储单元)两个组成部分。通常,控制单元的主体是一个状态机,它接收外部信号以及数据单元产生的状态信息,产生控制信号序列。

状态机设计是时序逻辑电路设计的一个子集,在数字逻辑电路设计的范畴中应用面很广。小到一个简单的时序逻辑,大到复杂的微处理器,都适合用状态机方法进行描述。由于状态机不仅仅是一种电路描述工具,它更是一种思想方法,而且状态机的HDL表达方式比较规范,有章可循,因此很多设计者习惯用状态机思想进行逻辑设计,对各种复杂设计均套用状态机的设计理念,从而提高设计的效率和稳定性。7.6.1有限状态机概述

1.基本概念

(1)状态:用于“记忆”在时钟边沿或相应脉冲边沿加载于电路的历史输入数据的组合情况,也叫状态变量。状态可以用名称定义,也可以不用名称。在逻辑设计中,使用状态划分逻辑顺序和时序规律。

(2)状态转移:当发生指定事件且满足指定条件时,第一个状态中的对象将执行某些操作并进入第二个状态,即“触发”了转移。将触发转移之前的状态定义为“源状态”(当前状态,current_state),而触发转移之后的状态定义为“目标状态”(下一状态,next_state)。状态的转换由时钟信号驱动。图7-49为状态转换图例子。其中indata是转移条件,Q1Q2是输出信号,箭头指向为转移方向,S0、S1、S2、S3为状态名称(未作编码)。状态转换表如表7-1所示。

(3)状态编码:状态机的N种状态通常需要用某种编码来表示,即状态编码,又称为状态分配。编码方式主要包括:

①顺序二进制码:使用状态向量的位数最少,但从一个状态转移到相邻状态时,可能会有多个位同时发生变化,易产生毛刺。

②格雷码:在相邻状态的转换中,每次只有一个比特位发生变化,消除了产生毛刺的问题,但不适用于有很多状态跳转的情况。图7-49状态转换图表7-1状态转换表③独热码:指对任意给定的状态,状态向量中仅有一位“1”,而其余为“0”,所以N状态的状态机需要N个触发器。

④直接输出型编码:将状态码中的某些位直接输出作为控制信号,要求状态机各状态的编码作特殊的选择,以适应控制信号的要求,该编码需要根据输出变量来定制编码。

如上表中的S0、S1、S2、S3状态,可用00、01、10、11(顺序二进制码),也可以用00、01、11、10(格雷码),或0001、0010、0100、1000(独热码)进行编码。

2.状态机的分类

根据不同的分类标准,状态机分为不同的种类:

(1)摩尔型(Moore)状态机和米勒型(Mealy)状态机。

摩尔型状态机:利用组合逻辑将当前状态译码转化为输出,其状态只在全局时钟信号改变时才改变。其最重要的特点就是将输入与输出信号隔离,所以输出稳定,能有效消除竞争冒险。如无特殊功能设计要求,摩尔状态机是设计首选。

图7-50中,“状态译码”部分采用组合逻辑,故称为“下一状态组合逻辑”;“输出译码”部分也采用组合逻辑,故称为“输出组合逻辑”。图7-50摩尔型状态机米勒型状态机:其输出与当前状态和输入都有关,且对输入的响应发生在当前时钟周期,比摩尔型状态机对输入信号的响应要早一个周期。所以输入信号的噪声(毛刺)会直接影响输出信号,即有竞争冒险且不能消除。米勒型状态机如图7-51所示。图7-51米勒型状态机

(2)异步状态机和同步状态机。

异步状态机是没有确定时钟的状态机,其状态转移不由唯一的时钟边沿触发,目前多数综合工具在对异步状态机进行逻辑优化时会胡乱地简化逻辑,使综合后的异步状态机不能正常工作。因此,应尽量不要使用综合工具来设计异步状态机。如果一定要设计异步状态机,建议采用原理图输入或实例引用的方法,而不要用VerilogHDL输入的方法。

为了能综合出有效的电路,用VerilogHDL描述的状态机应明确地由唯一时钟触发,称之为同步状态机,它是设计复杂时序逻辑电路最有效、最常用的方法之一。

异步状态机实现的功能通常都可以由同步状态机来实现。

(3)单进程、双进程和多进程状态机。

可以有三种不同的方式实现对状态机的描述:

①三个模块用一个进程实现,也就是说三个模块均在一个always块内,这种状态机描述称为单进程有限状态机,它既描述状态转移,又描述状态的寄存和输出。

②每一个模块分别用一个进程实现,也就是说三个模块对应着三个always块,这种状态机描述称为三进程有限状态机。

③三个模块对应着两个always块,“状态译码”、“输出译码”分配在一个进程中,“状态寄存器”用另一个进程描述。这种状态机描述称为双进程有限状态机。7.6.2有限状态机的设计方法

1.有限状态机设计流程

状态机的设计流程分为6个步骤,如图7-52所示。

2.有限状态机的一般结构

一个有限状态机的结构(如图7-53所示)总是可以被分为三部分。

(1)状态译码:根据外部输入的控制信号及当前状态(current_state)确定下一状态(next_state)的取值,采用组合逻辑判断状态转移条件,描述状态转移规律。

(2)状态寄存器:采用同步时序描述状态转移,负责状态机运行和在时钟驱动下状态转换的过程。当时钟信号的有效边沿到达时,主控时序过程将代表下一状态的信号next_state中的内容送入当前状态的信号current_state中,而信号next_state中的内容完全由其它过程根据实际情况来决定。

(3)输出译码:描述每个状态的输出。图7-52有限状态机设计流程图7-53有限状态机一般结构

3.有限状态机的建模

传统的数字逻辑电路设计利用状态转换图(StateTransmitionGraph,STG)及状态转换表进行,适用于小型系统的设计,对于大型系统设计,状态转换图及状态转换表会变得很笨重或不可工作。

有限状态机的行为动作是由触发器上的同步时序操作组成的,当状态机处于特定状态时,状态转换图表示由于引入输入而产生的转移,但STG无法直接显示输入数据时状态的演变。这就需要引入另一种时序状态机的描述形式——算法状态机图(ASM,AlgorithmicStateMachine)。

ASM图是硬件算法的符号表示方法,可以方便地表示数字系统的顺序操作。ASM图不同于算法流程,它是一种时钟驱动的流程图。ASM图不仅可以用来描述控制器的控制过程(即控制器的状态转换、转换条件以及控制器输出等),还指明了在被控制的数据处理器中应该实现的操作,即ASM图定义了整个数字系统。

ASM是时序状态机功能的一种抽象,是模拟其行为特性的关键工具,它类似于软件流程图,但显示的是计算动作(如寄存器操作)的时间顺序,以及在状态机输入影响下发生的时序步骤。ASM描述的是状态机的行为动作,而不是存储元件所存储的内容。

1) ASM符号

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论