数字系统设计文档智能频率计.docx

上传人:b****2 文档编号:20114157 上传时间:2023-04-25 格式:DOCX 页数:17 大小:125.36KB
下载 相关 举报
数字系统设计文档智能频率计.docx_第1页
第1页 / 共17页
数字系统设计文档智能频率计.docx_第2页
第2页 / 共17页
数字系统设计文档智能频率计.docx_第3页
第3页 / 共17页
数字系统设计文档智能频率计.docx_第4页
第4页 / 共17页
数字系统设计文档智能频率计.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

数字系统设计文档智能频率计.docx

《数字系统设计文档智能频率计.docx》由会员分享,可在线阅读,更多相关《数字系统设计文档智能频率计.docx(17页珍藏版)》请在冰豆网上搜索。

数字系统设计文档智能频率计.docx

数字系统设计文档智能频率计

 

简易数字频率计

-------数字系统设计文档

姓名:

王淑丽

学号:

 

我在本课程中所选择的课题是用VerilogHDL实现的简易数字频率计。

设计的频率器可以实现在量程范围内根据被测信号大小自动更换量程,并用数码管显示频率值,用发光二级管显示量程。

此次设计的目的要求如下:

(1)频率测量范围10Hz~1MHz

(2)量程自动转换,量程分为10KHz(1s)、100KHz(0.1s)、1MHz(10ms)三档。

转换规则如下:

当读数大于9999时,频率计处于超量程状态,下一次测量时,量程自动增大一档;当读数小于0999时,频率计处于欠量程状态,下一次测量时,量程自动减小一档

(3)数据采用记忆显示方式,即计数过程中不显示数据,待计数过程结束以后,显示计数结果,并将此显示结果保持到下一次计数结束。

(4)用发光二极管显示量程。

系统模型及实际测试情况

设计的频率计包括三个量程指示灯,四位数码管显示,复位键,外接信号接线孔,GND接线孔。

其界面如下图:

系统运行结果:

复位键播向0,系统不工作,三个量程显示灯均不亮,四位数码管显示为0000;复位键播向1,系统进入正常工作状态,开始以下测量:

当输入信号为6.34KHZ时,红色指示灯亮起,数码管显示:

6.340。

当输入信号为29.352KHZ时,绿色指示灯亮起,数码管显示:

29.35

当输入信号为273.9KHZ时,黄色指示灯亮起,数码管显示:

273.9

系统原理及设计流程

根据设计要求可以很容易得出程序的流程图如下:

由流程图便可以设计系统了,本系统可根据功能分为五个功能模块。

分别为:

分频器,计数器,控制器,锁存器,显示模块。

用VerilogHDL编程时也是根据各个模块的功能要求,分别编写每一个子模块的程序,然后把每个模块封装起开。

最终的系统就用这五个模块连接起来即可。

每个模块的作用说明如下:

分频器:

此模块的输入信号为来自控制器的量程选择信号、机内标准时钟(2MHZ),复位信号。

输出信号为门限信号,供给计数器作为计数技术时间。

计数器:

计数器以被测信号上升沿为触发事件,在门限信号内部计数器累计加1,门限结束根据计数器的计数值判断量程是否合适,并将判断结果以标志位的形式发送给控制器,同时将计数结果输出给锁存器。

如果控制器发出清零信号,将立刻清除标记位。

控制器:

作为系统核心的控制器,它以被测信号上升沿为触发事件,不断的检测计数器发出的标志位(表征判断量程是否合适)。

如果量程合适,发出锁存信号给锁存器;如果量程偏大或偏小,则根据具体情况重置输出量程选择信号,并发出清零信号给计数器。

锁存器:

锁存器以锁存信号上升沿为触发事件,每响应一次就将输入端的计数值与量程选择输出给显示电路。

显示电路:

显示电路以被测信号上升沿为响应事件,每响应一次就根据所选量程控制相应的指示灯亮起。

并根据计数值的不同控制四位数码管显示出计数值即可。

以上五个模块的具体连接情况如下图:

程序代码如下:

(1)分频模块:

modulenewclk(clk,rst,k1,k2,outclk);

inputclk,k1,k2,rst;

outputoutclk;

regoutclk;

reg[20:

0]cnt;

reg[1:

0]state;

always@(posedgeclk)

begin

if(!

rst)begincnt<=0;

outclk<=0;

end

elsecnt<=cnt+1;

if(state!

={k1,k2})//判断量程是否改变

begin

if(outclk==0)

begin

outclk<=~outclk;

cnt<=0;

end

else;

end

else;

if({k1,k2}==0)//低量程计时1s

begin

if(cnt==1999999)//999999

begin

cnt<=0;

outclk<=~outclk;

end

else;

end

elseif({k1,k2}==1)//中间量程计时0.1s

begin

if(cnt==199999)//99999

begin

cnt<=0;

outclk<=~outclk;

end

else;

end

elseif({k1,k2}==2)//高量程计时10ms

begin

if(cnt==19999)//9999

begin

cnt<=0;

outclk<=~outclk;

end

else;

end

elseoutclk<=0;

state<={k1,k2};

end

endmodule

(2)计时器模块

modulecount(cout0,cout1,cout2,cout3,high,low,door,fx,clr,reset);

inputfx,door,clr,reset;

outputhigh,low;//high表示计数是否>9999;low表示计数是否<=999

output[3:

0]cout0,cout1,cout2,cout3;

reghigh,low,cout0,cout1,cout2,cout3;

reg[14:

0]counter;

regqdoor;

always@(posedgefx)

begin

if(reset==1)//

begin

if(clr==0)//不清零

begin

case({qdoor,door})//寻找门限

2'b00:

;

2'b01:

counter=1;//门限开始

2'b10:

begin//门限结束

if(counter<1000)

begin

high=0;

low=0;

end

else

begin

low=1;

if(counter>9999)high=1;

elsehigh=0;

end

cout0=counter/1000;

cout1=(counter/100)%10;

cout2=(counter/10)%10;

cout3=counter%10;

end

default:

counter=counter+1;//门限内部计数

endcase

end

else//清零信号作用

begin

high=1;

low=0;

counter=2;

end

end

else//复位信号作用

begin

high=1;

low=0;

counter=0;

end

qdoor=door;

end

endmodule

(3)控制器模块

modulecontrol(s1,s2,show,high,low,clk,reset,clr);

inputhigh,low,clk,reset;

outputs1,s2,show,clr;//s1,s2是量程选择信号,show为锁存信号,clr是清零信号;

regs1,s2,show,clr,temp1;

reg[1:

0]temp;

always@(posedgeclk)

begin

if(reset==1)

begin

case(temp)//使清零信号保持2个时钟周期,以便计数器响应

2'b01:

begin

clr=~clr;

temp=temp-1;

end

2'b10:

temp=temp-1;

default;

endcase

if(temp1==1)

begin

show=~show;

temp1=0;

end

else;

case({high,low})

2'b00:

begin

if({s1,s2}>0){s1,s2}={s1,s2}-1;

else;

clr=~clr;

temp=2;

end

2'b01:

begin

show=~show;

temp1=1;

end

2'b11:

begin

if({s1,s2}<2){s1,s2}={s1,s2}+1;

else;

clr=~clr;

temp=2;

end

default;

endcase

end

else

begin

s1=0;

s2=1;

show=0;

clr=0;

end

end

endmodule

(4)锁存器模块

modulelock(reset,show,cin0,cin1,cin2,cin3,s1,s2,cout0,cout1,cout2,cout3,k1,k2);

inputreset,show,s1,s2;

input[3:

0]cin0,cin1,cin2,cin3;

output[3:

0]cout0,cout1,cout2,cout3;

outputk1,k2;

regcout0,cout1,cout2,cout3,k1,k2;

always@(posedgeshow)

begin

if(reset!

=0)

{cout0,cout1,cout2,cout3,k1,k2}={cin0,cin1,cin2,cin3,s1,s2};

else

{cout0,cout1,cout2,cout3,k1,k2}=3;//无效

end

endmodule

(5)显示电路

moduleshow(clk,reset,cin0,cin1,cin2,cin3,k1,k2,cout0,cout1,cout2,cout3,s1,s2,s3,point);

input[3:

0]cin0,cin1,cin2,cin3;

inputclk,reset,k1,k2;

output[6:

0]cout0,cout1,cout2,cout3;//七段数码管显示

output[3:

0]point;//四位小数点

outputs1,s2,s3;//量程指示灯

regcout0,cout1,cout2,cout3,s1,s2,s3,point;

always@(posedgeclk)

begin

if(reset!

=0)

begin

case(cin0)

4'b0000:

cout0=7'b0000001;

4'b0001:

cout0=7'b1001111;

4'b0010:

cout0=7'b0010010;

4'b0011:

cout0=7'b0000110;

4'b0100:

cout0=7'b1001100;

4'b0101:

cout0=7'b0100100;

4'b0110:

cout0=7'b0100000;

4'b0111:

cout0=7'b0001111;

4'b1000:

cout0=7'b0000000;

4'b1001:

cout0=7'b0000100;

default:

;

endcase

case(cin1)

4'b0000:

cout1=7'b0000001;

4'b0001:

cout1=7'b1001111;

4'b0010:

cout1=7'b0010010;

4'b0011:

cout1=7'b0000110;

4'b0100:

cout1=7'b1001100;

4'b0101:

cout1=7'b0100100;

4'b0110:

cout1=7'b0100000;

4'b0111:

cout1=7'b0001111;

4'b1000:

cout1=7'b0000000;

4'b1001:

cout1=7'b0000100;

default:

;

endcase

case(cin2)

4'b0000:

cout2=7'b0000001;

4'b0001:

cout2=7'b1001111;

4'b0010:

cout2=7'b0010010;

4'b0011:

cout2=7'b0000110;

4'b0100:

cout2=7'b1001100;

4'b0101:

cout2=7'b0100100;

4'b0110:

cout2=7'b0100000;

4'b0111:

cout2=7'b0001111;

4'b1000:

cout2=7'b0000000;

4'b1001:

cout2=7'b0000100;

default:

;

endcase

case(cin3)

4'b0000:

cout3=7'b0000001;

4'b0001:

cout3=7'b1001111;

4'b0010:

cout3=7'b0010010;

4'b0011:

cout3=7'b0000110;

4'b0100:

cout3=7'b1001100;

4'b0101:

cout3=7'b0100100;

4'b0110:

cout3=7'b0100000;

4'b0111:

cout3=7'b0001111;

4'b1000:

cout3=7'b0000000;

4'b1001:

cout3=7'b0000100;

default:

;

endcase

case({k1,k2})

2'b00:

begin

s3=0;s2=0;s1=1;

point[3]=0;

point[2]=1;

point[1]=1;

point[0]=1;

end

2'b01:

begin

s2=1;s1=0;s3=0;

point[3]=1;

point[2]=0;

point[1]=1;

point[0]=1;

end

2'b10:

begin

s3=1;s2=0;s1=0;

point[3]=1;

point[2]=1;

point[1]=0;

point[0]=1;

end

default:

;

endcase

end

else

begin

{cout0,cout1,cout2,cout3}=28'b000001;

s1=0;s2=0;s3=0;

point[3]=1;

point[2]=1;

point[1]=1;

point[0]=1;

end

end

endmodule

最终设计的顶层文件(gdf格式)如下:

仿真结果:

(1)当测量信号频率在高量程时,仿真时序图如下:

从图中可以看出四个小数点的变化总是随着量程的变化而变化。

分频器输出的门信号最初为200ns,计数器在200ns内计数值超过9999,于是控制器发出清零信号,同时更换量程,分频器输出20ns的门控信号,计数器重新计数,计数值符合要求,控制器发出锁存信号,数码管显示计数值。

三个LED灯显示量程。

(2)当测量信号频率在中间量程时,仿真时序图如下:

从图中可以看出四个小数点的变化总是随着量程的变化而变化。

分频器输出的门信号最初为200ns,计数器在200ns内计数,计数值符合要求,控制器发出锁存信号,数码管显示计数值。

三个LED灯显示量程

(3)当测量信号频率在低量程时的仿真时序图如下:

从图中可以看出四个小数点的变化总是随着量程的变化而变化。

分频器输出的门信号最初为20ns,计数器在20ns内计数值小于999,于是控制器发出清零信号,同时更换量程,分频器输出200ns的门控信号,计数器重新计数,计数值符合要求,控制器发出锁存信号,数码管显示计数值。

三个LED灯显示量程。

从以上仿真结果可以看出设计的系统可以实现自动更换量程,并且记忆显示测量量结果。

满足设计要求。

实验总结

通过此次试验,我熟悉了数字电路的基本设计流程。

同时也基本掌握了VerilogHDL语言及其开发平台。

对于复杂系统可以做到自顶向下的设计思想,将复杂的功能按功能划分功能模块,模块化的设计思想在设计过程中是非常重要的。

而且我更加深刻的感受到对于硬件开发,时序是至关重要的,只有正确的时序各个功能模块才能正常的相互配合,系统才能有条不紊的进行正常运行。

一旦时序混乱或是不匹配,整个系统就会进入一种错误的运行状态。

因此在设计应该规划好时序问题,以便于调试。

总之,此次实验基本上是成功的,但是仍有很多问题存在。

设计的作品是较为粗糙的,代码的编写也不是很规范,设计中很多问题还没有想清楚就开始编写代码,导致不停得修改,浪费了很多时间。

在以后的学习或工作中,一定注意这些问题,希望自己有更大的进步。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1