EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 FPGA技术江湖 于 2023-2-22 17:13 编辑 / u2 X- I$ S* `- p/ Q
; f6 q( V9 |! ]# M7 b; a 1 p' {" ~: N% Q6 w5 `" g
大侠好,欢迎来到FPGA技术江湖。本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。
, }+ \# U$ T0 G) B: l
# a' k' x. k% c! S/ E
) \+ }+ }- ?0 r. M1 N# A6 r 系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。后续会陆续更新 Xilinx 的 Vivado、ISE 及相关操作软件的开发的相关内容,学习FPGA设计方法及设计思想的同时,实操结合各类操作软件,会让你在技术学习道路上无比的顺畅,告别技术学习小BUG卡破脑壳,告别目前忽悠性的培训诱导,真正的去学习去实战应用,这种快乐试试你就会懂的。话不多说,上货。 , X$ |1 k0 @8 a: d& a% i# j
" I7 h. m9 I7 i2 e& r- P3 I) Z4 F
1 h6 b4 y6 r- B+ ^9 `9 c: r; n1 p' g6 v
( d9 h4 P' }$ U9 H' a4 r( b O/ T
数字电路中的时序逻辑 $ [" a$ x: h2 P0 W/ A! M! U$ ]
6 L1 Q& f9 u8 h& V% s" J
% h; @ N$ w/ G E3 V/ |3 E5 H) U! M6 h; a$ o- J: @" Z( P
( i' V, `3 A+ V; w% ^) F6 @
在各种复杂的数字电路中,不但需要对二值信号进行算数运算和逻辑运算,还经常需要将这些信号和运算结果保存起来。为此,需要使用具有记忆功能的基本逻辑单元。能够存储1位的二进制数码的单元电路称为触发器。 ; f5 h+ U [7 s, o' e) R
6 G/ L0 G( S3 D0 R. C" e+ g为了实现记忆1位二值信号的功能,触发器必须具备以下两个基本特点:
. {+ z# ~" K; S
- S# L; z+ \2 @ · 具有两个能自行保持的稳定状态,用来表示逻辑状态的0和1,或二进制数的0和1。
! y$ }) _% E# U% I" r
· 在触发信号的操作下,根据不同的输入信号可以置成1或0状态 $ P- k# Z- t7 r f: @
· 由于采用的电路结构形式不同,触发信号的触发方式也不一样。触发方式分为电平触发、脉冲触发、边沿触发三种。 4 T1 z3 N( v2 A& K) n, y
1 s" t q( ^7 L- w8 Z$ Q SR锁存器是各种触发器电路的基本构成部分。
* P( S$ a) R1 i3 G) @. z % Y. n, ?5 \, C I( b
& T; B' j' O/ C; h r( O/ T* M
& o: i3 W' p# R6 Q G & n+ a3 H( y4 Q* ^' h8 |9 a5 s
* U' [: N4 Y# _5 J+ H% \, M
图1 :SR锁存器(或非门)的电路结构和图像符号 5 Z4 ]3 m% K8 N( V8 w3 A
) m: Q& j- B; C5 e7 w
! ], O2 ~: W2 p- n& Z 从电路结构中可以看出,它是由两个交叉反馈或非门组成的。它有两个输入端,SD表示置位,RD表示复位,输入端为1时表示有激励信号,为0时表示无激励信号;有两个输出端,Q是输出,正常工作时,Q’是Q的反变量。 / V2 ]6 P: Q" U* C% V) u& L
; R9 V6 g O2 E% Y7 g! P& v, J 思考:分析SR锁存器(或非门构成)的工作原理? * ]6 L5 ]" Q# d
. C' x( S6 d( y3 [ · 当RD =0,SD=1时,不论触发器的初始状态如何,Q’一定为0,由于“与非”门G1的输入全是0,Q端为1。称触发器为1状态,SD为置1端。 0 O. A6 T. T# m0 d: A5 d
· 当RD =1,SD=0时,不论触发器的初始状态如何,Q’一定为1,从而使Q为0。称触发器为0状态,RD置0端。 G5 O# w0 S- w3 }& ]
· 当RD =0,SD =0时,如前所述,Q及Q’状态保持原状态不变。
/ I8 U4 Y+ i" i
· 当RD =1,SD =1时,不论触发器的初始状态如何,Q=Q’=0,若RD、SD同时由1变成0,在两个门的性能完全一致的情况下, Q及Q’哪一个为1,哪一个为0是不定的,在应用时不允许RD和SD同时为1。 ' X- G) z# ^0 [6 D* B2 Y
· SR锁存器也可以用与非门构成。
4 X& g$ h: d3 @- c, d
5 P( X X" _% V1 z
- O. G) T; ~, `# G/ k3 F* K- Q- X6 w
图2 :SR锁存器(与非门)的电路结构和图像符号
; X" d2 t, ? N- M
: D& M. i+ y' W1 r( Q / `; j5 K% O" n; I8 ^' @+ \" \* @
- c" J, ~3 ?7 F6 ^' @1 O
3 _. \$ B' H: ?4 U. ~ 与非门构成的SR锁存器的工作原理和或非门构成的SR锁存器类似,具体不在叙述。
: } U( E. k. }4 Q& ~
4 R W, j/ T) G* b0 [
g& c! W! c& s$ @. { 在电平触发的触发器电路中,除了置1、置0输入端以外,又增加了一个触发信号输入端。只有触发信号变为有效电平后,触发器才能按照输入的置1、置0信号置成相应的状态。将触发信号记作CLK。 t7 B* L- b1 C7 s( ~% l' k
( S/ i1 n; U- y: H+ V
O% K* y5 l* {+ G$ a9 B# @+ g9 |
5 w/ T( B( X" [# L* g, z1 U4 e A5 E$ e/ z) c
图3 :电平触发的SR触发器的电路结构和图形符号
2 |% n5 F" x9 N! k$ c" O
* n" C- |! L7 V+ t2 y
( m# o: D, R: s9 K 思考:电平触发的SR触发器的工作原理? " f/ U* `* Q4 b3 K% j
) W* a& ^" a9 h b8 n5 w
7 g4 d/ j# }$ ~5 y; H5 F4 i; E: N 在某些应用场合,有时需要在CLK的有效电平到达之前预先将触发器置成指定状态,为此,在实用的电路上往往设置有异步置1输入端SD‘和异步置0输入端RD’。 ; ]" t' P5 l1 ]; k
5 c5 d* N( h4 m2 v" p P, }
6 g3 U7 W, U0 J/ W 3 L+ y, N y3 y! j$ J/ S
7 v8 U0 ]3 Z5 L9 K5 i图4:带有异步置位、复位端的电平触发的SR触发器的电路结构和图形符号 8 j4 |) r& @6 D9 |. M
) ~, X5 {- g! g0 v/ ?
2 m# \6 P# N+ C# {3 b1 A/ \
7 h8 e1 B8 \4 Y- c( w& T% z9 ~. s% ]# Y5 H: n a) U$ n
思考 :带有异步置位、复位端的电平触发的SR触发器的工作原理?
3 `& \3 J- I5 v1 W2 Z; o
! X0 ?- G/ y- y9 L
( C d; j% ^9 h 为了能适应单端输入信号的需要,在一些集成电路产品中,将电平触发的SR触发器经过修改,得到了电平触发的D触发器,也称D型锁存器。
+ _$ D) T' w9 }$ w. \4 n/ C8 m$ ^9 |1 H
L" x6 O4 P! D$ I6 h$ _
4 i7 P D. B: ^; A# o; H. m) D8 |9 D, ^( ^/ ~
图5:电平触发的D触发器的电路结构和图形符号 ; _9 N: S, m( d# E5 K5 D
, ], _7 { N3 O' D g& l
7 Y6 I5 v) @! F% @# G
& q* D0 v g" `( X. O2 q
思考 :电平触发的D触发器的工作原理。
! a! D, H4 s" N. w, u! o7 l( h0 M+ q6 z( r5 N& Q5 q/ e
在CMOS电路中,经常利用CMOS传输门组成电平触发D触发器,如图6。 ( K& `" S/ U% e0 s. Z! r1 f9 t
9 k/ V( B1 c) B: Z9 X
9 R4 J: |5 i9 w- ^9 Z
+ K: A2 G) y* g
h) G1 x. _( j# ^& _. c9 O& n' f$ B+ ]2 H
0 {7 I: e: y6 x" c3 O; N图6 :利用CMOS传输门组成的电平触发的D触发器
; w. v$ P0 u ^, ?
" ]# J+ ?+ ^) a# Y) y! Q7 b, N7 m
Q3 f' O1 |, {, H$ R) t7 e! T2 f+ g& f' g6 o& [0 y
在CLK的有效电平期间输出状态始终跟随输入状态变化,输出与输入的状态保持相同,所以又将这个电路称为“透明的D型锁存器”。
% E3 q0 y+ u! W ]* G+ c2 }8 U
z, X8 s; L! o: l5 e. _( x9 }. v8 P! n- f; z# d; Z
为了提高触发器工作的可靠性,希望在每个CLK周期里输出端的状态只能改变一次。因此,在电平触发的触发器的基础上,设计了脉冲触发的触发器。
1 m o$ O% p. d5 x4 g a$ b
' p5 c6 Z8 B: r' y% J5 l7 d+ t$ B' f* k% v
0 k3 d; T( P" G9 h/ [; _ x" e# T9 X. M
图7 :主从SR触发器的电路结构和图形符号
" Z D! S5 F1 K7 z3 u7 ?
# Q9 a! o; }; A* d b4 N' m( t! z. V& e2 q& M. r/ G: n; O
思考 :主从SR触发器的工作原理?
: B1 P' i% H o. s6 o# g& t: X 9 d; m% O! u' N7 _
在使用主从结构触发器时经常会遇到这样的一个情况,就是在CLK=1期间输入信号发生过变化以后,CLK下降沿到达时从触发器的状态不一定能按照此刻输入信号的状态来确定,而必须考虑整个CLK=1期间输入信号的变化过程才能确定触发器的次态。
% r& A+ k, R* D+ M9 I. Q ' r* r* |2 `% ~; V
例:在CLK=1时,首先将S=1;R=0;此时主触发器置1。然后S=0,R=0,此时主触发器依然是置1的。当CLK=0时,从触发器就会按照置1的方式去驱动,而不是S=0,R=0的情况。
: ~! A W% C; f. F2 p2 l 1 H* n6 m3 F5 Q/ n7 n( @. [
& R2 w: T+ @4 x2 I% P3 F
为了使用方便,希望即使出现了S=R=1的情况,触发器的次态也是确定,因而需要进一步改进触发器的电路结构。因此设计了主从结构JK触发器。
. ?( ], J. D" u* W: V
1 m- k: l/ v' m) x& v
* V8 C6 C, O% ^4 q3 s* k$ l( v$ a- P9 ^! v6 e7 ]
$ }% b9 _9 e0 z5 ]' L6 A4 |
3 Q' G; r& @$ e: A4 o( ~: u! b
; ?) n$ c( q% |) x1 M( T; D" V3 A图8 :主从结构JK触发器的电路结构和图形符号 , Z: E8 }- _! j: R9 h; G9 L- ?
1 X. _7 r/ S y' H" s ' v! A3 f, L- @$ p
; B+ f7 C1 L" f; O 思考 :主从结构JK触发器的工作原理?
! |* k9 Z2 _% S/ g Y1 n, w
8 d+ p4 J+ [' n7 v# W# a
# E6 H+ |8 E. _ U j 为了提高触发器的可靠性,增强抗干扰能力,希望触发器的次态仅仅取决于CLK信号下降沿(或上升沿)到达时刻输入信号的状态。而在此之前和之后输入状态的变化对触发器的次态没有影响。为实现这一设想,设计了用两个电平触发的D触发器组成的边沿触发器。 - j8 {4 _" D" m% M v
( S9 u8 \( `1 [/ D2 t
5 C2 v+ d; q; G7 h- M( m% u- a; D
$ ]3 d( |3 A8 u6 W* U: H! C1 _7 x. `- W2 U1 k V+ H
' ?, k) N( D5 y" ]7 k2 P4 K0 Y8 [' h/ f, c: A" E/ w/ G7 z0 } U, Z
图9 :用两个电平触发的D触发器组成的边沿触发器
# z& ~& X- X8 a$ a# r8 J& g4 [- { . D# S/ F8 P* a0 y n! @
. a8 x1 j% r, b- x6 f6 s2 b' s
2 \' ?$ y& g! o5 l" \3 g$ |
* A( C* u' R# o" D/ s, [% C+ f! `; V# s. D# G: v6 `
图10 :CMOS边沿触发D触发器 ' J$ d, r; E% L: ^! T$ e
+ |% g& F3 q0 {0 ^1 c0 M
; n& l* {( t; m; N; G
3 ~% L7 I, T% b# X$ B
8 y1 e( r( O+ }6 N, L# r( z. r4 c% ^5 Y
图11 :带有异步置位、复位端的CMOS边沿触发D触发器 & _0 ^" B( j! i4 E/ q
6 }8 Q, y6 H3 k" p5 d- x
; J! J2 C9 f( P0 ?. r3 J s: e. i- y; v$ P( ^, o+ ?( l
. y( N7 o1 n% @
思考:分析边沿触发的D触发器的工作原理?
0 g) [. T& F! m1 s* k9 q- }2 f
' O0 i5 U& B) R/ g
) _2 j5 [5 J% o$ e; a6 g, z$ Q0 e, {8 ?0 Y
为了保证触发器在工作时能可靠地翻转,对于输入信号、时钟信号以及它们互相配合关系的都有一定的要求。
( s- e/ }; J$ R P* d输入信号的宽度有一定的要求;各个单元电路都有一定的延迟,输入信号给定后,输出信号会延迟一段时间才会出现;输入信号要求在CLK有效沿到来之前的一段时间内稳定,这段时间称为建立时间;输入信号要求在CLK有效沿过去之后的一段时间内稳定,这段时间称为保持时间;CLK的变化频率会有一定的上限。对于每个具体型号的集成触发器,可以从手册上查到这些动态参数,在工作时应符合这些参数所规定的条件。
8 ?1 i" @( }* R& F# w$ w) V; C! R2 K1 v* [! ?4 X* V7 Y) C
组合逻辑电路中,任一时刻的输出信号仅取决于当时的输入信号。时序逻辑电路(简称为时序电路)中,任一时刻的输出信号不仅取决于当时的输入信号,而且还取决于电路原来的状态,或者说,还与以前的输入有关。
" |' B+ H0 M6 a) R7 Z1 V) D9 Y: A# w! ^5 p0 {( D
例如:目前需设计一个自动售货机,贩卖售价为三元的饮料,要求每次只能投入一个一元的硬币。可想而知,我们投入第一个硬币没有反应;投入第二个硬币没有反应;当我们投入第三个硬币时,售货机会给我们一瓶饮料。如果内部是组合逻辑的话,三次投硬币的输入并没有任何改变,但是产生了不同的结果,显然内部结构不是单纯的组合逻辑。内部的功能有一定的记忆性功能,能够清楚的记得之前我们投入的硬币的数量。
( s2 u1 v6 @0 M3 J1 |( o( T; m/ ]6 f6 E7 T; @1 k
时序逻辑电路 = 组合逻辑电路 + 时序逻辑器件(触发器)。
2 Y5 Q. T& n5 y6 d5 g; [
$ ]$ D8 L( V6 ~4 H) T 根据输出信号的特点将时序电路划分为米利型(Mealy)和穆尔型(Moore)两种。在米利型电路中,输出信号不仅取决于存储电路的状态,而且还取决于输入变量;在穆尔型电路中,输出信号仅仅取决于存储电路的状态。穆尔型电路只不过是米利型电路的一种特例而已。
4 m; ?# F2 K7 T7 H6 s
4 G4 x6 l& ?8 a( m' I6 m 鉴于时序电路在工作时是在电路的有限状态间按一定的规律转换的,所以又将时序电路称为状态机(state machine SM)或算法状态机(algorithmic state machine ASM)。
计数器的时序电路如下: ; q X) @! r% S" s7 o' T
- o1 T- K' I/ ~1 E* f6 S
( W9 i! K3 Q! U$ L5 G图12 :计数器(自加一)电路结构
* N2 }/ c! Z7 l+ f+ W 思考 :分析计数器(自加一)工作原理?
# ]2 E0 G* p7 g1 S0 Q
: j" u6 ?# a3 i- M& y5 n 寄存器(Register)用于寄存一组二值代码,它被广泛地用于各类数字系统和数字计算机中。一个触发器能储存1位二值数码,用N个触发器组成的寄存器能够储存一组N位的二值数码。
' F" J( x8 j H) R ^
& d5 k, y2 o# ?0 \$ N( Z8 f 状态转换表:若将任何一组输入变量以及电路初态的取值代入状态方程和输出方程,即可算出电路的次态和现态下的输出值;以得到的次态作为新的初态,和这时的输入变量一起再代入状态方程和输出方程进行计算,又得到一组新的次态和输出。如此进行下去,将全部的计算结果列成真值表的形式,就得到了状态转换表。
, c& N2 m! E! ?( J: L4 f
' Q' ]9 F4 _' x$ \. k 状态转换图:在状态转换图中以圆圈表示电路的各个状态,以箭头表示状态的转换方向。在箭头的旁边注明了状态转换前的输入变量取值和输出值。通常将输入变量取值写在斜线以上,将输出值写在斜线以下。当没有输入变量时,斜线上方不写任何东西。
+ y; F# c" L, w f- ?% L
4 K7 L6 I: c% l图13 :状态转移图(示例) 简单时序逻辑电路的设计方法如下: 8 n/ G \# f& x) i5 C
逻辑抽象,得出电路的状态转换图或状态转换表。 : Z/ g6 w0 B7 l* X% i1 J J
5 Y: ?+ h' n: i: Q* B" O 状态化简 # U9 f& L8 Z3 t
/ C( C% ]( i$ `4 ?- V6 n B% A 若两个电路状态在相同的输入下有相同的输出,并且转换到同样一个状态去,则称这两个状态为等价状态。显然,等价状态是重复的,可以合并为一个。电路的状态数越少,设计出来的电路就越简单。状态化简的目的就在于将等价状态合并,以求得最简的状态转移图。
4 {0 h. O1 Y0 u0 s* e2 j" o5 i1 \4 Y% L8 M; S1 S9 k
状态分配
+ c- j; }3 Y) x) M- B# M
· 状态分配又称状态编码。时序逻辑电路的状态是用触发器状态的不同组合来表示的。首先,需要确定触发器的数目n。因为n个触发器共有2的n次幂种状态,要保证触发器能表示的状态数要大于等于设计需要的状态数。 7 @9 ~) l: o8 }: o
· 选定触发器的类型,求出电路的状态方程、驱动方程和输出方程 , h0 U, B- S& o( ^$ a& U) ?% l/ d
· 根据得到的方程式画出逻辑图
! n( U0 M; a! V3 u
· 检查设计的电路能够自启动 9 C% }$ N" L$ f8 `5 w
. q& L8 H0 K6 @5 |! L8 u* K1 ` 在设计复杂的时序电路时,通常采用层次化结构设计方法,或者称为模块化设计方法。层次化结构设计方法有“自顶向下”(top - to - down)和“自底向上”(bottom - to - up )两种做法。采用自顶向下的做法时,首先需要将所设计电路的功能逐级划分为更简单的功能模块,直到这些模块都能用简单的逻辑电路实现为止。由于自顶向下划分模块的过程中完全从获得最佳电路性能触发的,并未考虑这些模块电路是否已经有成熟的设计存在了,所以必须从头设计每个模块电路,然后进行仿真和测试。在发现问题时,还需要反复修改。
) w( M1 n d1 T7 Z5 p0 p/ P5 ~2 P( H ; a, l7 x2 O* R: G- Y" {# } g
在采取自底向上的做法时,首先要考虑有哪些已有的,成熟的模块电路可以利用。这些模块电路可能是标准化的集成电路器件,也可能是经过验证的电路单元。将电路划分为功能块时,最后要划分到能利用这些已有的模块电路来实现为止。直接采用这些模块电路能大大减少设计的工作量。然而有时由于需要迁就已有的模块电路,这就会使电路的某些性能收到一些影响。另外,也不可能任何一种功能模块都有现成的成熟设计,因此多数情况下都采用自顶向下和自底向上相结合的方法,以求达到既能满足设计要求,又能提高设计速度、降低设计成本的目标。 + R6 M% E1 w. h( F5 G4 Q0 J# o
, F: I& d+ W. G) C 时序逻辑电路通常包含组合逻辑电路和存储电路(触发器)两个组成部分。所以它的竞争-冒险现象也包含两个方面。
- o" L7 \) t' \5 p ( J' M, H O# u8 d% b. h
组合逻辑电路可能发生竞争-冒险现象。产生原因和方法已经在1.4组合逻辑中叙述过,不在过多叙述。 " B5 L, ?9 |, z
6 \: U2 B3 n' y+ ^) K6 n1 p8 X) G0 L
触发器在工作工程中也有可能发生竞争-冒险现象。为了保证触发器可靠地翻转,输入信号和时钟信号在时间配合上应满足一定的要求。然而当输入信号和时钟信号同时改变,而且途径不同路径到达同一触发器时,便产生了竞争。竞争的结果有可能导致触发器误动作,这种现象称为存储电路(触发器)的竞争-冒险现象。 & N5 Y; W1 q& n6 e! G
# w6 e: G @9 {* G |) p3 [ 在大多数的时序逻辑电路中,我们都可以分解成为一个带有“变化”数据功能的组合逻辑和一个带有“存储”数据功能的触发器。在组合逻辑如何避免竞争冒险时,我们给出一种解决方案:引入选通脉冲。也就是在数据稳定后,选通脉冲再过来。那么现在,如果组合逻辑后续电路是经过触发器存储的,那么可以直接把选通脉冲当作触发器的CLK。只要能够确定CLK是在数字稳定后有效的,那么对于时序逻辑电路就没有竞争冒险。 + @, y+ W% C% z! q ^
+ c o. K% q. l2 b4 h4 h7 s& h |