1.设计要求
设计并制作一个能够测量正弦波信号频率的电路。
基本要求如下:
(1) 测频范围为0~999Hz,精度为1Hz;
(2) 用数码管显示测频结果;
(3) 设有超量程指示(信号频率≥1kHz时)。
说明:在输入正弦波信号峰值为100mV的情况下进行测试。
2.方案
基于FPGA的控制方案
通过软件设计,其中测频控制电路、等精度测量和频率计算电路以及转换译码电路均可以在DE0中实现。标准信号产生电路可通过外部晶振信号(频率为50MHz)提供,待测信号可与扩展接口相连接,故总体设计方案如下图所示。
其中fx为被测信号,CLR’是用于将计数器清零,CNTEN为门控信号,用于控制计数器在单位时间内对CLK进行计数,DISPEN’用于控制锁存译码电路刷新测量结果.
3.单元电路设计
3.1 FPGA部分模块电路代码
由于DE0开发板库中的元器件有限,因此对于库中没有的器件,需要自己写出该器件的功能,并完成调试后封装成电路图,以便在顶层电路中调用。
3.1.1分频电路
将DE0开发板的内部50MHz晶振进行分频,使用其8Hz的频率作为标准频率信号产生,具体代码如下:
module FP8Hz(clk,fp_out);
input clk;
output
reg fp_out;
reg [21:0] cnt;
parameter N = 6250000;
always @ (posedge clk)
if ( cnt < N/2-1)
cnt <= cnt + 1'b1;
else
begin
cnt <= 22'b0;
fp_out <= ~fp_out;
end
endmodule
3.1.2主控电路
为设计方便,用十进制计数器74HC160作为主控电路,取时钟脉冲为8Hz,输出用
表示。设测频计数器的清零信号CLK’低电平有效,门控信号CNTEN高电平有效,显示信号DISPEN’低电平有效,其中闸门信号有效时间为1秒。
3.1.3计数电路
电路设计的测频范围为0~9999Hz,则需要4个74HC160级联扩展为一万进制计数器。
3.1.4译码显示电路
锁存与译码电路基于CD4511设计。为了节约FPGA资源,简化掉CD4511的灯测试和灭灯功能,只保留锁存功能,同时将显示译码器的输出设计为低电平有效以适应驱动DE0开发板上共阳数码管的需要。
CD4511代码如下:
module CD4511(LE,BCD,SEG7);
input LE;
input [3:0] BCD;
output reg [6:0] SEG7;
always @(LE,BCD)
if (!LE) // 锁存信号无效时
case (BCD) // SEG7: gfedcba,低电平有效
4'b0000: SEG7 <= 7'b1000000; // 显示0
4'b0001: SEG7 <= 7'b1111001; // 显示1
4'b0010: SEG7 <= 7'b0100100; // 显示2
4'b0011: SEG7 <= 7'b0110000; // 显示3
4'b0100: SEG7 <= 7'b0011001; // 显示4
4'b0101: SEG7 <= 7'b0010010; // 显示5
4'b0110: SEG7 <= 7'b0000010; // 显示6
4'b0111: SEG7 <= 7'b1111000; // 显示7
4'b1000: SEG7 <= 7'b0000000; // 显示8
4'b1001: SEG7 <= 7'b0010000; // 显示9
default: SEG7 <= 7'b1111111; // 不显示
endcase
endmodule
四路合成一路代码如下:
module B4to1(QA,QB,QC,QD,BCD);
input QA,QB,QC,QD;
output [3:0]BCD;
assign BCD={QD,QC,QB,QA};
endmodule
3.1.5超量程指示电路
在量程超范围后,四个74HC160的进位信号通过四输入与门结合D触发器作为超量程指示信号,当量程超范围后,指示灯亮。
3.2外部电路设计
由于要求输入信号为100mv,且为正弦波。因此应将输入信号进行整形放大,利用LM2904双运放及74HC14整形器件,使用双级运放,第一级放大10倍,第二级放大3倍,使得输出为3v的方波。
3.3顶层电路设计图
4.调试
DE0板的调试方法为,在软件内利用开发板的外部50MHz晶振做一个分频信号,测试结果是否正确。
分频信号代码如下:
分频100000Hz
module FP10whz(clk,fp_out);
input clk;
output fp_out;
reg fp_out;
reg [21:0] cnt;
parameter N = 500;
always @ (posedge clk)
if ( cnt < N/2-1)
cnt <= cnt + 1'b1;
else
begin cnt <= 22'b0;
fp_out<= ~fp_out;
end
endmodule
利用开关改变八路信号:
module signal8(clk,sel,y);
input clk;
input [2:0] sel;
output reg y;
reg [7:0] q;
always @ (posedge clk)
q<= q+1;
always @(sel,q)
case (sel)
3'd0: y=q[0];
3'd1: y=q[1];
3'd2: y=q[2];
3'd3: y=q[3];
3'd4: y=q[4];
3'd5: y=q[5];
3'd6: y=q[6];
3'd7: y=q[7];
default :y=q[0];
endcase
endmodule
测试结果:
开关为001时,输入信号为25000Hz,超出量程,指示灯亮起,开关为011时,输入信号为6250Hz
5.资料
1.DE0板外部引脚
用来连接外部电路。
2.引脚锁定所需资料
1.晶振
2.7段数码管
3.开关
4.LED灯
水平有限,不足之处还望各位大佬指出~~~