数字电子技术基础论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文由yirgui贡献
doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
哈尔滨工业大学课程设计说明书(论文)
数字式频率计
设计任务 在 FPGA 实验板上,利用 FPGA 编程设计一个数字式频率计。 设计要求与目的
1.利用实验板上的 50M 时钟分频作为被测输入信号;分频成 1Hz 作为时基信号;(要 求在示波器上显示被测信号和时基信号) 2.数码管显示的频率范围为 00~99Hz。 3.测量精度为±1Hz。
设计原理分析
1.频率是指单位时间(1s)内信号振动的次数。当被测信号在一定的时间段 Ts 内的周期个 数为 N 时,则被测信号的频率:
fx = N Ts
2.从测量的角度看,即单位时间测 得的被测信号的脉冲数。被测信号送入通 道,经放大整形后,使每个周期形成一个脉冲,用计数器计算脉冲的个数,即为频率。 如下图 1 所示: N
Ts
图1
方案设计 由上述原理可以知道,要实现频率计,从硬件方面看,需要时基电路、单稳
态触发器、放大整形电路、闸门电路、计数器、锁存器和译码显示器等。其硬件结构图 如下图 2 所示:
译码显示 器 单稳态触发 器 C 单稳态触发 器 B 时基电 路 C
清零
锁存
锁存器
计数器 E 闸门电路 A 放大整形电 路
D
图 2 硬件结构图 而从数字电路时序的角度去分析,其时序图如下图 3 所示:
哈尔滨工业大学课程设计说明书(论文)
图 3 时序图 其中,A-被测信号;B-时基信号,秒脉冲;E-计数器计数脉冲信号;C-锁存器送数信 号;D-计数器清零信号。 当时基信号出现上升沿时,计数器开始计数,计到时基信号下 降沿出现,计数器停止计数,此时锁存器送数信号出现上升沿有效,给数码管送数,等 送数结束后,计数器出现一个上升沿对计数器清零。当下一个时钟周期到来时,是一样 的过程。 频率计的输入输出关系如下表一所示: 表一 输入输出信号 输入 : clk1Hz uclk 输出: led0 led1 p_cnt_en p_rst_cnt p_load 频率值最低位 频率值次低位 计数允许(1 s) 复位计数器 锁存到寄存器中 基准时钟输入 待测信号输入
哈尔滨工业大学课程设计说明书(论文)
图 4 FPGA 内部均衡逻辑图
方案优化与确定 在满足基础要求后,我们进行设计了的创新。首先,我们在逻辑中采
用时序逻辑电路的编程方法,即在时基信号为"1"时闸门开启,自动开始计数,下降沿来 时锁存数据并输出。为了增加频率计的实际应用功能,我们增设了手动分频功能,即给 出一个 200HZ 的基础频率,通过拨动开关输入想要分频的倍数并显示在 LED 数码管上, 频率计即可自
行计算出分频后的频率值。具体的实现方案将在下文的程序中给出。
方案实现及程序
模块一 1Hz时基信号的分频 时基信号的分频
方法一
//本模块由50M时钟分频产生占空比50%的1Hz时钟
module clk_1Hz(clk_50M,clk_1,reset); input clk_50M,reset; output clk_1; reg clk_1; reg clk_2; reg[25:0] count; always@(posedge clk_50M) begin if (count ==24_999_999) begin clk_2 = 1'b1; count end else begin clk_2 = 1'b0; count = count+1; end end always@(posedge clk_2 or negedge reset) //由空比非50%的2Hz时钟分频产生占空比50%的1Hz时钟 begin if (!reset) = 0; //count计数终点 = f_in/f_out-1 = 50*10^6/2-1 //产生占空比非50%的2Hz时钟
哈尔滨工业大学课程设计说明书(论文) clk_1 = 1'b0; else clk_1 = ~ clk_1; end
endmodule
方法二
//本模块由50M时钟分频直接产生占空比50%的1Hz时钟
module clk50M_to_clk1(clk_50M,clk_1,reset_n); input clk_50M,reset_n; output clk_1; reg [26:0]count; reg clk_1; always @(posedge clk_50M or negedge reset_n) begin if(!reset_n) begin count<=0; clk_1<=0; end else if(count ==24_999_999) begin f_in/(2*f_out)-1 = 50*10^6/2-1=24999999 clk_1<=~clk_1; count<=0; end else count<=count+27'b1; // 占 空 比 50% 方 波 count 计 数 终 点 = //1Hz时钟
end
endmodule
模块二 被测信号的分频获取 //本模块用于产生被测频率的方波,先分频产生200Hz频率方波,再由输入参数freq_div 决定对200Hz进行2~15分频比的分频,从而产生最后的被测方波
module user_clk(clk_50M,clk_test,freq_div,reset_n); input clk_50M; input input [3:0] freq_div; reset_n; //被测方波 //输入分频参数
output clk_test; reg clk_test; reg clk_200Hz; reg [25:0] count; reg [3:0] cnt;
wire [3:0] div; always@(posedge clk_50M)
哈尔滨工业大学课程设计说明书(论文) begin if (count =='d24_9999) //产生占空比非50%的200Hz时钟 begin clk_200Hz <= 1'b1; count end else begin clk_200Hz <= 1'b0; count <= count+26'b1; end end /*always@(posedge clk_100Hz) begin clk_test<= ~ clk_test; end*/ assign div=(freq_div==4'b0) ? 1'b0 : //已知分频比N,求cnt计数终点。由于产生方波,cnt //由N>>1来计算N/2,同时在N=0 //对200Hz进行2~15分频比的分频, <= 0;
计数终点=N/2-1
(freq_div==4'b1) ? 1'b0 : ((freq_div>>1)-1);
和1的情况,使cnt计数终点为零即2分频
always @(posedge clk_200Hz or negedge reset_n) begin
从而产生最后的被测方波
if(!reset_n) cnt<=0; else if(cnt==div) cnt<=0; clk_test<=~clk_test; end else cnt<=cnt+1'b1; end endmodule begin
模块三 频率计中计数与锁存部分的实现 //clk_1作为时基信号开启计数,clk_test作为计数时钟
module counter(clk_test,clk_1,reset_n,q0,q1,cnt_enb); input clk_test,clk_1,reset_n; output [3:0] q0,q1; output cnt_enb;
reg cnt_enb; reg [7:0] count; reg [7:0] out;
哈尔滨工业大
学课程设计说明书(论文) always @(posedge clk_1 or negedge reset_n) if(!reset_n) cnt_enb<=0; begin
else cnt_enb<=~cnt_enb; //使能开启1S end always @(posedge clk_test or negedge reset_n) if(!reset_n ) count<=8'b0; else if((cnt_enb==1'b1)&&(count[3:0]==4'b1001)) begin count[3:0]<=0; count[7:4]<=count[7:4]+1'b1; end else if(cnt_enb==1'b1) count[3:0]<=count[3:0]+1'b1; else //计数使能无效后,再来一个clk_test的上升沿清计数器 count<=0; //此算法使计数结果为BCD码 begin
end always @(posedge clk_1 or negedge reset_n) if(!reset_n) out<=8'b0; else if(cnt_enb==1'b1) //时基信号上升沿时若计数使能有效则锁存计数值,因为这个沿后使能变为 begin
无效
out<=count; end
assign q0=out[3:0]; assign q1=out[7:4];
endmodule
模块四 频率值的数码管显示
module decode47(a,b,c,d,e,f,g,D3,D2,D1,D0); output a,b,c,d,e,f,g; input D3,D2,D1,D0; reg a,b,c,d,e,f,g; always @(D3 or D2 or D1 or D0) begin case({D3,D2,D1,D0}) //用case 语句进行译码 4'd0: {a,b,c,d,e,f,g}=~7'b1111110; 4'd1: {a,b,c,d,e,f,g}=~7'b0110000; 4'd2: {a,b,c,d,e,f,g}=~7'b1101101; 4'd3: {a,b,c,d,e,f,g}=~7'b1111001; 4'd4: {a,b,c,d,e,f,g}=~7'b0110011; //输入4 位BCD 码 //输出驱动7个笔划段
哈尔滨工业大学课程设计说明书(论文) 4'd5: {a,b,c,d,e,f,g}=~7'b1011011; 4'd6: {a,b,c,d,e,f,g}=~7'b1011111; 4'd7: {a,b,c,d,e,f,g}=~7'b1110000; 4'd8: {a,b,c,d,e,f,g}=~7'b1111111; 4'd9: {a,b,c,d,e,f,g}=~7'b1111011; default: {a,b,c,d,e,f,g}=~7'b1111110; endcase end endmodule
模块五 分频系数的数码管显示 //本模块用于显示分频系数,分频系数由开关输入
module div_display(freq_div,display_div); input output reg [3:0] freq_div; //分频系数 //转成BCD码的分频系数
[7:0] display_div; [7:0] display_div;
always @(freq_div)
begin
if(freq_div==4'b0 || freq_div==4'b1) display_div[7:0]=8'b10; else if (freq_div>=4'b1010) begin ///二进制_to_BCD码算法:因为最大的分频比是15,所
以最高只能到1,当分频比大于4'b1010时,低位减4'b1010,高位加1
display_div[3:0]=freq_div-4'b1010; display_div[7:4]=4'b1; end else begin display_div[3:0]=freq_div; display_div[7:4]=4'b0; end end endmodule
模块六 频率计的例化及功能实现 //本频率计可以测量对200Hz方波进行2~15分频后的方波信号的频率, 分频比由拨码开关 设置,并可以通过数码管显示测量频率和分频比。当是偶数分配比时测量误差在正负1之 间,为奇数时误差较大。
module frequency_counter(clk_50M,HEX0,HEX1,HEX6,HEX7,reset_n,clk_test,clk_1,freq_div,cnt_enb ,reset); input clk_50M,reset_n; input [3:0] freq_div; output clk_test,clk_1,cnt_enb,reset; output[6:0] HEX0,HEX1,HEX6,HEX7;
wire [7:0] display_div; wire [7:0] out;
assign reset=reset_n;
哈尔滨工业大学课程设计说明书(论文) //实例化各模块 clk50M_to_clk1 u1 (.clk_50M(clk_
50M),.clk_1(clk_1),.reset_n(reset_n)); //直接 //间接
得到占空比50%的1Hz时钟
//clk_1Hz u1 (.clk_50M(clk_50M),.clk_1(clk_1),.reset(reset_n));
得到占空比50%的1Hz时钟
user_clk (.clk_50M(clk_50M),.clk_test(clk_test),.freq_div(freq_div),.reset_n(reset_n)); u2 // 产
生对200Hz进行2~15分频的占空比50%的方波
counter //频率计核心原理部分 c1
(.clk_test(clk_test),.clk_1(clk_1),.reset_n(reset_n),.q0(out[3:0]),.q1(out[7:4]),.cnt _enb(cnt_enb));
decode47 .D3(out[3]),.D2(out[2]),.D1(out[1]),.D0(out[0])); //显示频率低位
d1
(.a(HEX0[0]),.b(HEX0[1]),.c(HEX0[2]),.d(HEX0[3]),.e(HEX0[4]),.f(HEX0[5]),.g(HEX0[6]),
decode47 //显示频率高位
d2
(.a(HEX1[0]),.b(HEX1[1]),.c(HEX1[2]),.d(HEX1[3]),.e(HEX1[4]),.f(HEX1[5]),.g(HEX1[6]), .D3(out[7]),.D2(out[6]),.D1(out[5]),.D0(out[4]));
div_display y1 (.freq_div(freq_div),.display_div(display_div));
//转成BCD
码的分频系数
decode47 d3
(.a(HEX6[0]),.b(HEX6[1]),.c(HEX6[2]),.d(HEX6[3]),.e(HEX6[4]),.f(HEX6[5]),.g(HEX6[6]), .D3(display_div[3]),.D2(display_div[2]),.D1(display_div[1]),.D0(display_div[0]));// 显
示频率比低位
decode47 d4
(.a(HEX7[0]),.b(HEX7[1]),.c(HEX7[2]),.d(HEX7[3]),.e(HEX7[4]),.f(HEX7[5]),.g(HEX7[6]), .D3(display_div[7]),.D2(display_div[6]),.D1(display_div[5]),.D0(display_div[4]));// 显
示频率比高位
endmodule
方案验证: 方案验证:见波形仿真图
哈尔滨工业大学课程设计说明书(论文)
1