|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
" S; L Z6 T, ?' \' r- q
% q- A) E2 ?" {8 o4 F% q5 Q; Vverilog学习笔记
' ~. V! y# c, X& U4 V4 r$ z7 n. i(1)独热(one-hot)码: C" R+ [- [; {# I/ o- P
所谓的独热码是指对任意给定的状态,状态向量中只有1位为1,其余位都是为0。n状态的状态机需要n个触发器。这种状态机的速度与状态的数量无关,仅取决于到某特定状态的转移数量,速度很快。当状态机的状态增加时,如果使用二进制编码,那么状态机速度会明显下降。而采用独热码,虽然多用了触发器,但由于状态译码简单,节省和简化了组合逻辑电路。独热编码还具有设计简单、修改灵活、易于综合和调试等优点。对于寄存器数量多、而门逻辑相对缺乏的FPGA器件,采用独热编码可以有效提高电路的速度和可靠性,也有利于提高器件资源的利用率。独热编码有很多无效状态,应该确保状态机一旦进入无效状态时,可以立即跳转到确定的已知状态。通过独热码可是实现简单的有限状态机。 # R7 T/ O/ I7 E5 D0 w
(2)有限状态机(Finite State Machine). a: Y* {: P# Y1 W$ {+ u
Mealy 机是基于它的当前状态和输入生成输出的有限状态自动机。: d& B- P6 ]* \1 K
Moore 机是输出只由当前状态自己(不直接依赖于输入)确定的有限状态自动机。
: F* b; P+ c! qVerilog HDL常用三个always块描述同步Mealy状态机,两个时序always块分别用于描述现状态逻辑和对输出赋值,组合always块用户产生下一个状态。优点是:寄存器输出,输出无毛刺,并且代码比单always块清晰易读。缺点是:面积大于双always块。
4 q, V4 ]$ |: r2 V! H, S. C有限状态机最重要的是状态转移条件和当前的状态以及当前的输入。
% B" Q2 t7 ]1 k9 O* V$ D下面以三always块模块给出状态机的Verilog模板。 * `1 S2 U3 A- C4 a
// 构成状态跳转环
l: t4 J; e$ e5 k! xalways @(posedge clk or negedge rst_n) ' Q* M0 S) } R; p% T
current_state <= next_state;
' k; A3 }2 \: i: Y# J) d// 完成状态机的内部逻辑 . e4 K. J" [6 M5 ? U% M6 D0 D
always @ (current_state or ) begin ) M8 R1 s# q+ f$ c# b
case(current_state)
1 X: n1 F- {/ ~- G* y+ @) Y, J7 w- k S1: next_state = S2; " Y! k( T- z4 Y$ `* F
S2: next_state = S1; $ V, p5 D7 \: J7 s
default: next_state = S2; " Z5 [$ n2 h( q8 V& z, u& `
endcase
! c2 v% w z1 C2 Q Fend . ~6 g$ c9 I9 B/ l5 G* ~8 D
// 完成状态机的外部逻辑
+ J' K0 g9 ^7 T4 talways @(current_state or ) begin
w4 x# z1 e7 L1 J l: f8 h case(current_state)
* j6 @( I& J1 e) e+ c# K S1: ; V$ t3 q8 g5 U% D
S2: ( S+ I; F# \; s3 D
default:
Z$ [; M5 u4 V3 {# K! @# p endcase ! a: { r5 y/ P! f4 z @
end
9 Q3 @: m; z9 \$ L: E(3)综合状态机的一般原则 在硬件描述语言中,许多基于仿真的语句虽然符合语法规则,但是不能映射到硬件逻辑电路单元,如果要最终实现硬件设计,必须写出可以综合的程序。通常,综合的原则为:
4 y# h: H1 s1 [- A$ ]. ~
, p3 Z; C: X. v8 y( n综合之前一定要进行仿真,仿真会暴露逻辑错误。如果不做仿真,没有发现的逻辑错误会进入综合器,使综合的结果产生同样的逻辑错误。 每一次布线之后都要进行仿真,在器件编程或流片之前一定要进行最后的仿真。5 ?( ]; l( P# c% J; T; M# g
! r3 `& i/ t7 i, V4 m用Verilog HDL描述的异步状态机是不能综合的,应该避免用综合器来设计。在必须设计异步状态机时,建议用电路图输入的方法 0 m# R+ x0 k W1 w# i% R
状态机应该有一个异步或同步复位端,以便在通电时将硬件电路复位到有效状态。建议使用异步复位以简化硬件开销。
' n$ B( k' W& o: X! R
1 X% C& J( E- _' B% n1 y% ]! ]时序逻辑电路建模时,用非阻塞赋值。用always块写组合逻辑时,采用阻塞赋值。不要在多个always块中为同一个变量赋值。; o+ U9 g3 O/ _0 m7 D% @
; d u% x; X' g# d3 f9 [$ Y& r) K- g* Jalways块中应该避免组合反馈回路。在赋值表达式右端参与赋值的信号都必须出现在敏感信号列表中,否则在综合时,会为没有列出的信号隐含地产生一个透明锁存器。; @- e a" K$ Z, ]9 j: q
|
|