Verilog奇偶分频、一段式、两段式、三段式状态机_第1页
Verilog奇偶分频、一段式、两段式、三段式状态机_第2页
Verilog奇偶分频、一段式、两段式、三段式状态机_第3页
Verilog奇偶分频、一段式、两段式、三段式状态机_第4页
Verilog奇偶分频、一段式、两段式、三段式状态机_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、汇报总结1、偶数分频 偶数倍分频相对简单,可以通过计数器对预分频的脉冲沿计数实现,如果要进行 N 倍 (N 为整数)偶数分频,可由预分频的时钟触发计数器计数,当计数器从0 计数到 N/2 1时,输出时钟进行翻转, 并给计数器一个复位信号,使得下一个时钟从零开始计数,以此循 环下去。分频的主体程序如下:defi ne div_e n 8module freq_div_even(clk_in,reset, clk_out );input clk_in;input reset; output clk_out;reg clk_out;reg2:0 count;initialbegincount=0;

2、clk_out=0;endalways(posedge clk_in)beginif(!reset)begincount=0; clk_out=0;endelseif(count=(div_en/2-1) beginclk_out=clk_out; count=0;endelse begincount=count+1;endendendmodule下面定义 N 为 8,对一个脉冲 8 分频 ,测试程序如下timescale 1ns/1nsmodule testbench;reg reset;reg clk_in;reg2:0 count;wire clk_out;freq_div_eve n

3、test(.clk_i n( clk_i n), .reset(reset), .clk_out(clk_out);-_in itial begin reset=0; clk_ in=O;#5 reset=1;endalways #10 clk_in=clk_ in;en dmodule波形图如下:2、奇数分频对于对占空比没有特殊要求的奇数分频,需要对上升沿和下降沿脉冲进行计数,利用下降沿产生的波形移相半个输入脉冲的作用,最后用错位 异或”法实现。一个n(n=3)分频的程序如下:module clk_divN(clk_i n, reset, clk_out);in put clk_in;in

4、put reset;output clk_out;in teger cn t1,c nt2;reg clk_divp;reg clk_divn; parameter n=3;always(posedge clk_in) begin if(!reset) begin clk_divp=0; cnt1=0;endelseif(cnt1=(n-1) cnt1=0;else if(cnt1=0|cnt1=(n-1)/2) begin cnt1=cnt1+1; clk_divp=clk_divp;endelse cnt1=cnt1+1;endalways(negedge clk_in)beginif(!

5、reset)beginclk_divn=0;cnt2=0;endelseif(cnt2=(n-1)cnt2=0;else if(cnt1=0|cnt1=(n-1)/2) begin cnt2=cnt2+1; clk_divn=clk_divn;endelsecnt2=cnt2+1;endassign clk_out=clk_divp|clk_divn;endmodule测试程序如下:timescale 1ns/1nsmodule clk_div3_tb;reg clk_in;reg reset;clk_divNwire clk_out;uut (.clk_in(clk_in),.reset(r

6、eset),.clk_out(clk_out) );initialbeginclk_in = 0; reset = 0;#10 reset=1;endalways #5 clk_in=clk_ in;en dmodule3分频、5分频和7分频仿真波形分别如下:3分频5分频7分频3、状态机状态机分为两种、一种称为 Mealy状态机,它的时序逻辑输出不但取决于状态还取决 于输入;另外一种称为 Moore状态机,它的输出只取决于当前的状态。实际的设计工作中 大部分都是Mealy状态机。有限状态机设计一般步骤:1、逻辑抽象,得出状态转换图;2、状态化简;3、状态分配;4、选定触发器的类型并求出状态方程

7、、驱动方程和输出方程;5、按照方程得出逻辑图。FSM的描述方法有3中:1、在1个always模块里面,该模块中既描述状态转移,又描述状态的输入和输出,这 种写法一般被称为一段式 FSM描述方法;2、 还有一种写法是将用 2个always模块,其中一个always模块采用同步时序描述状 态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律,这种写法被称为两段式FSM描述方法;3、还有一种写法是在两段式描述方法基础上发展出来的,这种写法使用3个always模块,一个always模块采用同步时序描述状态转移;第二个采用组合逻辑判断状态转移条件, 描述状态转移规律;第三个always模块使

8、用同步时序电路描述每个状态的输出,这种写法本书称为三段式。三种描述方式的优缺点比较如下表:表6-1 3种FSM描述方法比较表比较项目一段式描述方法两段式描述方法三段式描述方法推荐等级不推存推荐最优推荐代码简洁程度(对于 相对复杂的FSM )冗长最简洁简洁always模块个数123是否利于时序约束不利于利于利于是否有组合逻辑输出可以无组合逻辑输出多数情况有组合逻辑输出无组合逻辑输出是否利于综合与布局布线不利于利于利于代码的可靠性与可维护度低高最好代码风格的规范性低,任意度较大,格式化规范,格式化规范我们主要学习三段式的 FSM描述方法。例如:需要编写下图所示状态机:现状态输入次状态输出SO(OO

9、)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.vmodule state_1para( reset,clk,x,out);in put reset,clk;in put x;output out;reg 1:0 out;reg 2:0 Next_state; /NextStateparameter 2:0 /one hot with zero idle5

10、0 = 2b00,51 = 2b01,52 = 2b10,53 = 2b11;always (posedge clk or n egedge reset) if (!reset)beginNext_state = S0;out = 2b00;endelsebeginNext_state = 2bx;out = 2b00;case (Next_state)S0:-beginif (x=0)beginout = 2b00;Next_state = S0;endelsebeginout = 2b01;/输出要看下一状态Next_state = S1;endendS1:beginif (x=0)beg

11、in out = 2b00; Next_state = S0;end else begin out = 2b10; Next_state = S2;endendS2:begin if (x=0) begin out = 2b00; Next_state = S0; end elsebegin out = 2b11; Next_state = S3;endendS3:begin if (x=0) begin out = 2b00; Next_state = S0; end elsebegin out = 2b11; Next_state = S3;endendendcaseend endmodu

12、le两段式的程序如下:module state_2para( reset,clk,x,out); input reset,clk;input x;output out;reg 1:0 out;reg 2:0 Next_state,Current_state; parameter 2:0 /one hot with zero idleS0 =2 b00,S1 =2 b01,S2 =2 b10,S3 =2 b11;/描述状态转移,非阻塞方式赋值 always (posedge clk or negedge reset) if (!reset)Current_state = S0;elseCurre

13、nt_state = Next_state;/描述状态转移的条件,阻塞方式赋值 always ( Current_state or x )beginNext_state = 2 bx;S3_out;case (Current_state )S0:begin S0_out;if (x=0) Next_state = S0; else Next_state = S1;endS1:beginS1_out;if (x=0) Next_state = S0; else Next_state = S2;endS2:beginS2_out;if (x=0) Next_state = S0; else Nex

14、t_state = S3;endS3:beginS3_out;if (x=0) Next_state = S0; else Next_state = S3;end endcase end/定义输出任务task S0_out;out = 2b00;endtasktask S1_out; out = 2b01;endtasktask S2_out; out = 2b10;endtasktask S3_out; out = 2b11;endtask endmodule三段式的程序如下:module state3 ( reset,clk,x,out); input reset,clk;input x,

15、;output out;reg 1:0 out;reg 2:0 Next_state,Current_state; parameter 2:0S0= 2 b00,S1= 2 b01,S2= 2b10,S3= 2 b11;always (posedge clk or negedge reset) if (!reset)Current_state = S0; elseCurrent_state = Next_state;always ( reset or Current_state or x ) /与二段式区别 beginNext_state = 2 bx;case (Current_state

16、)/注意S0:beginif (x=0) Next_state = S0; else Next_state = S1;endS1:beginif (x=0) Next_state = S0; else Next_state = S2;endS2:beginif (x=0) Next_state = S0; else Next_state = S3;endS3:beginif (x=0) Next_state = S0; else Next_state = S3;endendcaseendalways (posedge clk or negedge reset)if (!reset)out =

17、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.vtimescale 1ns/1nsmodule state_1parag_tb;reg reset;reg clk;reg x;wire1:0 out;state_1para tb( .reset(reset),.clk(clk),.x(x),.out(out);initialbeginclk=0;reset=0;x=0;#10 reset=1;#1000 reset=0;# 100 reset=1;endalways #20 clk=clk;always(posedge clk)begin#10 x=$random%2;输入x随机在0和1之间变化e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论