数字频率计实验报告.docx

上传人:b****7 文档编号:9184667 上传时间:2023-02-03 格式:DOCX 页数:24 大小:235.36KB
下载 相关 举报
数字频率计实验报告.docx_第1页
第1页 / 共24页
数字频率计实验报告.docx_第2页
第2页 / 共24页
数字频率计实验报告.docx_第3页
第3页 / 共24页
数字频率计实验报告.docx_第4页
第4页 / 共24页
数字频率计实验报告.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

数字频率计实验报告.docx

《数字频率计实验报告.docx》由会员分享,可在线阅读,更多相关《数字频率计实验报告.docx(24页珍藏版)》请在冰豆网上搜索。

数字频率计实验报告.docx

数字频率计实验报告

数字频率计设计

计双0102雷昊2001011830786

一、课程设计内容及要求

本次课程设计要求设计并用FPGA实现一个数字频率计,具体设计要求如下:

测量频率范围:

10Hz〜100KHz精度:

AF/F<±2%

系统外部时钟:

1024Hz测量波形:

方波Vp-p=3〜5V

硬件设备:

AlteraFlex10K10五位数码管LED发光二极管

编程语言:

VerilogHDL/VHDL

二、系统总体设计

输入待测信号频率自动选择量程,并在超过最大量程时显示过量程,当复位脉冲到来时,系统复位,重新开始计数显示频率。

基于上述要求,可以将系统基本划分为四个模块,分别为

分频、计数、锁存和控制,并可以确定基本的连接和反馈,如上图所示。

三、系统及模块设计与说明

N

到T0时间内待测脉冲的个数N,则有f=一。

由图不可以看出,一个闸门电平时间内计数

的最大误差为N±1,为保证误差要求取N>100o经计算,四档的闸门电平时间T0分别为

10s、1s、0.1s和0.01s。

仅对计数器计数值N进行简单的移位即可得到结果。

产生闸门电平的工作由分频器完成。

分频器采用计数分频的方法,产生计数闸门电平和一系列控制脉冲,并接受计数器和控

制器的反馈。

控制器主要用来判断计数器计数是否有效,从而控制档位转换,锁存器打开、关闭和设定值。

计数器在分频器和控制器的作用下对输入待测信号计数,并把计数值输出,在计数溢出时向控制器和分频器发送溢出脉冲。

锁存器用来储存有效计数值,以稳定输出。

四、系统及模块具体实现与说明

系统总体结构图见附图1,下面对每一个模块的具体功能、引脚分配和VerilogHDL语

言编程实现进行详细说明。

在分模块介绍之前先说明两个重要的寄存器状态STAT[1..0]和LATCH_STAT[1..0]。

STAT[1..0]

用来保存当前档位信息,STAT[1..0]等于0则为第一档,等于1则为第二档,依此类推,共可标记四档,它位于控制模块中,也是输出,这样其他模块可以通过访问它得到当前档位信息,而控制模块可以修改它从而调整档位(注:

在系统总图中由于所有与STAT[1..0]相连的线路均为对应顺序连接,故没有才用MAX+plusII中默认的总线连接,而是采用单根线)。

LATCH_STAT[1..0]

用来保存锁存器状态信息,LATCH_STAT[1..0]=0时,锁存器在CLK作用下打开关闭。

LATCH_STAT[1..0]=1时,锁存器强制置零,CLK无效。

LATCH_STAT[1..0]=2时,锁存

器强制置1FFFF,CLK无效。

它也在控制器中,这样可以通过对其改变数值达到控制锁存器锁存、复位和显示过量程的功能。

计数器COUNTER

计数器设计图见附图1右上部分,由四个十进制计数器级联。

四个输入端口:

时钟脉冲

CLK、使能端EN、清零端CLRN、档位状态端STAT[1..0]。

五个输出端口:

四个四位十进制BCD码输出OUT1[3..0]〜OUT4[3..0]、过量程溢出OF。

功能表见下:

modulecounter_10(clk,en,clrn,cr,out);

〃clk:

时钟脉冲,上升沿触发en:

使能端,高电平有效

//clrn:

清零端,上升沿,高电平有效

inputclk,en,clrn;

//cr:

进位端

outputcr;

regcr;

〃四位十进制BCD码输出

每个十进制计数器用VerilogHDL语百编程实现。

源程序如下:

output[3:

0]out;reg[3:

0]out;always@(posedgeclkorposedgeclrn)begin

//clrn上升沿、高电平清零if(clrn)begin

out<=0;

cr<=0;end

elsebegin

//en为高,模十加一计数,en为低,计数保持if(en)begin

if(out<9)beginout<=out+1;cr<=0;

end

elseif(out==9)beginout<=0;

cr<=1;endelsebeginout<=0;cr<=0;end

endelsebeginout<=out;cr<=0;

endend

endendmodule分频器分频器是本系统最重要的功能部件之一,由它产生闸门电平和控制器、计数器的控制脉

冲。

它有四个输入:

标准时钟脉冲输入CLK1024、溢出处理触发TRIGGER、复位触发RESET和档位状态STAT[1..0]。

三个输出:

计数闸门电平FGATE、控制器工作脉冲FTRIGGER、

计数器控制器清零脉冲FCLR。

其组成图见附图2右上部分。

分频器采用计数分频的办法,即使用一内部寄存器,在时钟脉冲上升沿加一计数,当计到一

定值时就改变FGATE的状态,从而达到分频的目的。

由于输入标准时钟脉冲为1024Hz,要

得到0.1s的FGATE计数值相当小,约为20,误差很大,故在实际设计中把第四档闸门电平时间调整为0.1s,这样第三、四档公用一个闸门电平,同时在计数和锁存时要做相应的移位,因为测量第四档频率时有4位有效数字。

要得到10s、1s、0.1s三个FGATE,分别要计数到

10240、1024和103。

从组成图中也可以看出分频器由这三种计数器并联组成,通过3个4选1选择器(一个74LS153和一个4_1MUX),由STAT[1..0]选择使用的FGATE、FCLR和

FTRIGGER。

输出FGATE送计数器EN作为计数器使能闸门电平。

FTRIGGER送控制器TRIGGER

作为控制器工作脉冲。

FCLR送计数器CLRN作为每次计数开始前的清零信号,送控制器

CLR作为控制器内部触发信号。

这三个信号的时序图如下:

CLK1024

FGATE

FTRIGGER

FCLR

1JWUWWWUWWWWW由图可以看

[出FGATE

口□n।~由高变低,

F=i即计数结束

FTRIGGER信号才产生,这时控制器开始工作,判断计数是否有效,然后发出一系列指令直到FCLR信号到来,计数器清零,准备进入下一次计数。

采用这样的像CPU时钟一样的信号的原因,一方面,处理计数数据只用了很短的时间,两次测量之间时间很短,加快了频

率计的响应速度;另一方面,解决了异步时序逻辑的竞争,使系统工作在异步时序状态下,既保持了很高的响应速度,又有很高的稳定性。

为了解决在第一档向第二档转换时等待时间

过长的问题,分频器由TRIGGER端口接收一个计数器的溢出脉冲,当计数器溢出时,在脉冲上升沿将内部计数器置为FGATE结束高电平的最后一个计数器值。

这样,由于控制器此时溢出已被置位,马上就能进入一次换档处理,保证了换档的快速。

另外,RESET信号上

升沿到来时,计数器被置为零,这样就可以马上重新开始计数,实现了复位的效果。

分频器

单元FREQCER_10240的源程序如下(其他两个单元仅计数值不相同,其他均一样,故不列

在此,见附录):

modulefreqcer_10240(clk,trigger,reset,out_gate,out_clr,out_trigger);

inputclk,trigger,reset;

outputout_gate,out_clr,out_trigger;

regout_gate,out_clr,out_trigger;

reg[13:

0]counter;

always@(posedgeclkorposedgetriggerorposedgereset)begin

〃计数器溢出,准备进入换档状态

if(trigger)begin

counter<=10239;

end

〃复位

elseif(reset)begin

〃清零,准备开始计数

counter<=10239;

out_trigger<=0;

out_clr<=0;

out_gate<=0;

end

〃非对称式分频

elseif(counter<=10239)begin

out_trigger<=0;

out_gate<=1;

out_clr<=0;

counter<=counter+1;end

〃连续输出3个TRIGGER和一个CLR

elseif((counter>=10240)&&(counter<=10247))begin

if((counter==10241)||(counter==10243)||(counter==10245))

out_trigger<=1;

elseif(counter==10247)

out_clr<=1;elsebegin

out_clr<=0;

out_trigger<=0;end

out_gate<=0;

counter<=counter+1;end

elseif(counter==10248)begincounter<=0;

out_gate<=0;

out_trigger<=0;

out_clr<=0;end

endendmodule

锁存器

锁存器有八个输入:

时钟脉冲CLK,置位端SET,复位端RESET,4个4bit十进制BCD输入IN1[3..0]〜IN4[3..0],档位状态STAT[1..0]。

五个输出:

5个5bit十进制BCD输出。

组成图见附图2左上部分。

由一桥接器BRIDGE和4个LATCH_4_16、1个LATCH_4_1锁存器组成。

桥接器BRIDGE主要是为了数据对齐。

因为3、4两档使用同一个分频器,故测量第四

档时有4位有效数字,通过桥接器转换后就能保证数据有效数字最高位与锁存器第五位对齐。

其具体结构见附图2下半部分。

输入输出对应表如下:

表格2

桥接器功能表

STAT=0,1,2

STAT=3

OUT5

=IN3

=IN4

OUT4

=IN2

=IN3

OUT3

=IN1

=IN2

OUT2

0

=IN1

锁存器单元LATCH_4_1和LATCH_4_16均为

4bit锁存器,其唯一不同在于置位时,LATCH_4_16

锁存器内容置为F,另一个置1。

下面将LATCH_4_16的功能表(见左)和源程序列出,同样将另一锁存器源程序收于附录。

modulelatch_4_16(clk,set,reset,in,out);

inputclk,set,reset;

input[3:

0]in;

output[3:

0]out;

reg[3:

0]out;

always@(posedgeclkorposedgesetorposedgereset)beginif(set)

out<=4'b1111;

elseif(reset)

out<=0;else

out<=in;

end

endmodule

控制器

控制器CONTROLER是整个系统最复杂也是最关键的部件,附图1左上部分是控制器组成。

它由一个控制器核心模块CONTROL_CORE和寄存器OFREGISTER组成。

OFREGISTER由CLK端接受计数器溢出脉冲在其上升沿置1,当控制器核心开始换档工作时,通过CLR清除OFREGISTER。

其功能表见右。

CONTROL_CORE模块是控制器的核心,有六个输入端口:

时序脉冲CLK、清零脉冲CLR、复位脉冲RESET、溢出检测输入OF、计数器输出第3、4位IN3[3..0]和IN4[3..0]。

输出端口四个:

锁存器工作脉冲LATCH_CLK、OFREGISTER清零脉

冲CLROF、锁存器状态LATCH_STAT[1..0]和当前档位状态STAT[1..0]。

另外还有寄存器

Ti时刻第工作脉冲到来时,首先检测是不是复位周期,是则跳过,不作

任何动作。

不是,则检测OF端口是否为1,为1则有溢出,要进行换档,flag标志置1,并发出OFREGISTER清零信号CLROF,没有溢出,则检测计数器最高两位,两位均为0,则说明档位不够,要调低木^位,flag标志置2,如果不均为0,则该计数值有效,flag置为0;

当丁2脉冲到来时,检测是否是复位周期,是则跳过,不是则继续。

如果flag=1,有溢出,

向上换档,如果当前档位为3,则保持,并且将锁存器置位(显示1FFFF),否则向上调一挡;如果flag=2,档位不够,当当前档位为。

时,保持,否则向下调一挡。

flag=0,计数有效,

发出锁存器时钟脉冲LATCH_CLK,将当前计数值打入锁存器。

当T3脉冲到来时,清除中

间状态寄存器。

当T4脉冲到来时,在其下降沿将stat_reg的内容打入STAT,在下一次高电

平到来之前实现档位转换。

具体源程序如下:

modulecontrol_core(clk,clr,reset,of,IN3,IN4,counter_clrn,latch_clk,clrof,latch_stat,stat);

inputclk,reset,of,clr;

input[3:

0]IN3,IN4;

outputcounter_clrn,latch_clk,clrof;

regcounter_clrn,latch_clk,clrof,reset_reg;

output[1:

0]latch_stat,stat;

reg[1:

0]latch_stat,stat,flag,count,stat_reg;

always@(posedgeclkorposedgeresetorposedgeclr)

begin

if(reset)begin//复位脉冲

latch_stat<=1;

stat_reg<=0;

counter_clrn<=1;

count<=0;

flag<=0;

clrof<=1;

reset_reg<=1;

end

elseif(clr)begin//清零彳言号T4

flag<=0;

count<=0;

end

elseif(count==0)begin//T1脉冲

count<=count+1;

if(reset_reg==0)begin//非复位周期

counter_clrn<=0;

latch_clk<=0;

latch_stat<=0;

stat_reg<=stat;

if(of==1)begin//有溢出

clrof<=1;

flag<=1;

end

elseif(of==0)begin//没有溢出

if((IN3==0)&&(IN4==0))begin//档位不够

flag<=2;

end

elseif((IN3)||(IN4))begin//计数有效

flag<=0;

end

end

end

end

elseif(count==1)begin//T2脉冲

count<=count+1;

if(reset_reg==0)begin//非复位周期

clrof<=0;

if(flag==1)begin//溢出

if(stat_reg==3)begin//已经在最高档

latch_stat<=2;//锁存器置位

end

elsebegin〃向上调档

stat_reg<=stat_reg+1;

latch_stat<=latch_stat;

end

end

elseif(flag==2)begin//档位不够

latch_stat<=latch_stat;

if(stat_reg==0)begin//当前在最低档

stat_reg<=0;//档位保持

end

elsebegin

stat_reg<=stat_reg-1;//向下调档

end

end

elsebegin

latch_clk<=1;//计数有效,锁存

end

end

end

elseif(count==2)begin//T3脉冲

flag<=0;

latch_clk<=0;

count<=0;

reset_reg<=0;

endend

always@(negedgeclr)begin

stat<=stat_reg;//T4下降沿打入STATend

endmodule

另外,由STAT决定小数点位置的电路POINT也应该在控制器中,系统图上将其单独

画了出来,具体实现见附图1右下角。

五、误差分析及改进

经过下载测试,实际的测量误差在1〜2档时,误差在1X10工〜4X10」数量级,在3〜

4档时,误差相对大一些,一般〉4X10^3,这是由于计数分频时计数值为近似值造成的系统误差。

另外,在高档位向低档位转换时,会产生第一次测量不准的现象,尤其是在第一档上特

别明显。

经过分析,我发现这是我的这种分频器结构所特有的。

因为三个分频器是并行独立

计数分频,因此无法保证换档时各个分频器状态同步,解决方案是改进分频器,采用统一结

构。

具体程序见附录。

实验中采用的CPU式的指令周期结构是不错的,保证了系统的稳定性和快速响应,但是由于刚刚接触,设计的时候逻辑、时序设计不够简洁,很多地方还有待改进。

六、实验总结

这次实验是相当成功的一次实验,我不仅在实验中学会了Verilog这种硬件描述语言以

及基本的FPGA设计思想和方法。

更重要的是在通过设计实现自己的想法的过程中,通过和老师、同学的有效交流,不断的分析各种情况,解决遇到的实际问题,大大特提高了自己

分析问题和解决问题的能力,收获非常的大。

七、附录

分频器1s

modulefreqcer_1024(clk,trigger,reset,out_gate,out_clr,out_trigger);

inputclk,trigger,reset;

outputout_gate,out_clr,out_trigger;

regout_gate,out_clr,out_trigger;

reg[10:

0]counter;

always@(posedgeclkorposedgetrigger)begin

if(trigger)begin

counter<=1023;

end

elseif(reset)begin

counter<=1032;

out_trigger<=0;

out_clr<=0;

out_gate<=0;

end

elseif(counter<=1023)begin

out_trigger<=0;

out_gate<=1;

out_clr<=0;

counter<=counter+11'b00000000001;

end

elseif((counter>=1024)&&(counter<=1031))begin

if((counter==1025)||(counter==1027)||(counter==1029))out_trigger<=1;

elseif(counter==1031)

out_clr<=1;

elsebegin

out_clr<=0;

out_trigger<=0;

end

out_gate<=0;

counter<=counter+1;

end

elseif(counter<=1032)begin

counter<=0;

out_gate<=0;

out_trigger<=0;

out_clr<=0;

end

end

endmodule

分频器0.1s

modulefreqcer_103(clk,trigger,reset,out_gate,out_clr,out_trigger);

inputclk,trigger,reset;

outputout_gate,out_clr,out_trigger;

regout_gate,out_clr,out_trigger;

reg[6:

0]counter;

always@(posedgeclkorposedgetrigger)

begin

if(trigger)begin

counter<=100;

elseif(reset)begin

counter<=100;

out_trigger<=0;

out_clr<=0;

out_gate<=0;

end

elseif(counter<=101)begin

out_gate<=1;

out_trigger<=0;

out_clr<=0;

counter<=counter+1;

end

elseif((counter>=102)&&(counter<=109))begin

if((counter==103)||(counter==105)||(counter==107))beginout_trigger<=1;

end

elseif(counter==109)begin

out_clr<=1;

end

elsebegin

out_clr<=0;

out_trigger<=0;

end

out_gate<=0;

counter<=counter+1;

end

elseif(counter==110)begin

counter<=0;

out_gate<=0;

out_clr<=0;

end

end

endmodule

锁存器LATCH_4_1

modulelatch_4_1(clk,set,reset,in,out);

inputclk,set,reset;

input[3:

0]in;

output[3:

0]out;

reg[3:

0]out;

always@(posedgeclkorposedgesetorposedgereset)

begin

if(set)begin

out<=1;

end

elseif(reset)beg

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

当前位置:首页 > 高等教育 > 医学

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

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