EDA简易数字频率计设计.docx
《EDA简易数字频率计设计.docx》由会员分享,可在线阅读,更多相关《EDA简易数字频率计设计.docx(9页珍藏版)》请在冰豆网上搜索。
EDA简易数字频率计设计
简易数字频率计的设计
一.实验内容
根据我们已经学习的有关Verilog的有关知识,如计数器、锁存器、扫描器、译码器、分频器等,再根据频率的定义,我们来设计一个简易的数字频率计,它的计数范围在0~Hz之间,并让误差尽可能的小,因为我们知道频率就是一秒内信号所重复的次数,所以根据这个定义我们很容易想到它所用到的核心原理与模块。
二.方案设计
下面是简易数字频率计的设计思想框图:
这次设计的关键程序是0~计数器,计数器对输入信号进行计数,然后通过1Hz精密时钟的控制,每1秒钟向显示数据缓冲Buffer(实质上是一个寄存器)中传一次数据,1Hz精密时钟又通过对Buffer的控制,让Buffer每隔1秒向扫描显示模块传输一次数据,扫描时钟控制显示模块的输出。
此程序的1Hz精密时钟应做到十分准确,该时钟对门控电路(此实验中用与非门)的控制是与计数器的控制正好相反的,当计数器计数的数据传向Buffer时,门控电路因时钟对与非门输入“1时”,输入被隔,输出为“0”,此时计数器不计数;当时钟对与非门输入“0时”,被测信号输入计数器,且在计数前,精密时钟已对计数器清零。
这样不断反复,便可及时更新显示数据。
时钟频率为1Hz,即周期为1秒,使计数器在1秒内计数的次数即为被测信号的频率。
整体设计实现的方框图:
三.实验步骤
本实验我给出实验当中关键的几个模块的设计,它们分别如下所述:
1)my_模块
此程序实现的方法一:
modulemy__2(clk,clr,q);
inputclk,clr;
output[31:
0]q;
reg[31:
0]q;
always@(posedgeclkornegedgeclr)
begin
if(!
clr)q=0;
elsebegin
if(q[3:
0]<9)q[3:
0]=q[3:
0]+1;
elsebeginq[3:
0]=0;
if(q[7:
4]<9)q[7:
4]=q[7:
4]+1;
elsebeginq[7:
4]=0;
if(q[11:
8]<9)q[11:
8]=q[11:
8]+1;
elsebeginq[11:
8]=0;
if(q[15:
12]<9)q[15:
12]=q[15:
12]+1;
elsebeginq[15:
12]=0;
if(q[19:
16]<9)q[19:
16]=q[19:
16]+1;
elsebeginq[19:
16]=0;
if(q[23:
20]<9)q[23:
20]=q[23:
20]+1;
elsebeginq[23:
20]=0;
if(q[27:
24]<9)q[27:
24]=q[27:
24]+1;
elsebeginq[27:
24]=0;
if(q[31:
28]<9)q[31:
28]=q[31:
28]+1;
elseq[31:
28]=0;
end
end
end
end
end
end
end
end
end
endmodule
方法一仿真波形如下所示:
方法二:
modulemy_(clk,clr,q);
inputclk,clr;
output[31:
0]q;
reg[31:
0]q;
always@(posedgeclkornegedgeclr)
begin
if(!
clr)q=0;
elseif(q[3:
0]<9)q[3:
0]=q[3:
0]+1;
elseif(q[7:
4]<9)beginq[7:
4]=q[7:
4]+1;q[3:
0]=0;end
elseif(q[11:
8]<9)beginq[11:
8]=q[11:
8]+1;q[7:
4]=0;end
elseif(q[15:
12]<9)beginq[15:
12]=q[15:
12]+1;q[11:
8]=0;end
elseif(q[19:
16]<9)beginq[19:
16]=q[19:
16]+1;q[15:
12]=0;end
elseif(q[23:
20]<9)beginq[23:
20]=q[23:
20]+1;q[19:
16]=0;end
elseif(q[27:
24]<9)beginq[27:
24]=q[27:
24]+1;q[23:
20]=0;end
elseif(q[31:
28]<9)beginq[31:
28]=q[31:
28]+1;q[27:
24]=0;end
elseq[31:
28]=0;
end
endmodule
方法二仿真波形如下所示:
对比发现,方法二的程序显得更简单一些,但实际给出一样的仿真时间的时候,方法二的编译比方法一的时间要长的多,而且方法一的思想显得很清晰,很容易理解一些,总体思想就是,如果相邻低位小于9,则低位在每个时钟的上升沿进行加1,而高位不变;反之,低位清0,高位加1.
2)分频器
24MHz分频为400Hz模块:
modulezhuan24m_400hz(clk24m,clko);
inputclk24m;
outputclko;
regclko;
reg[15:
0]count;
always@(posedgeclk24m)
begin
if(count==60000)begincount=0;clko=1;end
elsebegincount=count+1;clko=0;end
end
endmodule
400Hz分频为1Hz模块:
modulezhuan400_1hz(clk400,clko);
inputclk400;
outputclko;
regclko;
reg[15:
0]count;
always@(posedgeclk400)
begin
if(count==400)begincount=0;clko=1;end
elsebegincount=count+1;clko=0;end
end
endmodule
3)寄存器buffer模块
modulebuffer(qo,din,load);
input[31:
0]din;
inputload;
output[31:
0]qo;
reg[31:
0]qo;
always@(posedgeload)
beginqo=din;end
endmodule
该模块的作用就是锁存每次计数器送过来的数据,只在时钟的上升沿将数据送到8选一数据选择器,然后再通过译码器进行输出。
4)8选一数据选择器模块:
modulemux_8(m,sel,out);
input[2:
0]sel;
input[31:
0]m;
output[3:
0]out;
wire[3:
0]out;
assignout=(sel==0)?
m[3:
0]:
(sel==1)?
m[7:
4]:
(sel==2)?
m[11:
8]:
(sel==3)?
m[15:
12]:
(sel==4)?
m[19:
16]:
(sel==5)?
m[23:
20]:
(sel==6)?
m[27:
24]:
m[31:
28];
endmodule
该8选一数据选择器的功能就是将输进来的数据Q按比特由高到底每4位送个一个数码管,数码管也是由高到底进行显示的
5)译码模块:
moduledeled(in,a,b,c,d,e,f,g,dp);
input[3:
0]in;
outputa,b,c,d,e,f,g,dp;
wirea,b,c,d,e,f,g,dp;
assign{dp,a,b,c,d,e,f,g}=
(in==4'b0000)?
8'b01111110:
(in==4'b0001)?
8'b00110000:
(in==4'b0010)?
8'b01101101:
(in==4'b0011)?
8'b01111001:
(in==4'b0100)?
8'b00110011:
(in==4'b0101)?
8'b01011011:
(in==4'b0110)?
8'b01011111:
(in==4'b0111)?
8'b01110000:
(in==4'b1000)?
8'b01111111:
(in==4'b1001)?
8'b01111011:
8'b00000000;
Endmodule
6)扫描模块:
modulescan(clr,clk,q);
inputclk,clr;
output[2:
0]q;
reg[2:
0]q;
always@(posedgeclkornegedgeclr)
begin
if(!
clr)q=0;
elseq=q+1;
end
endmodule
7)消零模块
modulemyq_p(q,p);
input[31:
0]q;
output[31:
0]p;
reg[31:
0]p;
always@
(1)
begin
if(q[31:
28]==0)beginp[31:
28]=4'b1111;
if(q[27:
24]==0)beginp[27:
24]=4'b1111;
if(q[23:
20]==0)beginp[23:
20]=4'b1111;
if(q[19:
16]==0)beginp[19:
16]=4'b1111;
if(q[15:
12]==0)beginp[15:
12]=4'b1111;
if(q[11:
8]==0)beginp[11:
8]=4'b1111;
if(q[7:
4]==0)beginp[7:
4]=4'b1111;
if(q[3:
0]==0)p[3:
0]=4'b1111;
elsep[3:
0]=q[3:
0];
end
elsep[7:
0]=q[7:
0];
end
elsep[11:
0]=q[11:
0];
end
elsep[15:
0]=q[15:
0];
end
elsep[19:
0]=q[19:
0];
end
elsep[23:
0]=q[23:
0];
end
elsep[27:
0]=q[27:
0];
end
elsep=q;
end
endmodule
该程序是从高位到低位依次进行判断,凡是高位的0都把它灭掉,数据中间的0和尾部的0都照常显示。
四.结果分析
本实验所设计的简易数字频率计只能测量大于1Hz的方波信号,小于1的只能按1或0显示,这个频率计在测量达到十万Hz以上是会有20~30Hz的误差,而且只能测量方波,对于需要测量其它的波(如正弦波,三角波等)已不能满足,所以我们还有更多的功能有待改进。
五.经验总结
我们需要对一些常见的测量仪器的一些简单的、基本的原理掌握清楚,然后根据我们已经学习的VerilogHDL语言把它描述出来才是我们的能力,从这次实验当中,我觉得我们首先需要的是一种把所做的实验的原理框图转变成我们的verilog语言,然后需要的一种能力就是把我们想到的问题画成一张原理框图,之后根据这个原理框图设计出我们的作品,只有熟练地做到这两步,我们才能创造出一些属于我们自己的东西。