《verilog-设计可综合状态机指导原则课件.ppt》由会员分享,可在线阅读,更多相关《verilog-设计可综合状态机指导原则课件.ppt(53页珍藏版)》请在三一办公上搜索。
1、第13章 设计可综合的状态机的指导原则,同步状态机可以设计复杂的时序逻辑电路,第13章 设计可综合的状态机的指导原则,同步有限状态机的要素,状态:状态变量,划分逻辑顺序输出:某一状态时完成的事输入:进入某个状态的条件,同步有限状态机的要素状态:状态变量,划分逻辑顺序,有限状态机类型,米勒型状态机摩尔型状态机,有限状态机类型,Mealy 状态机下一个状态 = F(当前状态,输入信号); 输出信号 = G(当前状态,输入信号);,图1 . 时钟同步的状态机结构 (Mealy 状态机),Mealy 状态机下一个状态 = F(当前状态,输入信号),Moor 状态机下一个状态 = F(当前状态,输入信号
2、)输出信号 = G(当前状态);,Moor 状态机下一个状态 = F(当前状态,输入信号,有限状态机FSM标准,FSM要安全,稳定性高FSM速度高,满足设计的频率高FSM面积小,满足设计的面积要求FSM设计要清晰易懂、易维护,有限状态机FSM标准,有限状态机的图形表示,图形表示:状态、转移、条件和逻辑开关,图3.4 状态转移图,有限状态机的图形表示图形表示:状态、转移、条件和逻辑开关图3,有限状态机HDL描述,wire、reg,状态编码用reg型parameter 用于描述状态名称,易读;独热码好always:根据主时钟沿完成同步时序的状态转移根据信号敏感表完成组合逻辑输出根据时钟沿完成同步时
3、序逻辑的输出case/endcase:完成进入每个状态的操作default:状态变量=bx,有限状态机HDL描述,有限状态机的Verilog描述,定义模块名和输入输出端口;定义输入、输出变量或寄存器;定义时钟和复位信号;定义状态变量和状态寄存器;用时钟沿触发的always块表示状态转移过程;在复位信号有效时给状态寄存器赋初始值;描述状态的转换过程:符合条件,从一个状态到另外一个状态,否则留在原状态;验证状态转移的正确性,必须完整和全面。,有限状态机的Verilog描述定义模块名和输入输出端口;,fsm,module fsm (Clock, Reset, A, K2, K1);endmodule
4、,Clock,Reset,A,K2,K1,input Clock, Reset A;,output K2, K1;,reg K2, K1;reg 1:0 state, nextstate ;parameter Idle = 2b00, Start = 2b01, Stop = 2b10, Clear = 2b11;,信号说明,引脚,变量和常量,fsmmodule fsm (Clock, Reset,Mealy 状态机下一个状态 = F(当前状态,输入信号); 输出信号 = G(当前状态,输入信号);,图1 . 时钟同步的状态机结构 (Mealy 状态机),Mealy 状态机下一个状态 = F(
5、当前状态,输入信号),module fsm (Clock, Reset, A, K2, K1);endmodule,表示方法之三(续),信号变量、常量声明,每一个时钟沿产生一次可能的状态变化 state,产生下一状态的组合逻辑 nextstate,产生输出K1的组合逻辑 产生输出K2的组合逻辑,module fsm (Clock, Reset, A,表示方法之三(续),/- 每一个时钟沿产生一次可能的状态变化- always (posedge Clock) begin if (!Reset) state = Idle; else state = nextstate; end/-,表示方法之三(
6、续) /- 每一个时钟沿产生一,表示方法之三(续),/- 产生下一状态的组合逻辑 - always (state or A) case (state) Idle: if (A) nextstate = Start; else nextstate = Idle; Start: if (!A) nextstate = Stop; else nextstate = Start; Stop: if (A) nextstate = Clear; else nextstate = Stop; Clear: if (!A) nextstate = Idle; else nextstate = Clear;
7、default: nextstate =2bxx; endcase,表示方法之三(续)/- 产生下一状态的组合逻辑,表示方法之三(续),/- 产生输出K1的组合逻辑 -always (state or Reset or A) if (!Reset) K1=0; else if (state = Clear /-endmodule,表示方法之三(续)/- 产生输出K1的组合逻辑 -,状态机,module mux2(clk,ina,out);input clk,ina;output out;reg out;reg 1:0 state;parameter s0 = 2b00,s1 =2b01,s2
8、=2b10,s3=2b11;always (posedge clk)beginstate=s0;out =0;,case(state)s0:begin state=(ina=1)?s1:s0; out=0; ends1: begin state=(ina=1)?s2:s0; out=0; ends2: begin state=(ina=1)?s3:s0; out=0; ends3: begin state=(ina=1)?s3:s0; out=1; end endcaseendendmodule,状态机module mux2(clk,ina,out);c,状态机的测试模块,timescale
9、1ns/1nsmodule t; reg a; reg clock,rst; wire k2,k1;initial / initial常用于仿真时信号的给出。 begin a=0; rst = 1; /给复位信号变量赋初始值 clock = 0; /给时钟变量赋初始值 #22 rst = 0; /使复位信号有效 #133 rst = 1; /经过一个多周期后使复位信号无效 end,状态机的测试模块timescale 1ns/1ns,状态机的测试模块,always #50 clock = clock; /产生周期性的时钟always (posedge clock) /在每次时钟正跳变沿时刻产生不
10、同的a begin #30 a = $random%2; / 每次a是 0还是1是随机的。 #(3*50+12); / a 的值维持一段时间 endinitial begin #100000 $stop; end /系统任务,暂停仿真以便观察仿真波形。/- 调用被测试模块t.m - fsm m(.Clock(clock), .Reset(rst),.A(a),.K2(k2),.K1(k1); endmodule,状态机的测试模块 always #50 clock = ,13.2 典型状态机实例,宇宙飞船控制器,宇宙飞船控制器,just_launched,is_landed,abort_miss
11、ion,all_systems_go,clk,launch_shuttle,land_shuttle,start_countdown,start_trip_meter,cnt,13.2 典型状态机实例宇宙飞船控制器宇宙飞船控制器just,13.2 典型状态机实例,宇宙飞船控制器,just_launched,is_landed,abort_mission,/launch_shuttle=1,/land_shuttle=1,/start_trip_meter=1,HOLD,SEQUENCE,LAND,LAUNCH,ON_MISSION,cnt=0,/start_countdown=1,all_sy
12、stems_go,13.2 典型状态机实例宇宙飞船控制器just_launch,module statemachine ( launch_shuttle, land_shuttle, start_countdown, start_trip_meter, clk, all_systems_go, just_launched, is_landed, cnt, abort_mission); output launch_shuttle, land_shuttle, start_countdown; output start_trip_meter; input clk, just_launched,
13、is_landed, abort_mission, all_systems_go; input 3:0 cnt; reg launch_shuttle, land_shuttle, start_countdown, start_trip_meter;/设置独热码状态的参数 parameter HOLD=5b00001, SEQUENCE=5b00010, LAUNCH=5b00100, ON_MISSION=5b01000, LAND=5b10000; reg 4:0 state;,module statemachine ( launch_,always (negedge clk or pos
14、edge abort_mission) begin /检查异步reset的值,即abort_mission的值 if(abort_mission) launch_shuttle, land_shuttle, start_trip_meter, start_countdown= 4b0000; state=LAND; else begin /* 主状态机,状态变量state */ case ( state ) HOLD: if (all_systems_go) begin state = SEQUENCE; start_countdown = 1; end else state = HOLD;
15、SEQUENCE: if (cnt = = 0 ) state = LAUNCH; else state = SEQUENCE;,always (negedge clk or posedg,LAUNCH: begin state = ON_MISSION; launch_shuttle = 1; end ON_MISSION: /取消使命前,一直留在使命状态 if (just_launched) start_trip_meter = 1; else state = ON_MISSION; LAND: if (is_landed) state = HOLD; else begin land_sh
16、uttle = 1; state = LAND; end default: state = 5bxxxxx; endcaseend end/end of alwaysendmodule,LAUNCH: begin,Module clk_3(clkin,reset,clkout);input clkin,reset;reg 1:0 state;reg clk1;always (posedge clkin or negedge reset)if (!reset)state =2b00;else case(state)2b00:state=2b01;2b01:state=2b11;2b11:stat
17、e=2b00;default:state=2b00; endcasealways (negedge clk or negedge reset)if (!reset)clk1=1b0;elseclk1=state0;assign clk_out=state0endmodule,Module clk_3(clkin,reset,clkou,13.3 综合的一般原则,综合之前要仿真布局布线要仿真不用异步状态机电平敏感的锁存器最好用连续赋值语句,13.3 综合的一般原则综合之前要仿真,13.4 语言指导原则,Always块只能有一个事件控制“(event expression)”可表示时序逻辑,也可表
18、示组合逻辑(不推荐)两个沿posedge negedge 产生时序逻辑电路时序always块最好一个沿触发(同步)每个always块中被赋值的信号应是reg型Always (敏感电平列表)块表示组合逻辑,参与赋值的信号必须在敏感列表中出现,13.4 语言指导原则Always块,13.4 语言指导原则,赋值对寄存器(reg)和整型(integer)变量赋值只能在一个always块中进行把某一个信号赋值为bx,综合器解释为无关状态,其形成的硬件电路最简单,13.4 语言指导原则赋值,13.5 可综合风格的模块实例,13.5.1组合逻辑电路设计实例,【13.1】8位带进位加法,module adde
19、r_8(cout,sum,a,b,cin);outputcout;output7:0sum;inputcin;input7:0a,b;assigncout,sum=a+b+cin;endmodule,13.5 可综合风格的模块实例13.5.1组合逻辑电路设计实,13.5.1 组合逻辑电路设计实例,【13.2】指令译码电路的设计实例(利用电平敏感的always块来设计组合逻辑),/操作码的宏定义define plus 3d0define minus 3d1define band 3d2define bor 3d3define unegate 3d4,13.5.1 组合逻辑电路设计实例【13.2】
20、指令译码电路的,【13.2】指令译码电路的设计实例(利用电平敏感的always块来设计组合逻辑),module alu (out,opcode,a,b); output 7:0 out; input 2:0 opcode; input 7:0 a,b; reg 7:0 out; always (opcode or a or b)/用电平敏感的always块描述组合逻辑 begin case(opcode) plus: out=a+b; /算术运算 minus: out=a-b; band: out=a endcase endendmodule,【13.2】指令译码电路的设计实例module a
21、lu (o,【13.3】利用task和电平敏感的always块设计比较后重组信号的组合逻辑.,module sort4(ra,rb,rc,rd,a,b,c,d); parameter t=3; output t:0 ra, rb, rc, rd; input t:0 a, b, c, d; reg t:0 ra, rb, rc, rd; always (a or b or c or d) /用电平敏感的always块描述组合逻辑 begin : local /此处begin - end块必须有一模块名因为块中定义了局部变量 reg t:0 va, vb, vc, vd; va,vb,vc,vd
22、=a,b,c,d; sort2(va,vc); sort2(vb,vd); sort2(va,vb); sort2(vc,vd); sort2(vb,vc); ra,rb,rc,rd=va,vb,vc,vd; end,【13.3】利用task和电平敏感的always块设计比较后,【13.3】利用task和电平敏感的always块设计比较后重组信号的组合逻辑.,task sort2; inout t:0 x, y; reg t:0 tmp; if( x y ) begin tmp = x; x = y; y = tmp; end endtaskendmodule,【13.3】利用task和电平敏
23、感的always块设计比较后,【13.4】比较器的设计实例(利用赋值语句设计组合逻辑),module compare(equal,a,b);parameter size=1;output equal;input size-1:0 a, b;assign equal =(a=b)? 1 : 0;endmodule,【13.4】比较器的设计实例(利用赋值语句设计组合逻辑)mo,【13.5】3-8译码器设计实例(利用赋值语句设计组合逻辑),module decoder(out,in);output 7:0 out;input 2:0 in;assign out = 1b1in;/* 把最低位的1左移
24、 in(根据从in口输入的值)位,并赋予out */endmodule,【13.5】3-8译码器设计实例(利用赋值语句设计组合逻辑),【13.6】8-3编码器的设计实例/编码器设计方案之一:,module encoder1(none_on,out,in); output none_on; output 2:0 out; input 7:0 in; reg 2:0 out; reg none_on; always (in) begin: local /此处begin - end块必须有一模块名 integer i; out = 0; none_on = 1; /*returns the valu
25、e of the highest bit number turned on*/ for( i=0; i8; i=i+1 ) if( ini ) begin out = i; none_on = 0; end endendmodule,【13.6】8-3编码器的设计实例module encode,【13.6】8-3编码器的设计实例/编码器设计方案之二:,module encoder2 ( none_on, out2, out1, out0, h, g, f, e, d, c, b, a); input h, g, f, e, d, c, b, a; output none_on, out2, o
26、ut1, out0; wire 3:0 outvec; assign outvec= h? 4b0111 : g? 4b0110 : f? 4b0101: e? 4b0100 : d? 4b0011 :c? 4b0010 : b? 4b0001: a? 4b0000 : 4b1000; assign none_on = outvec3; assign out2 = outvec2; assign out1 = outvec1; assign out0 = outvec0;endmodule,【13.6】8-3编码器的设计实例module encode,【13.6】8-3编码器的设计实例(方案之
27、三),module encoder3 (none_on, out2, out1, out0, h, g,f, e, d, c, b, a);input h, g, f, e, d, c, b, a;output out2, out1, out0,none_on;reg 3:0 outvec;assign none_on,out2,out1,out0 = outvec;always ( a or b or c or d or e or f or g or h) if(h)outvec = 4b0111; else if(g)outvec = 4b0110; else if(f)outvec =
28、4b0101; else if(e)outvec = 4b0100; else if(d)outvec = 4b0011; else if(c)outvec = 4b0010; else if(b)outvec = 4b0001; else if(a)outvec = 4b0000; elseoutvec = 4b1000;endmodule,【13.6】8-3编码器的设计实例(方案之三)module,【13.7】多路器的设计实例(方案之一),modul emux1(out, a, b, sel);output out;input a, b, sel;assign out = sel? a :
29、 b;endmodule,使用连续赋值、case语句或if-else语句可以生成多路器电路,如果条件语句(case或if-else)中分支条件是互斥的话,综合器能自动地生成并行的多路器。,【13.7】多路器的设计实例(方案之一)modul emux,【13.7】多路器的设计实例(方案之二),module mux2( out, a, b, sel); output out; input a, b, sel; reg out; /用电平触发的always块来设计多路器的组合逻辑 always ( a or b or sel ) case( sel ) 1b1: out = a; 1b0: out
30、= b; default: out = bx; endcaseendmodule,【13.7】多路器的设计实例(方案之二)module mu,【13.7】多路器的设计实例(方案之三),module mux3( out, a, b, sel);output out;input a, b, sel;reg out;always ( a or b or sel )begin if( sel ) out = a; else out = b;endendmodule,【13.7】多路器的设计实例(方案之三)module mux,【13.8】奇偶校验位生成器设计实例,module parity( even
31、_numbits,odd_numbits,input_bus);output even_numbits, odd_numbits;input 7:0 input_bus;assign odd_numbits = input_bus;assign even_numbits = odd_numbits;endmodule,【13.8】奇偶校验位生成器设计实例module parit,【13.9】 三态输出驱动器设计实例(用连续赋值语句建立三态门模型)三态输出驱动器设计方案之一:,module trist1( out, in, enable);output out;input in, enable;
32、assign out = enable? in: bz;endmodule,【13.9】 三态输出驱动器设计实例module trist,【13.9】 三态输出驱动器设计实例(bufif1是 一个 Verilog门级原语(primitive)三态输出驱动器设计方案之二:,module trist2( out, in, enable );output out;input in, enable;/bufif1是 一个 Verilog门级原语(primitive)bufif1 mybuf1(out, in, enable);endmodule,【13.9】 三态输出驱动器设计实例module tri
33、st,【13.10】三态双向驱动器设计实例,module bidir(tri_inout, out, in, en, b);inout tri_inout;output out;input in, en, b;assign tri_inout = en? In : bz;assign out = tri_inout b;endmodule,【13.10】三态双向驱动器设计实例module bidir,【13.11】触发器设计实例,module dff( q, data, clk);output q;input data, clk;reg q;always ( posedge clk )begi
34、n q = data;endendmodule,【13.11】触发器设计实例module dff( q, d,【13.12】电平敏感型锁存器设计实例之一,module latch1( q, data, clk);output q;input data, clk;assign q = clk? data : q;endmodule,【13.12】电平敏感型锁存器设计实例之一module la,【13.13】带置位和复位端的电平敏感型锁存器设计实例之二,module latch2( q, data, clk, set, reset);output q;input data, clk, set, r
35、eset;assign q= reset? 0 : ( set? 1:(clk? data : q ) );endmodule,【13.13】带置位和复位端的电平敏感型锁存器设计实例之二m,【13.14】电平敏感型锁存器设计实例之三,module latch3( q, data, clk);output q;input data, clk;reg q;always (clk or data) if(clk) q=data; endmodule,【13.14】电平敏感型锁存器设计实例之三module la,【13.15】移位寄存器设计实例,module shifter( din, clk, cl
36、r, dout);input din, clk, clr;output 7:0 dout;reg 7:0 dout;always (posedge clk) if(clr)/清零 dout = 8b0; else begin dout = dout1; /左移一位 dout0 = din; /把输入信号放入寄存器的最低位 endendmodule,【13.15】移位寄存器设计实例module shifter,【13.16】八位计数器设计实例之一,module counter1( out, cout, data, load, cin, clk);output 7:0 out;output cou
37、t;input 7:0 data;input load, cin, clk;reg 7:0 out;always (posedge clk)if( load ) out = data;else out = out + cin;assign cout=( /只有当out7:0的所有各位都为1/并且进位cin也为1时才能产生进位coutendmodule,【13.16】八位计数器设计实例之一module count,【13.16】八位计数器设计实例之二,module counter2( out, cout, data, load, cin, clk);output 7:0 out;output c
38、out;input 7:0 data;input load, cin, clk;reg 7:0 out, preout;reg cout;always (posedge clk)out = preout;always ( out or data or load or cin )begin cout, preout = out + cin; if(load) preout = data; endendmodule,【13.16】八位计数器设计实例之二module count,带异步高电平有效的置/复位端的D触发器实例,module dff2( q, qb, d, clk, set, reset)
39、;input d, clk, set, reset;output q, qb;reg q, qb;always (posedge clk or posedge reset ) if(reset) begin q=0; qb=1; end else if(set) begin q=1; qb=0; end else begin q=d; qb=d; endendmodule,带异步高电平有效的置/复位端的D触发器实例module df,同步高电平有效的置位/复位端的D触发器,module dff2( q, qb, d, clk, set, reset);input d, clk, set, reset;output q, qb;reg q, qb;always (posedge clk) if(reset) begin q=0; qb=1; end else if(set) begin q=1; qb=0; end else begin q=d; qb=d; endendmodule,同步高电平有效的置位/复位端的D触发器module dff2,