版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第13章设计可综合的状态机的指导原则同步状态机可以设计复杂的时序逻辑电路同步有限状态机的要素状态:状态变量,划分逻辑顺序输出:某一状态时完成的事输入:进入某个状态的条件有限状态机类型米勒型状态机摩尔型状态机Mealy状态机
下一个状态=F(当前状态,输入信号);
输出信号=G(当前状态,输入信号);图1.时钟同步的状态机结构(Mealy状态机)下一状态的逻辑F输出逻辑
G状态寄存器时钟信号clk
clk
输入输入输出当前状态激励信号
Moor状态机
下一个状态=F(当前状态,输入信号)
输出信号=G(当前状态);
下一状态的逻辑F输出逻辑
G状态寄存器时钟信号clk
clk
输入输入输出当前状态激励信号图2.时钟同步的状态机结构(Moor状态机)有限状态机FSM标准FSM要安全,稳定性高FSM速度高,满足设计的频率高FSM面积小,满足设计的面积要求FSM设计要清晰易懂、易维护有限状态机的图形表示图形表示:状态、转移、条件和逻辑开关图3.4状态转移图Idle
Start
StopClear
A/K1=0
!AA/K2=1
!Reset/K2=0K1=0!Reset/K2=0K1=0
(!Reset|!A)/K2=0K1=1!Reset/K2=0K1=0有限状态机HDL描述wire、reg,状态编码用reg型parameter用于描述状态名称,易读;独热 码好always: 根据主时钟沿完成同步时序的状态转移
根据信号敏感表完成组合逻辑输出 根据时钟沿完成同步时序逻辑的输出case/endcase:完成进入每个状态的操作
default:状态变量=‘bx有限状态机的Verilog描述定义模块名和输入输出端口;定义输入、输出变量或寄存器;定义时钟和复位信号;定义状态变量和状态寄存器;用时钟沿触发的always块表示状态转移过程;在复位信号有效时给状态寄存器赋初始值;描述状态的转换过程:符合条件,从一个状态到另外一个状态,否则留在原状态;验证状态转移的正确性,必须完整和全面。fsmmodulefsm(Clock,Reset,A,K2,K1);endmoduleClockResetAK2K1inputClock,ResetA;outputK2,K1;regK2,K1;reg
[1:0]state,nextstate;parameter
Idle=2'b00,Start=2'b01,Stop=2'b10,Clear=2'b11;信号说明,引脚变量和常量Mealy状态机
下一个状态=F(当前状态,输入信号);
输出信号=G(当前状态,输入信号);图1.时钟同步的状态机结构(Mealy状态机)下一状态的逻辑F输出逻辑
G状态寄存器时钟信号clk
clk
输入输入输出当前状态激励信号modulefsm(Clock,Reset,A,K2,K1);endmodule表示方法之三(续)信号变量、常量声明每一个时钟沿产生一次可能的状态变化state产生下一状态的组合逻辑nextstate产生输出K1的组合逻辑产生输出K2的组合逻辑表示方法之三(续)
//--------每一个时钟沿产生一次可能的状态变化-----------always@(posedgeClock)beginif(!Reset)state<=Idle;elsestate<=nextstate;end//-------------------------------------------------------表示方法之三(续)//------产生下一状态的组合逻辑-------------------------
always@(stateorA)case(state)Idle:if(A)
nextstate=Start;elsenextstate=Idle;Start:if(!A)nextstate=Stop;elsenextstate=Start;Stop:if(A)nextstate=Clear;elsenextstate=Stop;Clear:if(!A)nextstate=Idle;elsenextstate=Clear;default:nextstate=2'bxx;
endcase表示方法之三(续)//----产生输出K1的组合逻辑--------------always@(stateorResetorA)if(!Reset)K1=0;elseif(state==Clear&&!A)//从Clear转向IdleK1=1;elseK1=0;
//---产生输出K2的组合逻辑---------------always@(stateorResetorA)if(!Reset)K2=0;elseif(state==Stop&&A)//从Stop转向ClearK2=1; elseK2=0;//------------------------------------------endmodule
状态机modulemux2(clk,ina,out);inputclk,ina;outputout;regout;reg[1:0]state;parameters0=2'b00,s1=2'b01,s2=2'b10,s3=2'b11;always@(posedge
clk)beginstate<=s0;out<=0;case(state)s0:beginstate<=(ina==1)?s1:s0;out<=0;ends1:beginstate<=(ina==1)?s2:s0;out<=0;ends2:beginstate<=(ina==1)?s3:s0;out<=0;ends3:beginstate<=(ina==1)?s3:s0;out<=1;end
endcaseendendmodule
状态机的测试模块`timescale1ns/1nsmodulet;
rega;
reg
clock,rst;wirek2,k1;initial//initial常用于仿真时信号的给出。
begina=0;
rst=1;//给复位信号变量赋初始值
clock=0;//给时钟变量赋初始值
#22rst=0;//使复位信号有效
#133rst=1;//经过一个多周期后使复位信号无效
end
状态机的测试模块
always#50clock=~clock;//产生周期性的时钟
always@(posedgeclock)//在每次时钟正跳变沿时刻产生不同的abegin#30a={$random}%2;//每次a是0还是1是随机的。
#(3*50+12);//a的值维持一段时间
endinitialbegin#100000$stop;end//系统任务,暂停仿真以便观察仿真波形。
//-----------调用被测试模块t.m----------
fsmm(.Clock(clock),.Reset(rst),.A(a),.K2(k2),.K1(k1));
endmodule
13.2典型状态机实例宇宙飞船控制器宇宙飞船控制器just_launchedis_landedabort_missionall_systems_goclklaunch_shuttleland_shuttlestart_countdownstart_trip_metercnt13.2典型状态机实例宇宙飞船控制器just_launchedis_landedabort_mission/launch_shuttle=1/land_shuttle=1/start_trip_meter=1HOLDSEQUENCELANDLAUNCHON_MISSIONcnt=0/start_countdown=1all_systems_gomodulestatemachine(launch_shuttle,land_shuttle,start_countdown,
start_trip_meter,clk,all_systems_go,just_launched,
is_landed,cnt,abort_mission);outputlaunch_shuttle,land_shuttle,start_countdown;
outputstart_trip_meter;inputclk,just_launched,is_landed,abort_mission,all_systems_go;input[3:0]cnt;
reg
launch_shuttle,land_shuttle,start_countdown,start_trip_meter;//设置独热码状态的参数
parameterHOLD=5'b00001,SEQUENCE=5'b00010, LAUNCH=5'b00100,ON_MISSION=5'b01000,LAND=5'b10000;
reg[4:0]state;always@(negedge
clkorposedge
abort_mission)begin//检查异步reset的值,即abort_mission的值
if(abort_mission){launch_shuttle,land_shuttle,start_trip_meter,start_countdown}<=4'b0000;state<=LAND;elsebegin/*主状态机,状态变量state*/case(state) HOLD:if(all_systems_go)beginstate<=SEQUENCE;
start_countdown<=1;endelsestate<=HOLD;SEQUENCE:if(cnt==0)state<=LAUNCH;elsestate<=SEQUENCE;
LAUNCH:beginstate<=ON_MISSION;
launch_shuttle<=1;endON_MISSION://取消使命前,一直留在使命状态
if(just_launched)
start_trip_meter<=1;elsestate<=ON_MISSION;LAND:if(is_landed)state<=HOLD;elsebegin
land_shuttle<=1;state<=LAND;enddefault:state=5'bxxxxx;
endcaseend end //endofalwaysendmoduleModuleclk_3(clkin,reset,clkout); inputclkin,reset;
reg[1:0]state;
regclk1; always@(posedge
clkinornegedgereset) if(!reset) state<=2’b00; else
case(state) 2’b00:state<=2’b01; 2’b01:state<=2’b11; 2’b11:state<=2’b00;
default:state<=2’b00;
endcase always@(negedge
clkornegedgereset) if(!reset) clk1<=1’b0; else clk1<=state[0]; assignclk_out=state[0]&clk1;endmodule13.3综合的一般原则综合之前要仿真布局布线要仿真不用异步状态机电平敏感的锁存器最好用连续赋值语句13.4语言指导原则Always块只能有一个事件控制“@(eventexpression)”可表示时序逻辑,也可表示组合逻辑(不推荐)两个沿posedge
negedge
产生时序逻辑电路时序always块最好一个沿触发(同步)每个always块中被赋值的信号应是reg型Always@(敏感电平列表)块表示组合逻辑,参与赋值的信号必须在敏感列表中出现13.4语言指导原则赋值对寄存器(reg)和整型(integer)变量赋值只能在一个always块中进行把某一个信号赋值为’bx,综合器解释为无关状态,其形成的硬件电路最简单13.5可综合风格的模块实例13.5.1组合逻辑电路设计实例【13.1】8位带进位加法module
adder_8(cout,sum,a,b,cin);
output
cout;
output [7:0]sum;
input
cin;
input [7:0]a,b;
assign {cout,sum}=a+b+cin;endmodule13.5.1组合逻辑电路设计实例【13.2】指令译码电路的设计实例(利用电平敏感的always块来设计组合逻辑)//操作码的宏定义`defineplus 3'd0`defineminus 3'd1`defineband 3'd2`definebor 3'd3`defineunegate3'd4【13.2】指令译码电路的设计实例(利用电平敏感的always块来设计组合逻辑)modulealu(out,opcode,a,b);output[7:0]out;input[2:0]opcode;input[7:0]a,b;
reg[7:0]out;always@(opcodeoraorb)//用电平敏感的always块描述组合逻辑
begin
case(opcode)`plus:out=a+b;//算术运算
`minus:out=a-b;`band:out=a&b;//位运算
`bor:out=a|b;`unegate:out=~a;//单目运算
default:out=8'hx;
endcaseendendmodule【13.3】利用task和电平敏感的always块设计比较后重组信号的组合逻辑.modulesort4(ra,rb,rc,rd,a,b,c,d);parametert=3;output[t:0]ra,rb,rc,rd;input[t:0]a,b,c,d;
reg[t:0]ra,rb,rc,rd;always@(aorborcord)//用电平敏感的always块描述组合逻辑
begin:local//此处begin-end块必须有一模块名因为块中定义了局部变量
reg[t:0]va,vb,vc,vd;{va,vb,vc,vd}={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块设计比较后重组信号的组合逻辑.
tasksort2;
inout[t:0]x,y;
reg[t:0]tmp;if(x>y)begin
tmp=x;x=y;y=tmp;end
endtaskendmodule【13.4】比较器的设计实例(利用赋值语句设计组合逻辑)modulecompare(equal,a,b); parametersize=1; outputequal; input[size-1:0]a,b; assignequal=(a==b)?1:0;endmodule【13.5】3-8译码器设计实例(利用赋值语句设计组合逻辑)moduledecoder(out,in); output[7:0]out; input[2:0]in; assignout=1'b1<<in;/****把最低位的1左移in(根据从in口输入的值)位,并赋予out****/endmodule【13.6】8-3编码器的设计实例//编码器设计方案之一:moduleencoder1(none_on,out,in);outputnone_on;output[2:0]out;input[7:0]in;
reg[2:0]out;
reg
none_on;always@(in)begin:local//此处begin-end块必须有一模块名
integeri;out=0;none_on=1;/*returnsthevalueofthehighestbitnumberturnedon*/for(i=0;i<8;i=i+1)if(in[i])beginout=i;
none_on=0;endendendmodule【13.6】8-3编码器的设计实例//编码器设计方案之二:moduleencoder2(none_on,out2,out1,out0,h,g,f,e,d,c,b,a);inputh,g,f,e,d,c,b,a;outputnone_on,out2,out1,out0;wire[3:0]outvec;assignoutvec=h?4'b0111:g?4'b0110:f?4'b0101:e?4'b0100:d?4'b0011:c?4'b0010:b?4'b0001:a?4'b0000:4'b1000;assignnone_on=outvec[3];assignout2=outvec[2];assignout1=outvec[1];assignout0=outvec[0];endmodule【13.6】8-3编码器的设计实例(方案之三)moduleencoder3(none_on,out2,out1,out0,h,g,f,e,d,c,b,a); inputh,g,f,e,d,c,b,a; outputout2,out1,out0,none_on;
reg[3:0]outvec; assign{none_on,out2,out1,out0}=outvec; always@(aorborcordoreorforgorh)
if(h) outvec=4'b0111; elseif(g) outvec=4'b0110; elseif(f) outvec=4'b0101; elseif(e) outvec=4'b0100; elseif(d) outvec=4'b0011; elseif(c) outvec=4'b0010; elseif(b) outvec=4'b0001; elseif(a) outvec=4'b0000; else outvec=4'b1000;endmodule【13.7】多路器的设计实例(方案之一)modulemux1(out,a,b,sel); outputout; inputa,b,sel; assignout=sel?a:b;endmodule使用连续赋值、case语句或if-else语句可以生成多路器电路,如果条件语句(case或if-else)中分支条件是互斥的话,综合器能自动地生成并行的多路器。【13.7】多路器的设计实例(方案之二)modulemux2(out,a,b,sel);outputout;inputa,b,sel;
regout;
//用电平触发的always块来设计多路器的组合逻辑
always@(aorborsel)case(sel)1'b1:out=a;1'b0:out=b;default:out='bx;
endcaseendmodule【13.7】多路器的设计实例(方案之三)modulemux3(out,a,b,sel); outputout; inputa,b,sel;
regout; always@(aorborsel) begin if(sel) out=a; elseout=b; endendmodule【13.8】奇偶校验位生成器设计实例moduleparity(even_numbits,odd_numbits,input_bus); outputeven_numbits,odd_numbits; input[7:0]input_bus; assignodd_numbits=^input_bus; assigneven_numbits=~odd_numbits;endmodule【13.9】
三态输出驱动器设计实例(用连续赋值语句建立三态门模型)三态输出驱动器设计方案之一:moduletrist1(out,in,enable); outputout; inputin,enable; assignout=enable?in:'bz;endmodule【13.9】
三态输出驱动器设计实例(bufif1是一个Verilog门级原语(primitive))三态输出驱动器设计方案之二:moduletrist2(out,in,enable); outputout; inputin,enable;
//bufif1是一个Verilog门级原语(primitive)
bufif1mybuf1(out,in,enable);endmodule【13.10】三态双向驱动器设计实例modulebidir(tri_inout,out,in,en,b);
inout
tri_inout; outputout; inputin,en,b; assigntri_inout=en?In:'bz; assignout=tri_inout^b;endmodule【13.11】触发器设计实例moduledff(q,data,clk); outputq; inputdata,clk;
regq; always@(posedge
clk) begin q<=data; endendmodule【13.12】电平敏感型锁存器设计实例之一modulelatch1(q,data,clk); outputq; inputdata,clk; assignq=clk?data:q;endmodule【13.13】带置位和复位端的电平敏感型锁存器设计实例之二modulelatch2(q,data,clk,set,reset); outputq; inputdata,clk,set,reset; assignq=reset?0:(set?1:(clk?data:q));endmodule【13.14】电平敏感型锁存器设计实例之三modulelatch3(q,data,clk); outputq; inputdata,clk;
regq; always@(clkordata)
if(clk) q=data;endmodule【13.15】移位寄存器设计实例moduleshifter(din,clk,clr,dout); inputdin,clk,clr; output[7:0]dout;
reg[7:0]dout; always@(posedge
clk)
if(clr) //清零
dout<=8'b0; else begin
dout<=dout<<1;//左移一位
dout[0]<=din;//把输入信号放入寄存器的最低位
endendmodule【13.16】八位计数器设计实例之一modulecounter1(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年广告宣传印刷品订购协议样本
- 2024年购销协议印花税速查指南
- 城市中央公园绿化改造项目协议模板
- 2024年度货物运输险协议规范文本
- 2024年适用商业担保借款协议样式
- 数智驱动的研究生教育治理体系重构框架
- 国家教育战略与育强国建设的目标
- 2024年消防系统增补协议模板
- 2024年区域独家食品销售代理协议
- 公司工期合同范本
- 大学生辩论赛评分标准表
- 诊所污水污物粪便处理方案及周边环境
- 江苏开放大学2023年秋《马克思主义基本原理 060111》形成性考核作业2-实践性环节(占过程性考核成绩的30%)参考答案
- 《我是班级的主人翁》的主题班会
- 酒店安全设施及安全制度
- 近代化的早期探索与民族危机的加剧 单元作业设计
- 租赁机械设备施工方案
- 屋面融雪系统施工方案
- 二年级家长会语文老师课件
- 结构加固改造之整体结构加固教学课件
- 教堂安全风险分级管控体系方案全套资料(2019-2020新标准完整版)
评论
0/150
提交评论