实验五 基于HDL 表述的频率计Word文件下载.docx
《实验五 基于HDL 表述的频率计Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验五 基于HDL 表述的频率计Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
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等,我理解了很多像这样经常搞混的概念,期待下一次的实验。