数字系统设计文档智能频率计.docx
- 文档编号:10924843
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:17
- 大小:100.49KB
数字系统设计文档智能频率计.docx
《数字系统设计文档智能频率计.docx》由会员分享,可在线阅读,更多相关《数字系统设计文档智能频率计.docx(17页珍藏版)》请在冰豆网上搜索。
数字系统设计文档智能频率计
简易数字频率计
-------数字系统设计文档
姓名:
王淑丽
学号:
我在本课程中所选择的课题是用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语言及其开发平台。
对于复杂系统可以做到自顶向下的设计思想,将复杂的功能按功能划分功能模块,模块化的设计思想在设计过程中是非常重要的。
而且我更加深刻的感受到对于硬件开发,时序是至关重要的,只有正确的时序各个功能模块才能正常的相互配合,系统才能有条不紊的进行正常运行。
一旦时序混乱或是不匹配,整个系统就会进入一种错误的运行状态。
因此在设计应该规划好时序问题,以便于调试。
总之,此次实验基本上是成功的,但是仍有很多问题存在。
设计的作品是较为粗糙的,代码的编写也不是很规范,设计中很多问题还没有想清楚就开始编写代码,导致不停得修改,浪费了很多时间。
在以后的学习或工作中,一定注意这些问题,希望自己有更大的进步。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 系统 设计 文档 智能 频率计