实验五 基于HDL 表述的频率计Word文件下载.docx

上传人:b****6 文档编号:18046700 上传时间:2022-12-13 格式:DOCX 页数:16 大小:565.08KB
下载 相关 举报
实验五 基于HDL 表述的频率计Word文件下载.docx_第1页
第1页 / 共16页
实验五 基于HDL 表述的频率计Word文件下载.docx_第2页
第2页 / 共16页
实验五 基于HDL 表述的频率计Word文件下载.docx_第3页
第3页 / 共16页
实验五 基于HDL 表述的频率计Word文件下载.docx_第4页
第4页 / 共16页
实验五 基于HDL 表述的频率计Word文件下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

实验五 基于HDL 表述的频率计Word文件下载.docx

《实验五 基于HDL 表述的频率计Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验五 基于HDL 表述的频率计Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。

实验五 基于HDL 表述的频率计Word文件下载.docx

cnt=0;

f1=0;

f2=0;

f3=0;

f4=0;

end

always@(posedgeCLK20M)//下降沿触发

begin//用begin语句确定一个顺序块,相当于括号

if(cnt==9999999)//产生一个1hz的频率

beginCLK1HZ<

=~CLK1HZ;

cnt<

=0;

elsecnt<

=cnt+1;

if(f1==9999)//产生1KHZ的频率

beginFF1<

=~FF1;

f1<

elsef1<

=f1+1;

if(f2==4999)//产生2KHZ的频率

beginFF2<

=~FF2;

f2<

elsef2<

=f2+1;

if(f3==2499)//产生4KHZ的频率

beginFF3<

=~FF3;

f3<

elsef3<

=f3+1;

if(f4==1249)//产生8KHZ的频率

beginFF4<

=~FF4;

f4<

elsef4<

=f4+1;

endmodule

效果图:

2.2分频控制模块

本模块是对之后的计数器模块和锁存器模块服务的,通过分频产生几个控制信号来控制计数器的计数和数据的装载。

modulefre_ctrl(CLK,EN,CLR_CNT,LOAD);

//定义输入输出端口

inputCLK;

//输入1hz基准时钟频率

outputEN,CLR_CNT,LOAD;

//定义三个输出端口

regdiv2;

initialdiv2=0;

//变量初始化

always@(posedgeCLK)//下降沿触发

div2<

=~div2;

//对clk进行二分频

assignCLR_CNT=(~CLK)&

&

LOAD;

//计数器清零信号

assignLOAD=~div2;

//装载信号,与使能信号相反

assignEN=div2;

//使能信号

2.3计数器模块

本模块是当使能信号为高电平时对用户输入的信号进行计数,并输出计数结果。

modulecnt10bcd4b(uclk,ENA,CLR,D);

inputuclk,CLR,ENA;

//输入端口

outputD;

//输出端口

reg[15:

0]D;

initialD=0;

always@(posedgeuclk)//用户输入频率,下降沿触发

begin//模块开始

if(CLR)

D<

elseif(ENA)//判断使能信号,高电平计数

begin

if(D==16'

h9999)

D<

else

begin

if(D[11:

0]==12'

h999)

beginD[15:

12]<

=D[15:

12]+1;

D[11:

0]<

end

elseif(D[7:

0]==8'

h99)

beginD[11:

8]<

=D[11:

8]+1;

D[7:

elseif(D[3:

0]==4'

h9)

beginD[7:

4]<

=D[7:

4]+1;

D[3:

elseD<

=D+1;

endmodule//模块结束

效果图:

2.4锁存器模块

本模块是对计数器的计算结果进行输出,当计数周期到了以后,将结果通过数码管显示出来。

moduleletch(DIN,LOAD,DOUT);

inputLOAD;

//输入装载信号

input[15:

0]DIN;

//输入计数器的结果

output[15:

0]DOUT;

//输出频率计数结果

reg[15:

always@(posedgeLOAD)//装载信号下降沿有效,进行向数码管输出数据

DOUT<

=DIN;

 

2.5七段数码管模块

显示计数结果,一共四个数码管,共用一个代码。

modulesegled(out1,a);

//定义模块名和输入输出端口

input[3:

0]a;

//输入一个3位矢量

output[6:

0]out1;

//输出一个6位矢量

reg[6:

//reg型变量用于always语句

always@(a)//敏感信号a

case(a)//case语句用于选择输出

4'

b0000:

out1<

=7'

b0111111;

b0001:

b0000110;

b0010:

b1011011;

b0011:

b1001111;

b0100:

b1100110;

b0101:

b1101101;

b0110:

b1111101;

b0111:

b0000111;

b1000:

b1111111;

b1001:

b1101111;

b1010:

b1110111;

b1011:

b1111100;

b1100:

b0111001;

b1101:

b1011110;

b1110:

b1111001;

b1111:

b1110001;

endcase

2.6综合模块代码

//Copyright(C)1991-2013AlteraCorporation

//YouruseofAlteraCorporation'

sdesigntools,logicfunctions

//andothersoftwareandtools,anditsAMPPpartnerlogic

//functions,andanyoutputfilesfromanyoftheforegoing

//(includingdeviceprogrammingorsimulationfiles),andany

//associateddocumentationorinformationareexpresslysubject

//tothetermsandconditionsoftheAlteraProgramLicense

//SubscriptionAgreement,AlteraMegaCoreFunctionLicense

//Agreement,orotherapplicablelicenseagreement,including,

//withoutlimitation,thatyouruseisforthesolepurposeof

//programminglogicdevicesmanufacturedbyAlteraandsoldby

//Alteraoritsauthorizeddistributors.Pleaserefertothe

//applicableagreementforfurtherdetails.

//PROGRAM"

QuartusII64-Bit"

//VERSION"

Version13.1.0Build16210/23/2013SJWebEdition"

//CREATED"

WedApr2614:

37:

162017"

modulebloc(

CLK20M,

SG_IN,

FF1,

FF2,

FF3,

FF4,

A,

B,

C,

D

);

inputwireCLK20M;

inputwireSG_IN;

outputwireFF1;

outputwireFF2;

outputwireFF3;

outputwireFF4;

outputwire[6:

0]A;

0]B;

0]C;

0]D;

wire[15:

0]DOUT;

wireSYNTHESIZED_WIRE_0;

wireSYNTHESIZED_WIRE_1;

wireSYNTHESIZED_WIRE_2;

wireSYNTHESIZED_WIRE_3;

0]SYNTHESIZED_WIRE_4;

divfb2v_inst(

.CLK20M(CLK20M),

.CLK1HZ(SYNTHESIZED_WIRE_0),

.FF1(FF1),

.FF2(FF2),

.FF3(FF3),

.FF4(FF4));

fre_ctrlb2v_inst1(

.CLK(SYNTHESIZED_WIRE_0),

.EN(SYNTHESIZED_WIRE_1),

.CLR_CNT(SYNTHESIZED_WIRE_2),

.LOAD(SYNTHESIZED_WIRE_3));

segledb2v_inst10(

.a(DOUT[7:

4]),

.out1(B));

segledb2v_inst11(

.a(DOUT[3:

0]),

.out1(A));

cnt10bcd4bb2v_inst3(

.uclk(SG_IN),

.ENA(SYNTHESIZED_WIRE_1),

.CLR(SYNTHESIZED_WIRE_2),

.D(SYNTHESIZED_WIRE_4));

segledb2v_inst4(

.a(DOUT[15:

12]),

.out1(D));

letchb2v_inst8(

.LOAD(SYNTHESIZED_WIRE_3),

.DIN(SYNTHESIZED_WIRE_4),

.DOUT(DOUT));

segledb2v_inst9(

.a(DOUT[11:

8]),

.out1(C));

3.实验设备

kx3c10F+开发板,电脑。

4.实验步骤

4.1编译

4.1.1编译结果如下图所示:

编译解释:

在这个报告中,我们可以看到如下信息:

Total 

logic 

elements 

226/5136(4%):

该芯片中共有5136个LE资源,其中的226个在这个工程的这次编译中得到了使用。

combinational 

functions 

222/5136(4%):

该芯片的5136个LE资源中,其中222个用于实现组合逻辑。

Dedicated 

registers 

102/5136(2%):

该芯片的5136个LE资源中,其中102个用于实现寄存器,即时序逻辑。

从上述信息中,可以得到组合逻辑与时序逻辑的使用比例——222/102= 

2.18:

1。

4.1.2综合出来的电路图

电路图解释:

从以上电路图可以看出本电路主要由分频模块(div)、分频控制模块(fre_ctrl)、计数器模块(cnt10bcd4b)、锁存器模块(letch)和数码管显示模块(segled)5个模块组成。

用于对输入频率的计数,用户频率从SGIN输入,本实验从分频模块产生4个频率以供使用(FF1、FF2、FF3、FF4)。

通过七段数码管将计数器的结果显示出来。

分频控制模块用于对计数器的控制,锁存器模块用于对数据的装载。

4.2管脚分配

管脚连接:

通过双击Location选择与芯片上相应的引脚进行连接。

其中,CLK20M连接cycloneIII3C5E144芯片外部晶振20MHZ时钟输入;

SG_IN连接cycloneIII3C5E144芯片外部待测频率信号输入;

FF1、FF2、FF3、FF4依次连接cycloneIII3C5E144芯片外部测试用频率1KHZ、2KHZ、4KHZ、8KZ的输出;

D[6:

0]、C[6:

0]、B[6:

0]、A[6:

0]依次连接cycloneIII3C5E144芯片外部数码管千位、百位、十位、个位的7个数码段的阳极。

4.3仿真

1.测试模块代码:

`timescale1ns/1ns//定义时间单位

moduletest;

regCLK20M,SG_IN;

//输入频率

wireFF1,FF2,FF3,FF4;

//输出结果定义为wire

wire[6:

0]A,B,C,D;

initialbegin//变量初始化

CLK20M=0;

SG_IN=0;

always#25CLK20M=~CLK20M;

//25ns反转一次,即产生一个20mhz的频率

always#500000SG_IN=~SG_IN;

//500000ns反转一次,即产生一个1Khz的频率

blocu1(.CLK20M(CLK20M),//元件例化

.SG_IN(SG_IN),

.FF1(FF1),.FF2(FF2),.FF3(FF3),.FF4(FF4),

.A(A),.B(B),.C(C),.D(D));

endmodule

2.modesim仿真图:

仿真图解释:

本实验仿真一共两个输入,即20mhz和用户频率输入,对于输出可以不用考虑,只需元件例化时对应相接就行。

而对于产生20mhz和1khz的输入频率比较简单。

通过仿真我们可以看出输入的用户频率和分频产生的FF1是相同的,所以用户输入频率正确;

另外通过观察数码管的值也可以发现显示数值为1000,与理论值相同。

所以可以得出实验电路连接无误,可以进行硬件验证了。

注:

本仿真只对1khz的频率进行了验证,另外的2khz,4khz,8khz经验证也是无误的,原理与1khz相同。

4.4下载验证

5.实验体会

通过本次实验我学到很多,因本次实验相对来说复杂些所以,所以对程序的编写也困难些。

不过同时也学到了很多,感觉每次实验自己都提升好多,例如initial块只无条件执行一次 

,always块在满足条件时不断执行,initial常用来写测试文件,always块常用来写电路描述 

,测试文件中一般都是现initial后always等,我理解了很多像这样经常搞混的概念,期待下一次的实验。

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

当前位置:首页 > 工程科技 > 交通运输

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

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