您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > verilog奇偶分频、一段式、两段式、三段式状态机
汇报总结1、偶数分频偶数倍分频相对简单,可以通过计数器对预分频的脉冲沿计数实现,如果要进行N倍(N为整数)偶数分频,可由预分频的时钟触发计数器计数,当计数器从0计数到N/2—1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数,以此循环下去。分频的主体程序如下:`definediv_en8modulefreq_div_even(clk_in,reset,clk_out);inputclk_in;inputreset;outputclk_out;regclk_out;reg[2:0]count;initialbegincount=0;clk_out=0;endalways@(posedgeclk_in)beginif(!reset)begincount=0;clk_out=0;endelseif(count==(`div_en/2-1))beginclk_out=~clk_out;count=0;endelsebegincount=count+1;endendendmodule下面定义N为8,对一个脉冲8分频,测试程序如下:`timescale1ns/1nsmoduletestbench;regreset;regclk_in;reg[2:0]count;wireclk_out;freq_div_eventest(.clk_in(clk_in),.reset(reset),.clk_out(clk_out));initialbeginreset=0;clk_in=0;#5reset=1;endalways#10clk_in=~clk_in;endmodule波形图如下:2、奇数分频对于对占空比没有特殊要求的奇数分频,需要对上升沿和下降沿脉冲进行计数,利用下降沿产生的波形移相半个输入脉冲的作用,最后用错位“异或”法实现。一个n(n=3)分频的程序如下:moduleclk_divN(clk_in,reset,clk_out);inputclk_in;inputreset;outputclk_out;integercnt1,cnt2;regclk_divp;regclk_divn;parametern=3;always@(posedgeclk_in)beginif(!reset)beginclk_divp=0;cnt1=0;endelseif(cnt1==(n-1))cnt1=0;elseif(cnt1==0|cnt1==(n-1)/2)begincnt1=cnt1+1;clk_divp=~clk_divp;endelsecnt1=cnt1+1;endalways@(negedgeclk_in)beginif(!reset)beginclk_divn=0;cnt2=0;endelseif(cnt2==(n-1))cnt2=0;elseif(cnt1==0|cnt1==(n-1)/2)begincnt2=cnt2+1;clk_divn=~clk_divn;endelsecnt2=cnt2+1;endassignclk_out=clk_divp|clk_divn;endmodule测试程序如下:`timescale1ns/1nsmoduleclk_div3_tb;regclk_in;regreset;wireclk_out;clk_divNuut(.clk_in(clk_in),.reset(reset),.clk_out(clk_out));initialbeginclk_in=0;reset=0;#10reset=1;endalways#5clk_in=~clk_in;endmodule3分频、5分频和7分频仿真波形分别如下:3分频5分频7分频3、状态机状态机分为两种、一种称为Mealy状态机,它的时序逻辑输出不但取决于状态还取决于输入;另外一种称为Moore状态机,它的输出只取决于当前的状态。实际的设计工作中大部分都是Mealy状态机。有限状态机设计一般步骤:1、逻辑抽象,得出状态转换图;2、状态化简;3、状态分配;4、选定触发器的类型并求出状态方程、驱动方程和输出方程;5、按照方程得出逻辑图。FSM的描述方法有3中:1、在1个always模块里面,该模块中既描述状态转移,又描述状态的输入和输出,这种写法一般被称为一段式FSM描述方法;2、还有一种写法是将用2个always模块,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律,这种写法被称为两段式FSM描述方法;3、还有一种写法是在两段式描述方法基础上发展出来的,这种写法使用3个always模块,一个always模块采用同步时序描述状态转移;第二个采用组合逻辑判断状态转移条件,描述状态转移规律;第三个always模块使用同步时序电路描述每个状态的输出,这种写法本书称为三段式。三种描述方式的优缺点比较如下表:表6-13种FSM描述方法比较表比较项目一段式描述方法两段式描述方法三段式描述方法推荐等级不推荐推荐最优推荐代码简洁程度(对于相对复杂的FSM)冗长最简洁简洁always模块个数123是否利于时序约束不利于利于利于是否有组合逻辑输出可以无组合逻辑输出多数情况有组合逻辑输出无组合逻辑输出是否利于综合与布局布线不利于利于利于代码的可靠性与可维护度低高最好代码风格的规范性低,任意度较大,格式化规范,格式化规范我们主要学习三段式的FSM描述方法。例如:需要编写下图所示状态机:S0/00S1/01S2/10S3/1100101110现状态输入次状态输出S0(00)0S0(00)00S0(00)1S1(01)00S1(01)0S0(00)01S1(01)1S2(10)01S2(10)0S0(00)10S2(10)1S3(11)10S3(11)0S0(00)11S3(11)1S3(11)11一段式的的程序,如下://state_1paragraph.vmodulestate_1para(reset,clk,x,out);inputreset,clk;inputx;outputout;reg[1:0]out;reg[2:0]Next_state;//NextStateparameter[2:0]//onehotwithzeroidleS0=2'b00,S1=2'b01,S2=2'b10,S3=2'b11;always@(posedgeclkornegedgereset)if(!reset)beginNext_state=S0;out=2'b00;endelsebeginNext_state=2'bx;out=2'b00;case(Next_state)S0:beginif(x==0)beginout=2'b00;Next_state=S0;endelsebeginout=2'b01;//输出要看下一状态Next_state=S1;endendS1:beginif(x==0)beginout=2'b00;Next_state=S0;endelsebeginout=2'b10;Next_state=S2;endendS2:beginif(x==0)beginout=2'b00;Next_state=S0;endelsebeginout=2'b11;Next_state=S3;endendS3:beginif(x==0)beginout=2'b00;Next_state=S0;endelsebeginout=2'b11;Next_state=S3;endendendcaseendendmodule两段式的程序如下:modulestate_2para(reset,clk,x,out);inputreset,clk;inputx;outputout;reg[1:0]out;reg[2:0]Next_state,Current_state;parameter[2:0]//onehotwithzeroidleS0=2’b00,S1=2’b01,S2=2’b10,S3=2’b11;//描述状态转移,非阻塞方式赋值always@(posedgeclkornegedgereset)if(!reset)Current_state=S0;elseCurrent_state=Next_state;//描述状态转移的条件,阻塞方式赋值always@(Current_stateorx)beginNext_state=2’bx;S3_out;case(Current_state)S0:beginS0_out;if(x==0)Next_state=S0;elseNext_state=S1;endS1:beginS1_out;if(x==0)Next_state=S0;elseNext_state=S2;endS2:beginS2_out;if(x==0)Next_state=S0;elseNext_state=S3;endS3:beginS3_out;if(x==0)Next_state=S0;elseNext_state=S3;endendcaseend//定义输出任务taskS0_out;out=2'b00;endtasktaskS1_out;out=2'b01;endtasktaskS2_out;out=2'b10;endtasktaskS3_out;out=2'b11;endtaskendmodule三段式的程序如下:modulestate3(reset,clk,x,out);inputreset,clk;inputx,;outputout;reg[1:0]out;reg[2:0]Next_state,Current_state;parameter[2:0]S0=2’b00,S1=2’b01,S2=2'b10,S3=2’b11;always@(posedgeclkornegedgereset)if(!reset)Current_state=S0;elseCurrent_state=Next_state;always@(resetorCurrent_stateorx)//与二段式区别beginNext_state=2’bx;case(Current_state)//注意S0:beginif(x==0)Next_state=S0;elseNext_state=S1;endS1:beginif(x==0)Next_state=S0;elseNext_state=S2;endS2:beginif(x==0)Next_state=S0;elseNext_state=S3;endS3:beginif(x==0)Next_state=S0;elseNext_state=S3;endendcaseendalways@(posedgeclkornegedgereset)if(!reset)out=0;elsebeginout=0;case(Next_state)//需要注意,不是Current_stateS0:out=2’b00;S1:out=2’b01;S2:out=2’b10;S3:out=2’b11;endcaseendendmodule三种方法的测试程序如下://state_1paragraph_tb.v`timescale1ns/1nsmodulestate_1parag_tb;regreset;regclk;regx;wire[1:0]out;state_1paratb(.reset(reset),.clk(clk),.x(x),.out(out));initialbeginclk=0;reset=0;x=0;#10reset=1;#1000reset=0;#100reset=1;endalways#20clk=~clk;always@(posedgeclk)begin#10x={$random}%2;//输入x随机在0和1之间变化ende
本文标题:verilog奇偶分频、一段式、两段式、三段式状态机
链接地址:https://www.777doc.com/doc-4079707 .html