版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《现代EDA技术及应用》教学课件张俊涛电子信息与人工智能学院第6章状态机的设计及应用本章内容6.2状态机的描述方法6.3交通灯控制器的设计6.1状态机的概念与分类6.5状态机设计实践6.5.1键盘电子琴的设计6.4周期法频率计的设计6.5.2VGA时序控制器的设计
6.5.3A/D转换器的设计
6.1状态机的概念与分类◆根据逻辑功能●组合逻辑电路(1)定义
●时序逻辑电路(2)特点
(3)器件类型
(1)定义
(2)特点:243
(3)器件类型
◆时序逻辑电路的分类●根据内部触发器的动作特点(1)同步时序逻辑电路(2)异步时序逻辑电路
特点:(1)...(2)...特点:(1)...(2)...同步逻辑电路!◆重点REVIEWMealy型:Y(tn)=F[Xn(tn),Q(tn)]Moore型:Y(tn)=F[Q(tn)]●根据输出信号的特点
时序电路在时钟脉冲的作用下,在有限个状态之间进行转换,以完成某种特定的功能,所以将时序电路又称为有限机状态机(FiniteStateMachine),简称为状态机,用FSM表示。状态机有三个基本要素:状态、输出和输入。(1)状态:
用于划分逻辑顺序和时序规律。(2)输出:
在某个状态下发生的特定事件。(3)输入:状态机中进入每个状态的条件。
但广义地讲,状态机不单单是指时序逻辑电路,而是指任何有逻辑顺序和时序规律的事件。
根据状态机的输出是否与输入有关,将状态机分为摩尔(Moore)型状态机和米里(Mealy)型状态机两大类。(1)Moore型状态机
Moore型状态机的输出仅取决于当前状态,与输入无关。
一般地,Moore型状态机也可能有输入,只是输出不直接与输入信号相关,因此,在数字电路中,Moore型状态机表示为图6-3所示的结构形式,其中输出z(t)=f[s(t)],而与输入x(t)无关。(2)Mealy型状态机
Mealy型状态机的输出不仅依赖于当前状态,而且与输入有关。
Mealy型状态机的输出既与状态有关,也与输入有关,因此,在数字电路中,Mealy型状态机表示为图6-4所示的结构形式,其中输出z(t)=f[x(t),s(t)]。6.2状态机的描述方法1.状态转换表
以表格的形式描述时序电路的次态Q*以及外部输出信号Y与外部输入信号X和现态Q之间的关系。时序逻辑电路常用的功能描述有状态转换表、状态转换图和波形图三种方法。◆组合逻辑电路Y=F(A)功能描述方法:(1)真值表;(2)函数表达式;(3)逻辑图;(4)卡诺图;(5)波形图。◆时序逻辑电路Y=F(X,Q)输出方程(组)驱动方程(组)状态方程(组)Q*=H[Z,Q]Z=G[X,Q]Q*=HH[X,Q]Y=F[X,Q]
以图形的方式描述时序电路的状态Q和输出Y在输入信号X的作用下随时钟CLK的变化关系。x=0时
用随时间变化的波形来描述在输入信号的作用下,输出Y及状态Q与时钟脉冲CLK之间的对应关系。2.状态转换图3.波形图逻辑图卡诺图三组方程状态机有三种常用的表示方法:状态转换图、状态转换表和HDL描述。
状态机的HDL描述方法结构清晰,灵活规范,而且安全、高效和易于维护,因此是本章重点的讲述内容。状态机的设计及应用REVIEW(1)逻辑抽象(3)内部应该设定几个状态?分析:Black-Box(1)有几个输入?(2)有几个输出?(2)状态化简同步时序电路设计的一般步骤:寻找并合并等价状态,然后获得最简的状态转换图或者状态转换表。
画出能够表述逻辑功能的状态转换图或者列出状态转换表。(3)状态编码为每个状态指定不同取值的过程称为状态编码,或称为状态分配。常用的有顺序编码、循环编码和一位热码等多种编码方式。(4)求出状态方程、驱动方程和输出方程(5)检查电路能否自启动(6)画出电路图。
用卡诺图表示每个存储单元的次态、外部输出信号与现态以及输入变量之间的关系,从中推出时序电路的状态方程组和输出方程组,再结合所选触发器(D/JK)的特性方程,求出相应的驱动方程组。
当时序电路存在无效状态时,如果无效状态经过有限个时钟脉冲能够回到有效状态循环中去,则称该时序电路具有自启动功能。时序逻辑电路的设计步骤
一位热码(One-hot)是指任意编码中只有一位为1,其余均为0。状态机设计的基本步骤是:(1)定义状态;(2)建立状态转换图;(3)完成状态编码;(4)应用HDL描述状态转换关系以及输出。【例6-1】设计一个串行序列检测器,要求连续输入四个或四个以上的1时输出为1,否则输出为0。
1.定义状态
由于检测器用于检测“1111”序列,所以电路需要识别和记忆连续输入1的个数,因此,预定义电路内部有S0、S1、S2、S3和S4共五个状态,其中S0表示当前还没有接收到一个1,S1表示已经接收到一个1,S2表示已经接收到两个1,S3表示已经接收到三个1,而S4表示已经接收到四个1。
2.建立状态转换图
状态定义完成之后,需要分析在时钟脉冲的作用下,状态转移的方向以及输出,画出状态转换图。通常从系统的初始状态、复位状态或者空闲状态开始分析,标出每个状态的转换方向、转换条件以及输出。
3.状态编码
常用的状态编码方案有顺序编码、格雷码编码和一位热码编码(One-hotencoding)等多种方式,如表6-2所示。在状态机设计中,建议使用参数定义语句parameter/localparam来定义状态编码,以增强代码的可阅读性。
无效状态的处理大致有如下三种方式:(1)转入空闲状态,等待下一个任务的到来(2)转入指定的状态,去执行特定任务;(3)转入预先定义的专门处理错误的状态,如预警状态等。4.状态机的描述
VerilogHDL用过程语句描述状态机。由于时序电路的次态是现态以及输入的逻辑函数,因此需要将现态和输入信号作为过程的敏感事件或者边沿触发事件,结合case和if等高级程序语句等实现逻辑功能。
有限状态机的描述可采用一段式、两段式和三段式三种描述方式。三段式状态机的描述模板如下://第一个过程语句,时序逻辑,描述状态转换关系always@(posedgeclkornegedgerst_n)if(!rst_n)
//复位信号有效时current_state<=IDLE;elsecurrent_state<=next_state;//状态转换
//第二个过程语句,组合逻辑,描述次态always@(current_state,input_signals)
//电平敏感条件case(current_state)
S1:if(...)next_state=...;//阻塞赋值
elsenext_state=...;
S2:if(...)next_state=...;
elsenext_state=...;
......
default:...;endcase//第三个过程语句描述输出(1),应用组合逻辑,阻塞赋值always@(current_state,
input_signals)case(current_state)S1:if(cond_expression)
out=...;elseout=...;S2:if(cond_expression)
out
=...;elseout=...;
......default:...;endcase//第三个过程语句描述输出(2),应用时序逻辑,非阻塞赋值always@(posedgeclkornegedgerst_n)if(!rst_n)
out<=...;
else
case(current_state)
S1:if(cond_expression)
out<=...;
elseout<=...;
S2:if(cond_expression)
out<=...;elseout<=...;......
default:...;endcase设计例1的“1111”序列检测器,应用三段式状态机Verilog描述代码参考如下:
moduleserial_detor
(inputclk,
//检测器时钟inputrst_n,
//复位信号inputx,
//串行数据输入outputwirey);//检测结果输出localparamS0=5'b00001,
//状态定义及编码
S1=5'b00010,
S2=5'b00100,
S3=5'b01000,
S4=5'b10000;//内部状态变量定义
reg[4:0]current_state,next_state;//现态和次态
//组合逻辑,定义输出assigny=(current_state==S4);
//时序逻辑过程,描述状态转换
always@(posedgeclkornegedgerst_n)
if(
!rst_n
)current_state<=S0;
else
current_state<=next_state;//组合逻辑过程,确定次态always@(current_state,x)case(current_state)S0:if(x)next_state=S1;elsenext_state=S0;S1:if(x)next_state=S2;elsenext_state=S0;
S2:if(x)next_state=S3;elsenext_state=S0;S3:if(x)next_state=S4;elsenext_state=S0;S4:if(x)next_state=S4;elsenext_state=S0;default:next_state=S0;endcaseendmodule
将上述代码经过编译与综合后,建立向量波形文件进行功能仿真,得到的时序波形如图所示。【例6-2】应用状态机设计按键消抖电路,能够消除20ms内的按键抖动。
按键(button)或开关(switch)为机械部件。当按键或者开关接通/断开时,由于簧片的弹性会产生短暂的抖动(10~20ms),然后才能稳定接通或者断开。REVIEW:(1)硬件消抖方法(2)软件消抖方法脉冲信号电平信号buttonswitchDE2-115
基于状态机设计按键消抖电路时,需要将按键的一次动作分解为:按下前、按下时、稳定期和释放时4个状态,如图6-8所示,分别用
KEY_IDLE、KEY_PRESSED、KEY_ACTIVE和
KEY_RELEASE表示。设按键输入用key_in表示,低电平有效,设计消抖时间为20ms,则按键消抖电路的状态转换关系如图所示。根据上述转换关系,描述按键消抖电路的VerilogHDL代码参考如下:moduleKEY_debounce#(parameterDEBOUNCE_TIME=1000_000)//50MHz时钟时,对应消抖时间为20ms(inputclk_50,//50MHz时钟,周期为20nsinputrst_n,//复位信号,低电平有效inputkey_in,//开关输入outputregkey_out//消抖后输出);
//内部状态定义,循环编码localparamKEY_IDLE=2'b00,//按下前KEY_PRESSED=2'b01,//按下时KEY_ACTIVE=2'b11,//稳定期KEY_RELEASE=2'b10;//释放时
//内部变量定义
reg[19:0]debounce_cnt;//消抖计数变量reg[1:0]current_state,next_state;//现态和次态reg[0:1]keytmp;//两级同步器
//内部线网定义
wirecnt_en,cnt_end;//计数允许和停止计数标志wirecnt_flag;//消抖计数标志wirerelease_flag;//按键释放标志//允许消抖计数逻辑:按键按下时或者释放时,cnt_en有效。assigncnt_en=current_state==KEY_PRESSED||current_state==KEY_RELEASE;//停止计数标志:cnt_en有效并且debounce_cnt达到最大值,则cnt_end有效。assigncnt_end=cnt_en&&(debounce_cnt>=DEBOUNCE_TIME-1);//正在计数标志:cnt_en有效并且debounce_cnt未达到最大值,cnt_flag有效。assigncnt_flag=cnt_en&&(debounce_cnt<DEBOUNCE_TIME);//按键已释放标志:cnt_end有效,并且keytmp[1]为高电平,则release_flag有效。assignrelease_flag=cnt_end&&keytmp[1];//两级移位寄存过程:按键输入两级同步,以消除亚稳态。always@(posedgeclk_50ornegedgerst_n)if(!rst_n)keytmp<=2'b00;//清零elsekeytmp[0:1]<={key_in,keytmp[0]};//右移//时序逻辑过程,描述状态转换always@(posedgeclk_50ornegedgerst_n)
if(!rst_n)current_state<=KEY_IDLE;elsecurrent_state<=next_state;//组合逻辑过程,定义次态always@(*)begincase(current_state)KEY_IDLE:if(!keytmp[1])//按键按下时,进入KEY_PRESSEDnext_state=KEY_PRESSED;else//否则,保持KEY_IDLEnext_state=current_state;KEY_PRESSED:if(cnt_end&&!keytmp[1])//消抖时间到且keytmp[1]=0,确认按下有效next_state=KEY_ACTIVE;elseif(cnt_flag&&keytmp[1])//正在计数,但keytmp[1]=1,则为抖动next_state=KEY_IDLE;else//否则状态保持next_state=current_state;KEY_ACTIVE:if(keytmp[1])//keytmp[1]跳变为1则进入释放状态next_state=KEY_RELEASE;elsenext_state=current_state;//否则状态保持KEY_RELEASE:if(release_flag)//按键已释放,返回next_state=KEY_IDLE;elseif(cnt_flag&&!keytmp[1])//正在计数,但keytmp[1]=0,则为抖动next_state=KEY_ACTIVE;else//否则状态保持next_state=current_state;default:next_state=KEY_IDLE;endcaseend//时序逻辑过程,消抖计时
always@(posedgeclk_50ornegedgerst_n)if(!rst_n)debounce_cnt<=20'b0;elseif(cnt_en)//计数允许信号有效if(cnt_end)//消抖时间到debounce_cnt<=20'b0;else//消抖时间未到debounce_cnt<=debounce_cnt+1'b1;else//计数允许信号无效debounce_cnt<=20'b0;//时序逻辑过程,按键消抖后输出always@(posedgeclk_50ornegedgerst_n)if(!rst_n)key_out<=1'b1;elsecase(current_state)KEY_IDLE:key_out<=1'b1;KEY_PRESSED:key_out<=1'b1;KEY_ACTIVE:key_out<=1'b0;KEY_RELEASE:key_out<=1'b0;default: key_out<=1'b1;endcaseendmodule
对上述代码进行仿真验证时,需要应用系统函数$random产生随机数,以模拟不规则的抖动脉冲间隔。应用系统函数$random产生随机整数的语法格式为:num=$random%b
//num为-(b-1)~(b-1)范围内的随机整数num={$random}%b//num为0~(b-1)范围内的随机整数`timescale1ns/1psmoduleKEY_debounce_vlg_tst();//例化接口定义测试按键消抖模块功能的testbench代码参考如下:regclk;regrst_n;regkey_in;wirekey_out;//模块参数重定义,减少计数容量,以缩短仿真时间
defparamKEY_debounce.DEBOUNCE_TIME=50000;//内部变量定义reg[15:0]rand_num;//仿真参数定义parameterRESET_TIME=2,STEP=5;//按键消抖模块例化KEY_debouncei1(.clk(clk),.rst_n(rst_n),.key_in(key_in),.key_out(key_out));//设置复位信号波形
initialbeginrst_n=1;#1;rst_n=0;#(STEP*RESET_TIME);rst_n=1;end//设置按键输入initialbegin#1;key_in=1;//按下前#(STEP*10);
press_key;//第1次按键过程#10_000;
press_key;
//第2次按键过程end//设置时钟信号initialbeginclk_50=0;endalways#(STEP/2)clk_50=~clk_50;//监测任务initial$monitor($time,"clk_50=%brst_n=%bkey_in=%bkey_out=%b",clk_50,rst_n,key_in,key_out);//按键任务定义
taskpress_key;begin
repeat(20)begin//模拟前沿抖动过程rand_num={$random}%5000;#rand_numkey_in=~key_in;endkey_in=0;#300_000;
repeat(20)begin//模拟后沿抖动过程rand_num={$random}%5000;#rand_numkey_in=~key_in;endkey_in=1;#300_000;endendtaskendmodule
上述代码中使用了defparam语句用于对KEY_debounce模块中的DEBOUNCE_TIME参数进行重定义,在确保功能验证的前提下缩短消抖时间。启动modelsim进行仿真,结果如图所示。总结:(1)硬件消抖的两种方法(2)软件消抖方法(3)状态机6.3交通灯控制器的设计
交通灯控制器用于控制十字路口交通信号灯的状态,引导车辆和行人通行。交通灯控制器是时序逻辑电路,可以应用MCU/状态机设计方法实现。【例6-3】在一条主干道和一条支干道汇成的十字路口,在主干道和支干道车辆入口分别设有红、绿、黄三色信号灯。设计交通灯控制器,用于控制红、绿、黄三色信号灯,以引导车辆和行人的通行。具体要求如下:(1)主干道和支干道交替通行;(2)主干道每次通行45秒,支干道每次通行25秒;(3)每次由绿灯变为红灯时,要求黄灯先亮5秒。
设计过程:交通灯控制器应由状态控制电路和计时电路两部分构成。控制电路用于切换主、支干道绿灯、黄灯和红灯的状态,计时电路用于控制通行时间。(1)控制电路设计
主支干道的绿、黄、红灯正常工作时共有四种组合,分别用S0、S1、S2和S3表示,状态的具体含义如表所示。交通灯控制电路状态转换图:moduletraffic_controller(clk,rst_n,t45,t5,t25,traffic_state,mG,mY,mR,sg,sy,sr);inputclk,rst_n;inputt45,t5,t25;outputwire[3:0]traffic_state;//需要显示计时时间时,状态需要输出outputregmG,mY,mR;//主干道绿、黄、红灯outputregsg,sy,sr;//支干道绿、黄、红灯//状态及编码定义,一位热码方式
localparamS0=4'b0001,S1=4'b0010,S2=4'b0100,S3=4'b1000;//内部变量定义reg[3:0]current_state,next_state;//现态和次态//状态输出描述assigntraffic_state=current_state;
//时序逻辑过程,描述状态转换always@(posedgeclkornegedgerst_n)
if(!rst_n)//异步复位
current_state<=S0;
根据状态转换图设计交通灯控制电路的Verilog代码参考如下:else//状态切换current_state<=next_state;
//组合逻辑过程,确定次态always@(current_state,t45,t25,t5)case(current_state)S0:if(t45)next_state=S1;elsenext_state=S0;S1:if(t5)next_state=S2;elsenext_state=S1;S2:if(t25)next_state=S3;elsenext_state=S2;S3:if(t5)next_state=S0;elsenext_state=S3;default:next_state=S0;endcase
//组合逻辑过程,描述输出always@(current_state)
case(current_state)S0:beginmG=1;mY=0;mR=0;
//主干道绿灯sg=0;sy=0;sr=1;end//支干道红灯
S1:beginmG=0;mY=1;mR=0;
//主干道黄灯sg=0;sy=0;sr=1;end//支干道红灯S2:beginmG=0;mY=0;mR=1;//主干道红灯sg=1;sy=0;sr=0;end//支干道绿灯S3:beginmG=0;mY=0;mR=1;//主干道红灯sg=0;sy=1;sr=0;end//支干道黄灯default:begin//其它取值时mG=1;mY=0;mR=0;sg=0;sy=0;sr=1;endendcaseendmodule(2)计时电路设计
取计时电路的时钟周期为5秒时,则45秒、5秒、25秒和5秒计时共需要9+1+5+1=16个时钟周期。moduletraffic_timer(clk,rst_n,t45,t5,t25);inputclk,rst_n;outputwiret45,t5,t25;//定义内部计数器reg[3:0]timer;//描述16进制计数器always@(posedgeclkornegedgerst_n)if(!rst_n)timer<=4'd0;elsetimer<=timer+1'd1;//描述输出assignt45=(timer==4'd8);assignt5=(timer==4'd9)||(timer==4'd15);assignt25=(timer==4'd14);
endmodule
设计一个16进制加法计数器,状态编码为0~15。当状态为8时令t45=1,状态为9时令t5=1,状态为14时令t25=1,状态为15时令t5=1。因此,计时电路的Verilog描述参考如下:如果不要求显示计时时间,则计时电路的设计比较简单。
将交通灯控制模块traffic_controller和计时模块traffic_timer连成图6-30所示的顶层设计电路即可实现简单的交通信号灯控制器,并将时钟脉冲clk和复位信号rst_n连接在一起以控制两个子模块之间的同步。
若需要显示当前状态的剩余时间,则需要重新设计计时电路,而且主支干道计时时间(main_timer,sub_timer)的显示与状态有关。
以倒计时方式分别显示主干道和支干道状态的剩余时间时,则计时电路设计的Verilog描述代码参考如下:moduletraffic_timer(clk,rst_n,state,t45,t5,t25,main_timer,sub_timer);inputclk;
inputrst_n;input[3:0]state;
//状态信息,来自于traffic_controlleroutputwiret45,t5,t25;//计时到输出信号,用于控制状态切换
outputreg[5:0]
main_timer,sub_timer;//主干道和支干道计时信息,用于显示//状态定义及编码,独热码方式localparamS0=4'b0001,S1=4'b0010,S2=4'b0100,S3=4'b1000;//组合逻辑,计时时间到逻辑assignt45=(state==S0)&&(main_timer==0);
assignt5=(main_timer==0)&&(sub_timer==0);assignt25=(state==S2)&&(sub_timer==0);//计时过程always@(posedgeclkornegedgerst_n)if(!rst_n)begin
//复位有效时
main_timer<=45;
//从主干道通行开始
sub_timer<=50;
endelse
//否则,在时钟作用下
case(state)
//分情况讨论 S0:if(t45)begin
//主干道通行时间到
main_timer<=4;
sub_timer<=sub_timer-1;end
elsebegin
main_timer<=main_timer-1;
sub_timer<=sub_timer-1;end S1:if(t5)begin//主干道停车时间到
main_timer<=29;
sub_timer<=24;end
elsebegin
main_timer<=main_timer-1;
sub_timer<=sub_timer-1;end
S2:if(t25)begin//支干道通行时间到
main_timer<=main_timer-1;
sub_timer<=4;end
elsebegin
main_timer<=main_timer-1;
sub_timer<=sub_timer-1;end
S3:if(t5)begin//支干道停车时间到
main_timer<=44;
sub_timer<=49;end
elsebegin
main_timer<=main_timer-1;
sub_timer<=sub_timer-1;end default:beginmain_timer<=45;
sub_timer<=50;endendcaseendmodule
由于计时时间是以二进制方式计数的,因此需要显示主、支干道计时时间时,还需要设计6位二进制数到两组BCD码的转换电路,才能驱动数码管进行显示。
带计时显示的交通灯控制器顶层测试电路如图所示。由按键产生脉冲,经过模块KEY_debounce消抖后作为交通灯计时电路的时钟。在计时电路traffic_timer的控制下,模块traffic_controller驱动交通灯显示状态,模块BinarytoSEG驱动数码管显示主、支干道状态的剩余时间。
以顶层设计电路新建工程,完成编译和引脚锁定后,下载到开发板进行调试。系统功能提升:(1).......;(2).........。6.4周期法频率计的设计频率测量的三种方法频率测量直接测频法测周期法等精度测频法NN-1N+1δ≈TS/TD
45Hz~100MHz5859Hz~100MHz1Hz~100MHz,0.01%闸门作用时间:1S
对于低频信号,应用周期法进行测频。周期法测频的基本原理是:应用标准频率信号统计被测信号两个相邻脉冲之间的脉冲数,然后通过脉冲数计算出被测信号的周期,再根据频率与周期之间的倒数关系计算出频率值。.vs.直接测频法原理框图周期法频率计原理框图【例6-3】设计数字频率计,能够测量10mHz~10kHz低频信号的频率,应用8位数码管显示频率值。
分析:(1)10mHz信号的周期为100秒。若应用50MHz晶振信号统计被测信号的周期,则两个相邻脉冲之间需要统计(50×106×100=)5×109个脉冲,因此需要应用33位二进制计数器(233=8588934592>5×109)进行计数。(2)被测信号的周期以两个相邻脉冲的边沿为基准进行测量。
信号边沿检测的通用方法是:应用同步寄存器来捕获和存储被测频率信号。若应用三级右移寄存器作为同步器,如图所示,当存储数据Q0Q1Q2=x10
时,表示检测到被测信号的上升沿,存储数据Q0Q1Q2=x01时,表示检测到被测信号的下降沿,其中x表示无关位。n=ln(5*109)/ln2
≈32.222n>=5*109moduleedge_detector(inputdet_clk,//时钟,50MHzinputrst_n,//复位信号,低电平有效inputx_signal,//被测信号outputwirerising_edge,//上升沿标志,高电平有效outputwirefall_edge//下降沿标志,高电平有效);reg[0:2]sync_reg;
//三级同步寄存器定义//同步移存过程always@(posedgedet_clkornegedgerst_n)if(!rst_n)sync_reg<=3'b000;elsesync_reg<={x_signal,sync_reg[0:1]};//边沿检测逻辑assignrising_edge=sync_reg[1]&~sync_reg[2];assignfall_edge=~sync_reg[1]&sync_reg[2];endmodule描述信号边沿检测电路的Verilog代码参考如下:当Q0Q1Q2=x10时,表示检测到被测信号的上升沿,其中x表示无关位。当Q0Q1Q2=x01时,表示检测到被测信号的下降沿,其中x表示无关位。设计过程:对于周期法频率计,状态机内部需要定义4个状态:复位(RESET)、空闲(IDLE)、计数(COUNT)和结束(DONE)。
状态转换的基本思路是:(1)复位信号有效时,强制状态机处于RESET状态;(2)复位信号撤销后,状态机转入IDLE状态,等待被测信号的有效沿。(3)检测到第一个有效沿时,状态机转入COUNT状态,开始进行计数;(4)检测到第二个有效沿时,状态机转入DONE状态,停止计数并输出周期计数值;(5)状态机处于DONE时,下一个时钟脉冲转入IDLE状态。根据上述状态转换图,描述周期测量状态机的Verilog代码参考如下:moduleperiod_detector(
inputdet_clk,
//检测电路时钟,50MHz
inputrst_n,
//复位信号,低电平有效
inputx_signal,
//被测频率信号
outputreg[32:0]period_value//周期测量值
);
//状态定义及编码
localparamRESET=4'b0001;
localparamIDLE
=4'b0010;
localparamCOUNT=4'b0100;
localparamDONE=4'b1000;
//内部线网和变量定义
reg[0:2]sync_reg;//移位寄存变量
(*synthesis,probe_port,keep*)
wirefall_edge;//下降沿标志reg[3:0]current_state,next_state;//现态与次态
(*synthesis,probe_port,keep*)wirecnt_en;//计数允许信号
(*synthesis,probe_port,keep*)reg[32:0]period_cnt;
//周期计数值
//下降沿检测逻辑assignfall_edge=~sync_reg[1]&sync_reg[2];
//计数允许逻辑assigncnt_en=(current_state==COUNT);
//同步移存过程always@(posedgedet_clkornegedgerst_n)if(!rst_n)sync_reg<=3'b000;elsesync_reg[0:2]<={x_signal,sync_reg[0:1]};
//状态机转换过程always@(posedgedet_clkornegedgerst_n)if(!rst_n)current_state<=RESET;
elsecurrent_state<=next_state;
//次态逻辑描述always@(current_state)
case(current_state)
RESET:next_state<=IDLE;
IDLE:if(fall_edge)next_state<=COUNT;elsenext_state<=IDLE;COUNT:if(fall_edge)next_state<=DONE;
elsenext_state<=COUNT;DONE:next_state<=IDLE;
default:next_state<=RESET;endcase
//周期计数过程always@(posedgedet_clk)if(current_state==IDLE)period_cnt<={33{1'b0}};elseif(cnt_en)period_cnt<=period_cnt+1'b1;
//计数锁存过程always@(current_state)if(current_state==DONE)period_value<=period_cnt;endmodule上述状态机代码的仿真波形如图所示。从图中可以看出,状态机时序正确。
应用状态机统计到被测信号周期的计数值period_value后,还需要将计数值转换为周期值,然后再换算为频率值。
由于状态机的时钟为50MHz,所以标准信号的周期Tdet_clk=20ns,因此被测信号的周期值Tx为
Tx=period_value×Tdet_clk=period_value×20(ns)因此,被测信号的频率值为
fx=1/Tx=109/(period_value×20)=5×107/period_value(Hz)由上式可以看出,需要应用除法器来计算被测信号的频率值。下面先定义被测信号的显示格式。
测量10mHz~10kHz低频信号的频率,定义被测信号的频率大于等于1Hz时,频率值以“4位整数+4位小数”的格式显示,被测信号的频率小于1Hz时,频率值以“8位小数”的格式显示。
按上述思路处理时,则
108×fx=5×1015/period_value
由于被除数5×1015需要用53位二进制数(252<5×1015<253)表示,而除数period_value为33位二进制数,因此需要定制53位二进制数除以33位二进制数的除法器。
4位整数+4位小数8位小数
设fx=qqq...qqqq.rrrrrrrr...r。为处理方便,先将计算得到的频率值fx扩大108倍,因此,当频率小于1Hz时除法的商即为实际的频率值,以“8位小数”格式显示。当频率大于小于1Hz时,再缩小104倍(相当于将fx只扩大104倍),则以“4位整数+4位小数”加上小数点显示时,即为实际的频率值。
n=ln(5*1015)/ln2≈52.152n>=5*1015除法器定制过程:”DIVIDER_for_freqor“
在“DIVIDER_for_freqor_inst.v”前打√,表示生成例化模板文件,以便可以应用例化语句调用定制的除法器。根据上述处理思路,将周期计数值转换为频率的Verilog描述代码参考如下:moduleperiod2freq(input[32:0]period_value,
//33位周期计数值outputwire[27:0]freq_value,//频率值,需要应用BIN28toBCD转换为8个BCD码outputwireDP_flag//小数点标志);
//内部线网定义
wire[52:0]div_quotient;//53位除法商数
wire[32:0]div_remain;//33位除法余数wire[52:0]freq_temp;//商数÷10000//除法器IP例化DIVIDER_for_freqorDIVIDER_for_freqor_inst( .denom(period_value),
//分母,周期计数值 .numer(53'd5000000000000000),
//分子,常数5×1015 .quotient(div_quotient),
//除法商数,53位 .remain(div_remain)
//除法余数,33位 );
//频率显示值和小数点标志输出assignfreq_temp=div_quotient/10000;assignfreq_value=(div_quotient<100000000)?
//小于108?div_quotient[27:0]:
//小于1Hz,以“8位小数”显示freq_temp[27:0];
//大于等于1Hz,以“4位整数+4位小数”显示assignDP_flag=(div_quotient<100000000)?0:1;endmodulemoduleHEX7_44(input[27:0]iBIN28,//频率值输入inputDP_flag,//小数点标志outputwire[6:0]aSEG3,aSEG2,aSEG1,aSEG0,//高4个数码管驱动信号outputwire[6:0]bSEG3,bSEG2,bSEG1,bSEG0,//低4个数码管驱动信号outputwireDP_point//小数点驱动信号);//内部线网定义wire[31:0]DispBCD;//显示值,8个BCD码//28位二进制数转换为BCD码模块例化
BIN28toBCDx0(.BINdata(iBIN28),.BCDout(DispBCD));//显示译码器例化
CD4511sUa3(.le(1'b0),.bcd(DispBCD[31:28]),.seg7(aSEG3));
CD4511sUa2(.le(1'b0),.bcd(DispBCD[27:24]),.seg7(aSEG2));
CD4511sUa1(.le(1'b0),.bcd(DispBCD[23:20]),.seg7(aSEG1));
CD4511sUa0(.le(1'b0),.bcd(DispBCD[19:16]),.seg7(aSEG0));
CD4511sUb3(.le(1'b0),.bcd(DispBCD[15:12]),.seg7(bSEG3));
CD4511sUb2(.le(1'b0),.bcd(DispBCD[11:8]),.seg7(bSEG2));
CD4511sUb1(.le(1'b0),.bcd(DispBCD[7:4]),.seg7(bSEG1));
CD4511sUb0(.le(1'b0),.bcd(DispBCD[3:0]),.seg7(bSEG0));//小数点驱动逻辑assignDP_point=DP_flag;endmoduleBIN28toBCD.v参看5.4.3节中的描述代码。CD4511s.v参看4.5节“数字频率计的设计-基于HDL方法”中的描述代码。modulefx20(
inputclk50,//时钟,50MHzinput[4:0]
fsel,//频率选择outputregfpout//信号源输出);//内部变量定义
reg[31:0]q;//计数变量//计数逻辑描述always@(posedgeclk50)q<=q+1'b1;//输出选择过程always@(fsel,q)case(fsel)//根据fsel分频输出5'b01100:fpout=q[12];//6103.515625Hz5'b01101:fpout=q[13];//3051.7578125Hz
20路分频式信号源,输出信号频率为:0.01~6103Hz,由4.5节中模块fx32.v简化而来。
5'b01110:fpout=q[14];//1525.87890625Hz
5'b01111:fpout=q[15];//762.939453125Hz5'b10000:fpout=q[16];//381.4697265625Hz5'b10001:fpout=q[17];//190.7348631825Hz5'b10010:fpout=q[18];//95.367431640625Hz5'b10011:fpout=q[19];//47.6837158203125Hz5'b10100:fpout=q[20];//23.84185791015625Hz5'b10101:fpout=q[21];//11.920928955078125Hz5'b10110:fpout=q[22];//5.9604644775390625Hz5'b10111:fpout=q[23];//2.9802322876953125Hz5'b11000:fpout=q[24];//1.490116119384765625Hz5'b11001:fpout=q[25];//0.7450580596923828125Hz5'b11010:fpout=q[26];//0.37252902984619140625Hz5'b11011:fpout=q[27];//0.186264514923095703125Hz5'b11100:fpout=q[28];//0.0931322574615478515625Hz5'b11101:fpout=q[29];//0.04656612873077392578125Hz5'b11110:fpout=q[30];//0.023283064365386962890625Hz5'b11111:fpout=q[31];//0.0116415321826934814453125Hzdefault:fpout=q[14];//1525.87890625Hzendcaseendmodule有效测频范围:0.01164~6103.5Hz,0.01%直接测频法频率计:5859Hz~100MHz,0.01%等精度频率计:45Hz~100MHz,0.01%周期法频率计测频结果分析定义被测信号的频率大于等于1Hz时,频
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《护理安全防范》课件
- 《电子化广告》课件
- 《物流师基础》课件
- 《海尔管理模式》课件
- 医学科研和论文撰写中常用数据处理和统计分析方法
- 《数据的代表》课件
- 《景观设计常用尺寸》课件
- 2026珠海人工智能视觉识别技术方案破解度研究产业资本布局方案
- 招投标阶段工程造价
- 教科版二年级上册1.4《观察月相》
- 2026年全国煤炭生产经营单位(安全生产管理人员)考试题库含答案
- 2026年《中国脑卒中防治和康复管理指南(2026版)》
- 2026新教材数学 2.1.1 第1课时 有理数加法法则
- 第5课 中国人民站起来了 第3课时 课件(内嵌视频)2026-2027学年道德与法治五年级上册统编版
- 2026年全媒体运营师理论考试题库(重点350题)
- 2026新版检验检测机构管理评审报告
- 机械原理 课件 第2章-常用机构
- 职业卫生技术服务机构质量管理体系手册
- SYT 5079-2025《石油天然气钻采设备 油井测试设备》
- 《机械制图》电子教材
- CJT511-2017 铸铁检查井盖
评论
0/150
提交评论