第一篇:verilog简易数字频率计报告
一、实验原理
根据原理图,将计数器模块、显示模块、扫描模块、译码器模块等分别做出。其原理是在1S内用待测信号给计数器计数,并在一秒结束时给计数器清零,计出来用缓存器缓存,在数码管中显示出来。
二、方案论证
一、通过50M的时钟进行计数获得精密的1HZ——计数器用Verilog HDL语言实现在1HZ为底电平时计数——门控电路用或门开启——1HZ为高电平时进行数据锁存与显示——利用Verilog HDL语言使前面的0不显示。
计数器用Verilog HDL语言在写代码时可以用复制粘贴的方法可以简便的实现。通过50M的时钟进行计数获得精密的1HZ后只是经过很短的时间内进行计数器的清零及数据的琐存,并且得到的是1HZ的精密时钟。把锁存的数据进行清0的转换后利用分时扫描,后通过数码管译码显示。
说明:
Cnt9999:0000~9999计数器; Buffer:锁存器; Scan:扫描显示 共8个模块
三、实验步骤
一、计数器模块 计数器模块的仿真波形
二、锁存模块
利用32位的D触发器进行储存计数器送给它的数据。在时钟为上升沿的时候触发保存数据。锁存模块的源代码:
module buffer_32(clr,clear,in,out);input
clear,clr;input[31:0] in;output[31:0] out;reg[31:0]
out;always@(posedge clear or negedge clr)
if(!clr)out<=0;
//else if(clear)out=in;
else out<=in;
endmodule
三、转化清零模块 波形仿真波形
module cnt9999(clr,clk,q,c);
input clr,clk;output c;output [15:0]q;reg c;reg [15:0]q;
always @(posedge clk or negedge clr)begin
if(!clr)begin q[15:0]<=0;c<=1'b0;end
else if(q[15:0]==16'H9999)begin q[15:0]<=0;c<=1'b1;end
else if(q[11:0]==12'H999)begin q[15:0]<=q[15:0]+12'H667;c<=1'b0;end
else if(q[7:0]== 8'H99)begin q[15:0]<=q[15:0]+8'H67;c<=1'b0;end
else if(q[3:0]== 4'H9)begin q[15:0]<=q[15:0]+4'H7;c<=1'b0;end
else begin q[15:0]<=q[15:0]+1'b1;c<=1'b0;end end endmodule
四、扫描显示模块
把存储的数据分别分给8个数码管,利用循环扫描即可显示出所要显示的数据。
扫描显示模块的仿真波形
module scan(clk,q);input clk;output [2:0]q;reg
[2:0]q;
always @(posedge clk)
begin
q=q+1;
end
endmodule
四、引脚分配
五、实验总结
频率就是信号在1s内发生相同变化的次数,简易频率计就是基于这个原理设计的。我们先产生一个低电平为1s,高电平为1/50M秒的周期信号clk,用该信号与待测信号相与作为计数器的输入时钟,并把clk的上升沿作为缓存器的开关,把clk的高电平作为计数器的清零信号,这样就能保证缓冲器中存放的始终是待测信号在一秒内的跳变次数,也即待测信号的频率。
实验的原理尽管很清楚,但真正看到实验现象还是经历了一番波折,在写8选1数据选择器的时候,定义模块端口时,由于疏忽,把四位位宽漏写成了1位,结果在数码管上显示的始终只有0和1两种数字。为了改正这个错误,我把程序的主要模块都检查了一遍,结果不管怎么改实验现象都没有出来,这让我郁闷了很长一段时间,原理明明是对的,为什么就没有效果呢?最后我把整个程序都打印出来,一行一行地检查,最后终于找到了症结所在,就是8选1数据选择器的位宽弄错了!经历了这次错误,让我明白了写程序还是不能大意,8选1数据选择器虽然简单,却因为位宽这个小小的错误让我浪费了很长的时间,检查错误时也因为其简单而没有认真对待。
第二篇:简易数字频率计设计报告
EDA技术基础 简易数字频率计 必做实验
电子信息科学与技术
物电学院
2011-06-24 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
简易数字频率计
一.实验要求
用Verilog硬件描述语言设计一个时序逻辑电路,能够对输入的TTL信号进行1s时长计数,将计数结果在数码管上显示,让该电路循环运行,则数码管显示的就是输入信号的频率。
用标准DDS信号发生器输入TTL信号,测试信号的频率与DDS输出设定的频率比较,分析误差以及误差产生的原因。
显示效果好,无闪烁,高位零不显示。
二.方案原理图
总体框图:
三、主要部分原理说明及实验步骤
根据原理图,先把计数器模块、显示模块、扫描模块分别做出。对于计数器模块因为要实现00000000~99999999的计数器,所以要用32bit,即要用
32第2页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
个D触发器。从而要用8个数码管进行循环扫描显示。对于1HZ的精密脉冲在低电平时,一方面和被测脉冲通过或门,当被测脉冲为高电平时门电路开启,另一方面通过一个非门把计数器的清零端置1,计数器正常工作开始计数。高电平时对计数器清零的同时,把测得的数据送入BUFFER中进行显示锁存。数码管的扫描时钟由外部提供。在此基础上把前面的0清除。
1、我在该设计中使用了一个或门作为门控电路,当输入时钟clka为低电平时,被测信号clk通过,当输入时钟clka为高电平时,被测信号被阻止。从clka端输入的是一个24M的脉冲,经过1HZ模块处理后生成一秒赫兹信号(如下图)
由这个信号来控制99999999计数器的清零和buffer中数据的更新以及被测信号的通过与阻止
其verilog语言代码如下 module clk_1hz(clk,clked);input clk;output clked;reg clked;reg[31:0]jishu;always @(posedge clk)begin if(jishu==24000000)begin jishu=0;clked=1;end else begin jishu=jishu+1;clked=0;end end endmodule
2、门控电路部分
其verilog语言代码如下
第3页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
module mynot(clk_1hz,nclk_1hz);input clk_1hz;output nclk_1hz;assign nclk_1hz=!clk_1hz;endmodule
99999999计数器计数在到达1S的瞬间,1HZ时钟出现上升沿,控制缓存器将此时的计数值锁存起来,然后送出显示。很短一段时间后,1HZ时钟恢复低电平,在这很短的时间内1HZ时钟经非门也完成了计数器的清零,之后计数器又恢复计数状态,进入下一秒的计数。
其verilog语言代码如下 module mynot(clk_1hz,nclk_1hz);input clk_1hz;output nclk_1hz;assign nclk_1hz=!clk_1hz;endmodule
3、计数模块
第4页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
99999999计数器是本次实验的关键所在,它的主要功能是:在1hz精密时钟和门控电路的控制下,在1s的时间内,对输入信号进行计数,1s后,由于门控电路的存在,计数器停止计数 其verilog语言代码如下 module cnt99999999(clr,clk,q);input clr,clk;output [31:0]q;reg [31:0]q;always @(posedge clk or negedge clr)begin if(!clr)q[31:0]=0;else if(q[31:0]==31'H99999999)q[31:0]=q[31:0]+32'H66666667;else if(q[27:0]==27'H9999999)q[31:0]=q[31:0]+28'H6666667;else if(q[23:0]==24'H999999)
q[31:0]=q[31:0]+24'H666667;else if(q[19:0]==20'H99999)
q[31:0]=q[31:0]+20'H66667;else if(q[15:0]==16'H9999)
q[31:0]=q[31:0]+16'H6667;else if(q[11:0]==12'H999)
q[31:0]=q[31:0]+12'H667;else if(q[ 7:0]== 8'H99)
q[31:0]=q[31:0]+8'H67;else if(q[ 3:0]== 4'H9)
q[31:0]=q[31:0]+4'H7;else q[31:0]=q[31:0]+1;end endmodule
4、显示数据缓冲buffer的设计
数据缓冲buffer的功能是当用计数器对输入信号计数,这些数据都暂时存在这个里面,每当时钟的上升沿到来的时候,它就向后面的模块输送数据,这样就可以得到相对稳定的显示。
第5页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
其verilog语言代码如下
module buff(in,clk,n1,n2,n3,n4,n5,n6,n7,n8);input clk;input [31:0]in;output [3:0]n1,n2,n3,n4,n5,n6,n7,n8;reg [3:0]n1,n2,n3,n4,n5,n6,n7,n8;
always @(posedge clk)begin begin n1=in[3:0];n2=in[7:4];n3=in[11:8];n4=in[15:12];n5=in[19:16];n6=in[23:20];n7=in[27:24];n8=in[31:28];end end endmodule
5、显示部分
由于要用到8个数码管对实验结果进行显示,我们可以设计一个译码模块:
其verilog语言代码如下 module yima(in,a,b,c,d,e,f,g,dp);input
[3:0]in;output a,b,c,d,e,f,g,dp;reg
a,b,c,d,e,f,g,dp;always @(in)begin case(in)
第6页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
4'b0000:{dp,g,f,e,d,c,b,a}=8'b00111111;4'b0001:{dp,g,f,e,d,c,b,a}=8'b00000110;4'b0010:{dp,g,f,e,d,c,b,a}=8'b01011011;4'b0011:{dp,g,f,e,d,c,b,a}=8'b01001111;4'b0100:{dp,g,f,e,d,c,b,a}=8'b01100110;4'b0101:{dp,g,f,e,d,c,b,a}=8'b01101101;4'b0110:{dp,g,f,e,d,c,b,a}=8'b01111101;4'b0111:{dp,g,f,e,d,c,b,a}=8'b00000111;4'b1000:{dp,g,f,e,d,c,b,a}=8'b01111111;4'b1001:{dp,g,f,e,d,c,b,a}=8'b01101111;default:{dp,g,f,e,d,c,b,a}=8'b01000000;endcase end endmodule 部分引脚功能的排列如下图所示
数码管的引脚排列 以上5部分就是顶层原理图的主要部分
四、实验总结
1、要用1HZ的精确时钟不能直接接一个外接的信号源,这样的误差太大,只能将一个标准的24M的时钟进行24分频,才能的到相对稳定的时钟信号。
2、数据缓冲部分不能少,如果没有这部分,将得不到想要的结果,数码管上会出现一排乱跳的数字。
3、在整个实验设计过程中,我发现只要弄清楚所需要的几个模块,然后将模块分开来进行生成,设计也并不是想象中的那么难。
第7页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
4、在此程序设计中,对各个模块的功能有针对性的设计思路有了一定的提高,对于一个程序的需要哪些功能模块,需要什么样的输入输出,都比以前有了一定的提高。
5、学EDA已经有一学期了,现在对那些原理框图并不陌生了,现在也可以写一些简单的代码。我发现只要我们认真的去学习,虚心的的去请教他人,我们谁都可以把这门课学好。虽然在学习这门课以及做实验的过程中,我们往往会遇到种种困难,但是当实验结果与现象出来的那一刹那,我们就会感受那成功的快乐。
第8页,共8页
第三篇:基于FPGA的简易数字频率计
EDA 简易数字频计 设计性实验 2008112020327 ** 电子信息科学与技术
物电
电工电子中心2009年5月绘制
2008.6.10 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
简易数字频率计设计
一.任务解析
通过对选择题的分析,认为该简易数字频率计应该能达到以下要求: 1. 准确测出所给的方波信号的频率(1HZ以上的信号)。2. 在显示环节上,应能实现高位清零功能。3. 另外还有一个总的清零按键。
二.方案论证
本实验中所做的频率计的原理图如上图所示。即在一个1HZ时钟信号的控制下,在每个时钟的上升沿将计数器的数据送到缓冲器中保存起来,再送数码管中显示出来。
第2页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
在本实验中,用到过几中不同的方案,主要是在1HZ时钟信号的选择和计数器清零环节上:
1. 在实验设计过程中,考滤到两种1HZ时钟信号其波形如下图所
对于上术的两种波形,可以调整各项参数来产生两种1HZ时钟信号。最后通过实验的验证发现第二种波形对于控制缓冲器获得数据和控制计数器清零更易实现。并且,用第二种波形做为时钟信号,可以在很短的高电平时间内对计数器清零,在低电平时间内让计数器计数,从面提高测量的精度。而用第一种波形则不易实现这个过程。
2.在计数器的清零过程中,也有两个方案,分别是能通过缓冲器反回一个清零信号,另一个是在时钟的控制下进行清零。最终通过实验发现,用时钟进行清零更易实现。因为如果用缓冲器反回一个清零信号,有一个清零信号归位问题,即当缓冲器反回一个低电平清零信号时,计数器实现清零,但不好控制让缓器冲的清零信号又回到高电平,否则计数器就一直处于清零状态面不能正常计数了。
三.实验步骤
通过上分析后,实验分为以下几步:
1.1HZ时钟信号的产生(产生该信号的模块如下):
module ones(clk,clkout);input clk;output clkout;parameter parameter N=24000000;n=24;
第3页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
reg [n:0]cnt;reg clkout;
always @(posedge clk)begin if(cnt==N)else end endmodule begin cnt=0;
clkout=1;clkout=0;end
end begin cnt=cnt+1;最终产生的信号的波形:
2. 计数模块。其主要公能是在每个被测信号的上升沿自动加一,并且有一个清零信号的输入端,在1HZ时钟信号的高电平时间里进行清零。模块如下:
module count_99999999(sign,clr,b0,b1,b2,b3,b4,b5,b6,b7);input sign,clr;output [3:0]b0,b1,b2,b3,b4,b5,b6,b7;reg [3:0]b0,b1,b2,b3,b4,b5,b6,b7;always @(posedge sign or posedge clr)
if(clr)begin b0=0;b1=0;b2=0;b3=0;b4=0;b5=0;b6=0;b7=0;end else begin if(b0<9)b0=b0+1;else begin b0=0;if(b1<9)
第4页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
b1=b1+1;else begin b1=0;if(b2<9)b2=b2+1;else begin
b2=0;
if(b3<9)
b3=b3+1;
else begin
b3=0;
if(b4<9)
b4=b4+1;
else begin
b4=0;
if(b5<9)
b5=b5+1;
else begin
b5=0;
if(b6<9)
b6=b6+1;
else begin
b6=0;
if(b7<9)
b7=b7+1;
else b7=0;
第5页,共11页
湖北师范学院电工电子实验教学省级示范中心电子版实验报告
end
end
end
end
end
end end
end endmodule 如果要访真该模块,要设定较长的访真时间,故在此不进行软件访真,只在实验箱上进行实验。
3. 数据缓冲模块。在每个秒级门控信号的上升沿接收计数器的数据,并送到驱动八个数码管的显示模块里。
module fre_count(clk,clr,b0,b1,b2,b3,b4,b5,b6,b7,a0,a1,a2,a3,a4,a5,a6,a7);input clk,clr;input [3:0]b0,b1,b2,b3,b4,b5,b6,b7;output [3:0]a0,a1,a2,a3,a4,a5,a6,a7;reg clro;reg [3:0]a0,a1,a2,a3,a4,a5,a6,a7;always @(posedge clk or negedge clr)//clk应该为1HZ的信号// begin if(!clr)
begin
a0<=0;a1<=0;a2<=0;a3<=0;a4<=0;a5<=0;a6<=0;a7<=0;end else
第6页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
end begin a0<=b0;a1<=b1;a2<=b2;a3<=b3;a4<=b4;a5<=b5;a6<=b6;a7<=b7;end endmodule 在此模块中用了到了<=阻塞赋值的方式。
4.编写控制高位清零的模块,利用在扫描模块中控制SEL的值来实现高位清零。即先从高位开始判断,当只有个位有数据时,SEL只能等于0,当只有个位和十位有数据时,SEL要小于1,依此类推,实现高位清零功能。module scan(clk,a1,a2,a3,a4,a5,a6,a7,sel);input clk;input [3:0]a1,a2,a3,a4,a5,a6,a7;output [2:0]sel;reg [2:0]sel;always @(posedge clk)if({a1,a2,a3,a4,a5,a6,a7}==0000000)sel=0;else if({a2,a3,a4,a5,a6,a7}==000000)if(sel<1)sel=sel+1;else sel=0;else if({a3,a4,a5,a6,a7}==00000)if(sel<2)sel=sel+1;else sel=0;else if({a4,a5,a6,a7}==0000)if(sel<3)sel=sel+1;
第7页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
else sel=0;else if({a5,a6,a7}==000)if(sel<4)sel=sel+1;else sel=0;else if({a6,a7}==00)if(sel<5)sel=sel+1;else sel=0;else if({a7}==0)if(sel<6)sel=sel+1;else sel=0;else sel=sel+1;endmodule 5.上述三个模块为本次实验的主要模块。除此,还用到了,译码,数据选择器模块。相应的模块代码省略。
6.所有模块都写完后,就是写顶层文件。
module top(clk,clr,sig_in,a,b,c,d,e,f,g,dp,sel);input clk,clr,sig_in;output [2:0]sel;output a,b,c,d,e,f,g,dp;
wire clk1,clk2,clk3;wire [2:0]sel_sign;wire [3:0] QA,QB,QC,QD,QE,QF,QG,QH;wire [3:0] b0_o,b1_o,b2_o,b3_o,b4_o,b5_o,b6_o,b7_o;wire [3:0] org_data;
第8页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
assign sel=sel_sign;assign clk3=clk;
fre_count frequence(.clk(clk2),.clr(clr),.b0(b0_o),.b1(b1_o),.b2(b2_o),.b3(b3_o),.b4(b4_o),.b5(b5_o),.b6(b6_o),.b7(b7_o),.a0(QA),.a1(QB),count_99999999 mycounter(.sign(sig_in),.clr(clk2),.b0(b0_o),.b1(b1_o),.a2(QC),.a3(QD),.a4(QE),.a5(QF),.a6(QG),.a7(QH));.b2(b2_o),.b3(b3_o),.b4(b4_o),.b5(b5_o),.b6(b6_o),.b7(b7_o));
clk_div clksource(.clk(clk3),.clko1(clk1));
ones ones_con(.clk(clk3),.clkout(clk2));scan myscan(.clk(clk1),.a1(QB),.a2(QC),.a3(QD),.a4(QE),.a5(QF),.a6(QG),.a7(QF),.sel(sel_sign));mux81 mymux81(.sel(sel_sign),.a(QA),.b(QB),.c(QC),.d(QD),.e(QE),.f(QF),.g(QG),.h(QH),.out(org_data));
第9页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
decode3_8 decode(.org(org_data),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g),.dp(dp));
endmodule
7. 写完了全部代码后,就是器件选择,分配引脚,下载程序,最后在实验箱上进行实验。
在实验的验证过程中,用到了DDS函数信号发生器,从其TTL输出端输出各种不同频率的方波信号,接入接简易频率计的被测信号输入端,在八个数码管上显示出相应的测量结果。
四.结果分析
在上述实验过程中,我们选取了若干组不同的TTL输出进行测量,发现当被测信号的频率不小于1HZ时,简易频率计可以精确的测出被测信号的频率。但是,当被测信号小于1HZ时,显示的测量结果在0和1之间跳动,不稳定。分析简易频率计的结构可知,在如下图所示波形关系中,当被测信号的频率小于1HZ时,在秒级门控信号的一个周期内,计数器要么能计数一次,要么计数零次,因而不能准确的测出被测信号的频率。
五.经验总结
1.本实验中的频率计由于其在结构上存在缺限,因而在测量小于1HZ的信号时,会有较大的误码差,在测量频率大于1HZ信号时,也可能存1HZ误差,其原因在于如果在一个秒级门控信号的周期内,被测信号的上升沿的个数正好
第10页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
和其周数相同,则测量结果是准确的,如果上升沿的个数比周期数多一,则测量结果比实际值大一。
2.提高测量精度的另一个关键地方在所产生的秒级门控信号的精度。只有所产生的秒级门控信号的低电平时间长度为严格的一秒时,测量结果才会更精确。由于实验箱上所使用的晶振不是严格等于24MHZ,因而可用示波器测出晶振的准确频率后,再在parameter
N=24000000;语句中改变N的值。也可以在实验中逐渐调整N的值,直到测量结果最精确为止。最终我们的实验中,N的值取的是24000351。
3.对于高位清零功能的加入,正是仪器设计人性化的一个体现。如果没有这个功能,再未显示数据的数码管也一直处于工作状态,一则是对资源的乱费,二则是会减少器件的使用寿命。
第11页,共11页
第四篇:简易数字频率计(数字电路课程设计)
数字电路课程设计报告
1)设计题目
简易数字频率计
2)设计任务和要求
要求设计一个简易的数字频率计,测量给定信号的频率,并用十进制数字显示,具体指标为:
1)测量范围:1HZ—9.999KHZ,闸门时间1s;
HZ—99.99KHZ,闸门时间0.1s;
HZ—999.9KHZ,闸门时间10ms;
KHZ—9999KHZ,闸门时间1ms;
2)显示方式:四位十进制数
3)当被测信号的频率超出测量范围时,报警.3)原理电路和程序设计:
(1)整体电路
数显式频率计电路
(2)单元电路设计;
(a)时基电路
(b)放大逻辑电路
(c)计数、译码、驱动电路
(3)说明电路工作原理;
四位数字式频率计是由一个CD4017(包含一个计数器和一个译码器)组成逻辑电路,一个555组成时基电路,一个9014形成放大电路,四个CD40110(在图中是由四个74LS48、四个74LS194、四个74LS90组成)及数码管组成。
两个CD40110串联成一个四位数的十进制计数器,与非门U1A、U1B构成计数脉冲输入电路。当被测信号从U1A输入,经过U1A、U1B两级反相和整形后加至计数器U13的CP+,通过计数器的运算转换,将输入脉冲数转换为相应的数码显示笔段,通过数码管显示出来,范围是1—9。当输入第十个脉冲,就通过CO输入下一个CD40110的CP+,所以此四位计数器范围为1—9999。
其中U1A与非门是一个能够控制信号是否输入的计数电路闸门,当一个输入端输入的时基信号为高电平的时候,闸门打开,信号能够通过;否则不能通过。
时基电路555与R2、R3,R4、C3组成低频多谐振荡器,产生1HZ的秒时基脉冲,作为闸门控制信号。计数公式:来确定。
与非门U2A与CD4017组成门控电路,在测量时,当时基电路输出第一个时基脉冲并通过U2A反相后加至CD4017的CP,CD4017的2脚输出高电平从而使得闸门打开。1s后,时基电路送来第二个脉冲信号,CD4017的2脚变为低电平,闸门关闭,测量结束。数码管显示即为所测频率。当555第三个脉冲送过来的时候,电路保持间歇1S,第四个脉冲后高电平加至R,使计数器复位。为下一次计算准备。
(4)元件选择。
资
料
元
件
标号
封装
数量
芯片
CD40110
GK7491AG
陶瓷熔扁平
CD4017
62F2X6KE4
陶瓷熔扁平
74LS00
陶瓷熔扁平
74LS10
陶瓷熔扁平
NE555
K104G4
双列直插型号
显示器
七段共阴数码管
电阻
300Ω
1KΩ
5.1KΩ
10KΩ
100KΩ
1MΩ
10KΩ(滑动)
电容
1000PF
0.1μF
100μF
二极管
1N4148
发光LED
开关
单刀双掷
导线
导线
若干
三极管
9014
电源
12V直流电源
4)电路和程序调试过程与结果:
a)、设计逻辑流程:
b)、理论波形图:
c)、仿真波形图:
1)、时基电路
2)、未、已经过施密特的波形:
d)、误差分析:
本实验的误差来自多方面的原因:一、时基电路NE555的滑动变阻器调节导致误差;二、闸门开放时间与信号输入时间的冲突导致测量不准确;三、整体电路的阻抗、容抗对电路信号的影响。
对于第一点,先计算相关的滑动变阻器的相应阻值大小,然后可以在关闭电源的情况下用万用表测量后才进行测量;第二点有点系统的偶然性;第三点可以尽量减少电路布局,从而减少相应的影响。
5)总结
这个电路多处使用了集成IC芯片,让电路更加简洁明了,并且提高了电路的安全性、可行性,减少了整个电路的功耗和整个电路的布线。但是此电路没有完全地符合实验要求:首先,整个电路没有施密特触发器,输入信号放大电路,数码管的小数点驱动,满位报警电路。因此我首先加入以三极管9014为核心的放大电路;然后用74LS00两个双输入与非门构成施密特触发器,对输入信号进行整形;对于报警电路,由于集成IC没有译码电路引脚,所以选择了一个8输入与非门和一个74LS00结成,这样可以充分考虑到唯一性;还有就是它的计数不是直接显示频率,而是显示一个数字,再与闸门的时候计算才可以得出真正的频率。
总体来说,电路还是存在一点小问题没有得到很好的解决,因为74LS00组成的施密特触发器没有很好地整形波,在示波器上出现脉冲波,还得于计算,可以改为以NE555组成的施密特电路。改用其他的数码管驱动,从而驱动小数点。
通过这次实验,让我认识到数字电路的万千变化,集成IC的推出,大大提高安全性和可行性。理解了科学就是力量。最主要是学习到设计电路的思想以为加强自己的焊接能力。让自己的电子技术更上一层楼。
附录:完整的电路PCB图,完整的源程序名列表(不需要把源程序打印出来,作为电子文档提交)。
附录一:
附录二:
第五篇:EDA简易数字频率计~课设报告
EDA课程设计~简易数字频率计
《EDA技术》课程设计报告
题目:简易数字频率计
专业:
本组成员:
简述
EDA课程设计~简易数字频率计
随着数字电子技术的发展,频率测量成为一项越来越普遍的工作,因此测频计常受到人们的青睐。目前许多高精度的数字频率计都采用单片机加上外部的高速计数器来实现,然而单片机的时钟频率不高导致测频速度比较慢,并且在这种设计中,由于PCB版的集成度不高,导致PCB板走线长,因此难以提高计数器的工作频率。为了克服这种缺点,大大提高测量精度和速度,我们可以设计一种可编程逻辑器件来实现数字频率计。
EDA技术是以大规模可编程逻辑器件为设计载体,以硬件语言为系统逻辑描述的主要方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件设计的电子系统到硬件系统的设计,最终形成集成电子系统或专用集成芯片的一门新技术。其设计的灵活性使得EDA技术得以快速发展和广泛应用。以QUARTUSII软件为设计平台,采用VHDL语言实现数字频率计的整体设计。
EDA技术已经广泛应用于模拟与数字电路系统等许多领域。电子设计自动化是一种实现电子系统或电子产品自动化设计的技术,它与电子技术,微电子技术的发展密切相关,它吸收了计算机科学领域的大多数最新研究成果,以高性能的计算机作为工作平台,促进了工程发展。EDA的一个重要特征就是使用硬件描述语言(HDL)来完成的设计文件,VHDL语言是经IEEE确认的标准硬件语言,在电子设计领域受到了广泛的接受。
1.设计概述
EDA课程设计~简易数字频率计
1.1设计原理
在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此,频率的测量就显得更为重要。测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。
数字式频率计的测量原理有两类:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法即测周期法,如周期测频法。直接测频法适用于高频信号的频率测量,通常采用计数器、数据锁存器及控制电路实现,并通过改变计数器阀门的时间长短在达到不同的测量精度;间接测频法适用于低频信号的频率测量。
本设计中使用的就是直接测频法,即用计数器在计算1s内输入信号周期的个数,其测频范围为1Hz~9999Hz。
1.2原理框图
1.3 系统原理图
系统原理图仿真
EDA课程设计~简易数字频率计
分析说明:clk为1HZ,待测信号sig为10HZ 1.5 引脚图
2.设计思路
频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。这就要求测频控制信号发生器testpl的计数使能信号tsten能产生一个1秒脉宽的周期信号,并对频率计的每一计数器cnt10的使能端en进行同步控制。当tsten为高电平“1”时,允许计数;为低电平“0”时停止计数,并保持其计数结果。在停止计数期间,首先需要一个锁存信号load的上跳沿将计数器在前1 秒种的计数值锁存进16位锁存器reg16b中。锁存信号之后,必须有一个清零信号clr_cnt对计数器进行清零,为下1 秒的计数操作做准备。,然后由外部数码管控制器ledcom控制的7段译码器ymq译出,并稳定显示。
3.模块划分
3.1 测频控制信号发生器testpl模块:
输入端clk收到1Hz信号后,其输出端testen控制各个cnt10的使能,clr_cnt控制各个cnt10的清零,load控制锁存器内数据的输出。
仿真图如下:
EDA课程设计~简易数字频率计
3.2 十进制计数器cnt10模块:
有一时钟使能输入端en,用于锁定计数值。当高电平“1”时计数允许计数,低电平“0”时禁止计数。多位十进制计数器时,最低位的计数器的clk端输入被测信号,各计数器的进位输出端c10将信号输到下一位十进制计数器cnt10的输入端clk,最高位十进制计数器cnt10的进位输出端c10不处理。
仿真图如下:
3.3 16位锁存器reg16b模块:将已有16 位bcd码存在于此模块的输入口din[15..0],在信号load的上升沿后即被锁存到寄存器reg16b的内部,并由reg16b的输出端dout[15..0]输出,设置锁存器的好处是,数码管上显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
仿真图如下:
EDA课程设计~简易数字频率计
3.4 数码管控制器ledcom模块:两个输入端一个为datain[15..0],另一个为数码管显示选择的扫描频率输入端clk,输出端为数码管选择信号com[3..0]和对应显示的数码管的BCD码信号端dataout[3..0],数码管显示选择随扫描频率clk循环变化,实现稳定显示。
仿真图如下:
3.5
译码器ymq模块:输入端d_in[3..0]将接收BCD码信号,译码后输出端d_out[7..0]输出8为7段数码管信号,其中输出的第8位均为高电平“1”可以使四个数码管的小数点不显示。经译码器的处理输出后数码管显示相应的数值。
EDA课程设计~简易数字频率计
4.VHDL顶层文件:
library ieee;use ieee.std_logic_1164.all;entity lx is port(clk: in std_logic;led: out std_logic_vector(7 downto 0);ledc: out std_logic_vector(2 downto 0));end lx;architecture art of lx is--十进制计数器
component cnt10--待调用的有时钟使能的十进制计数器端口定义
port(clk,clr,en: in std_logic;q: out std_logic_vector(3 downto 0);c10: out std_logic);end component;--16位锁存器
component reg16b--待调用的32位锁存器端口定义 port(load: in std_logic;din: in std_logic_vector(15 downto 0);dout: out std_logic_vector(15 downto 0));end component;--测频控制器
component testpl--待调用的测频控制信号发生器端口定义 port(clk:in std_logic;
EDA课程设计~简易数字频率计
tsten:out std_logic;clr_cnt:out std_logic;load:out std_logic);end component;--数码管选择器
component ledcom--待调用的数码管选择器端口定义 port(clk:in std_logic;datain: in std_logic_vector(15 downto 0);dataout: out std_logic_vector(3 downto 0);sel: out std_logic_vector(2 downto 0));end component;--译码器
component ymq--待调用的译码器端口定义 port(d_in: in std_logic_vector(3 downto 0);d_out: out std_logic_vector(7 downto 0));end component;signal clk1,clk2,clk3: std_logic;--clk1为1Hz信号,clk2为被测信号,clk3为数码管扫描信号
signal tsten,clr,load: std_logic;signal c1,c2,c3,c4: std_logic;signal qout,rout: std_logic_vector(15 downto 0);signal datao: std_logic_vector(3 downto 0);begin u0:testpl port map(clk1,tsten,clr,load);u1:cnt10 port map(clk2,clr,tsten,qout(3 downto 0),c1);u2:cnt10 port map(c1,clr,tsten,qout(7 downto 4),c2);u3:cnt10 port map(c2,clr,tsten,qout(11 downto 8),c3);u4:cnt10 port map(c3,clr,tsten,qout(15 downto 12),c4);u5:reg16b port map(load,qout(15 downto 0),rout);u6:ledcom port map(clk3,rout,datao,ledc);u8:ymq port map(datao,led);end art;
5.心得体会
这次课程设计中,我不仅复习巩固了课堂所学的理论知识,提高
EDA课程设计~简易数字频率计
了对所学知识的综合应用能力,并从根本上了解了VHDL语言的一些基本用法,应用了原来不会或者不熟练的句型,如if句,case句等,也学会了一些基本功能的实现方法,如分频,状态控制等等,从另外一个角度重新审视了上学期完全从硬件角度出发的电路设计,明白了软硬件之间的交互。通过这个课题,对系统框图、逻辑流程图、状态转移图的设计有了一定的了解。也懂得了系统的前期设计对于后续的编程和调试的重要性。
本课题采用了自下而上的设计方法,根据系统对硬件的要求,画出系统控制流程图;然后根据控制流程图,分化模块,利用模块实现功能;最后进行仿真和调试。
每个成功的背后都要面对无数次的失败,这次课设也不例外。虽然遇到不少问题与困难,但通过老师以及同学的帮助,都一一得到顺利地解决。我想这必定会为将来的实践积累宝贵的经验和教训。总之,这次课设我们都受益匪浅。整个过程氛围浓厚,本人也态度十分认真,积极向老师和同学求教并在此过程中收获良多,能够进一步了解和使用一门与硬件直接打交道的基本语言对我们将来的学习和工作都会十分有益。
6.五个模块的程序源代码
6.1 测频控制信号发生器
EDA课程设计~简易数字频率计
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity testpl is port(clk:in std_logic;--1Hz信号
tsten:out std_logic;--计数器使能信号 clr_cnt:out std_logic;--计数器清零信号 load:out std_logic);--锁存器输出控制信号 end testpl;architecture art of testpl is signal div2clk:std_logic;begin process(clk)begin if clk'event and clk='1'then div2clk<=not div2clk;--div2clk为2Hz end if;end process;process(clk ,div2clk)begin if(clk='0'and div2clk='0')then clr_cnt<='1';--当div2clk与clk同时为零时计数器清零 else clr_cnt<='0';--当div2clk处于的高电平时计数器计数 end if;end process;load<=not div2clk;--锁存器输出与计数器使能信号反相 tsten<=div2clk;end art;
有时钟使能的十进制计数器
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt10 is port(clk,clr,en: in std_logic;--clk:计数器时钟,clr:清零信号,en:计数使能信号
q: out std_logic_vector(3 downto 0);--q:4位计数结果输出
EDA课程设计~简易数字频率计
c10: out std_logic);--计数进位
end cnt10;architecture art of cnt10 is signal cqi: std_logic_vector(3 downto 0);begin process(clk,clr)begin if clr='1' then cqi<=“0000”;--当输入的clr_cnt为低电平0时清零
elsif clk'event and clk='1' then if en='1' then--当输入的tesen为高电平1时允许计数
if(cqi<9)then cqi<=cqi+1;else cqi<=“0000”;--等于9则计数器清零
end if;--当输入的tesen为低电平0时禁止计数,锁定计数值 end if;end if;end process;--产生进位 process(cqi)begin if cqi=“1001” then c10<='1';--当加的9时产生进位输出 else c10<='0';end if;end process;q<=cqi;end art;
16位锁存器
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity reg16b is port(load: in std_logic;--输出锁存控制信号 din: in std_logic_vector(15 downto 0);dout: out std_logic_vector(15 downto 0));end reg16b;
EDA课程设计~简易数字频率计
architecture art of reg16b is begin process(load,din)begin if load'event and load='1'then--load为高电平时teten为低电平,计数器禁止
dout<=din;--锁存输入的数据 end if;end process;end art;
6.4 数码管控制器
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ledcom is port(clk:in std_logic;--数码管扫描频率
datain: in std_logic_vector(15 downto 0);--锁存器输入的16位信号 dataout: out std_logic_vector(3 downto 0);--输出至译码器的4位信号
sel: buffer std_logic_vector(2 downto 0));--输出数码管选择信号 end ledcom;architecture art of ledcom is begin--sel同扫描频率clk循环变化 process(clk)begin if rising_edge(clk)then if sel>=7 then
sel <=“000”;
else sel<=sel+1;end if;end if;
end process;--数码管选择 process(sel,datain)
begin case sel is when “000”=> dataout<=datain(3 downto 0);
EDA课程设计~简易数字频率计
when “001”=> dataout<=datain(7 downto 4);when “010”=> dataout<=datain(11 downto 8);when “011”=> dataout<=datain(15 downto 12);when others =>NULL;end case;end process;end art;
七段数码管的译码器
library IEEE;use IEEE.std_logic_1164.all;entity ymq is port(d_in: in std_logic_vector(3 downto 0);--数码管控制器输入四位信号
d_out: out std_logic_vector(6 downto 0));--输出8位信号
end ymq;--第8位d_out[7]为逗号 architecture art of ymq is begin process(d_in)begin case d_in is--第8位为1高电平逗号不显示 when “0000” => d_out<=“1111110”;--0 when “0001” => d_out<=“0110000”;--1 when “0010” => d_out<=“1101101”;--2 when “0011” => d_out<=“1111001”;--3 when “0100” => d_out<=“0110010”;--4 when “0101” => d_out<=“1011011”;--5 when “0110” => d_out<=“1011111”;--6 when “0111” => d_out<=“1110000”;--7 when “1000” => d_out<=“1111111”;--8 when “1001” => d_out<=“1111011”;--9 when others =>NULL;end case;end process;end art;7.参考文献
1、王小军 主编.《VHDL简明教程》.清华大学出版社,1997
EDA课程设计~简易数字频率计
2、潘松、王国栋 主编.《VHDL应用教程》电子科技大学出版社,2000
3、甘历 主编.《VHDL应用于开发实践》科学出版社,2003
4、刘爱荣 主编.《EDA技术与CPLD/FPGA开发应用简明教程》.清华大学出版社,2007