完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
基于EDA的8位数字频率计设
使用Cyclone EP1C6Q240的EDA器件,完成实现一个8位十进制频率计。测试信号可以是正弦波、方波。正弦波先经过整形电路再进行测量,测试频率是1~1MHz,方波测试的频率是1~48MHz,利用直接测频法进行测量。利用QuartusII完成设计、仿真等工作。被测信号经过检测后测得的频率值,由数码管1~8显示。使用Verilog HDL编程语言。或者将下面3个程序整合起来!! module freqtest(clock,freq_input,dig,seg,test); input clock; //系统时钟 input freq_input; //被测信号输入 output[7:0] dig; //数码管选择输出引脚 output[7:0] seg; //数码管段输出引脚 output[9:0] test; //输出频率信号,用于测试 reg [25:0] counter; //时钟分频计数器 reg [31:0] freq_result; //频率测量结果寄存器 wire [31:0] pre_freq; //脉冲计数寄存器 reg rst; wire divide_clk; //1Hz 闸门信号 wire clk_scan; //数码管扫描显示时钟 wire cout1,cout2,cout3,cout4,cout5,cout6,cout7; assign clk_scan = counter[15]; //动态扫描时钟 assign test= counter[9:0]; //输出频率信号,用于测试 //时钟分频进程:分出 1Hz 基准信号 always @(posedge clock) begin if (divide_clk) counter <= 26'd0; else counter <= counter + 1'b1; end assign divide_clk = (counter >= 26'd50000000); //锁存测量值进程 always @(posedge clock) begin if(divide_clk) freq_result <= pre_freq; end //产生计数器复位信号 always @(posedge clock) begin if(divide_clk) rst <= 1'b1; else rst <= 1'b0; end //8 位十进制计数模块:由 8 个十进制计数模块构成 cnt10 u1(.clock(clock0),.rst(rst),.cin(1'b1),.cout(cout1),.dout(pre_freq[3:0])); cnt10 u2(.clock(clock0),.rst(rst),.cin(cout1),.cout(cout2),.dout(pre_freq[7:4])); cnt10 u3(.clock(clock0),.rst(rst),.cin(cout2),.cout(cout3),.dout(pre_freq[11:8])); cnt10 u4(.clock(clock0),.rst(rst),.cin(cout3),.cout(cout4),.dout(pre_freq[15:12])); cnt10 u5(.clock(clock0),.rst(rst),.cin(cout4),.cout(cout5),.dout(pre_freq[19:16])); cnt10 u6(.clock(clock0),.rst(rst),.cin(cout5),.cout(cout6),.dout(pre_freq[23:20])); cnt10 u7(.clock(clock0),.rst(rst),.cin(cout6),.cout(cout7),.dout(pre_freq[27:24])); cnt10 u8(.clock(clock0),.rst(rst),.cin(cout7),.cout(),.dout(pre_freq[31:28])); //数码管显示模块 scan_led u9(.clk_1k(clk_scan),.d(freq_result),.dig(dig),.seg(seg)); endmodule module cnt10(clock,rst,cin,cout,dout); //10 进制计数器 input clock; //计数时钟 input cin; //进位输入 input rst; //复位信号 output cout; //进位输出 output[3:0] dout; //计数输出 reg[3:0] counter; //寄存器 assign dout = counter; assign cout = cin && (counter >= 4'd9); //进位输出 always @(posedge clock or posedge rst) begin if(rst) counter <= 4'd0; //计数器复位 else if(cin) //进位输入 begin if(cout) counter <= 4'd0; else counter <= counter + 1'b1; end end endmodule module scan_led(clk_1k,d,dig,seg); input clk_1k; input [31:0] d; //输入要显示的数据 output [7:0] dig; //数码管选择输出引脚 output [7:0] seg; //数码管段输出引脚 reg [7:0] seg_r; //定义数码管输出寄存器 reg [7:0] dig_r; //定义数码管选择输出寄存器 reg [3:0] disp_dat; //定义显示数据寄存器 reg [2:0] count; //定义计数寄存器 assign dig=dig_r; //输出数码管选择 assign seg=seg_r; //输出数码管译码结果 always @(posedge clk_1k) //定义上升沿触发进程 begin count <=count+1'b1; end always @(posedge clk_1k) begin if(d<10) begin case(count) //选择扫描显示数据 3'd0:disp_dat=d[31:28]; //第一个数码管 3'd1:disp_dat=d[27:24]; //第二个数码管 3'd2:disp_dat=d[23:20]; //第三个数码管 3'd3:disp_dat=d[19:16]; //第四个数码管 3'd4:disp_dat=d[15:12]; //第五个数码管 3'd5:disp_dat=d[11:8]; //第六个数码管 3'd6:disp_dat=d[7:4]; //第七个数码管 3'd7:disp_dat=d[3:0]; //第八个数码管 endcase case(count) //选择数码管显示位 3'd0:dig_r=8'b11111111; //选择第一个数码管显示 3'd1:dig_r=8'b11111111; //选择第二个数码管显示 3'd2:dig_r=8'b11111111; //选择第三个数码管显示 3'd3:dig_r=8'b11111111; //选择第四个数码管显示 3'd4:dig_r=8'b11111111; //选择第五个数码管显示 3'd5:dig_r=8'b11111111; //选择第六个数码管显示 3'd6:dig_r=8'b11111111; //选择第七个数码管显示 3'd7:dig_r=8'b11111110; //选择第八个数码管显示 endcase end if(d>10&d<100) begin case(count) 3'd0:disp_dat=d[31:28]; 3'd1:disp_dat=d[27:24]; 3'd2:disp_dat=d[23:20]; 3'd3:disp_dat=d[19:16]; 3'd4:disp_dat=d[15:12]; 3'd5:disp_dat=d[11:8]; 3'd6:disp_dat=d[7:4]; 3'd7:disp_dat=d[3:0]; endcase case(count) 3'd0:dig_r=8'b11111111; 3'd1:dig_r=8'b11111111; 3'd2:dig_r=8'b11111111; 3'd3:dig_r=8'b11111111; 3'd4:dig_r=8'b11111111; 3'd5:dig_r=8'b11111111; 3'd6:dig_r=8'b11111101; 3'd7:dig_r=8'b11111110; endcase end if(d>100&d<1000) begin case(count) 3'd0:disp_dat=d[31:28]; 3'd1:disp_dat=d[27:24]; 3'd2:disp_dat=d[23:20]; 3'd3:disp_dat=d[19:16]; 3'd4:disp_dat=d[15:12]; 3'd5:disp_dat=d[11:8]; 3'd6:disp_dat=d[7:4]; 3'd7:disp_dat=d[3:0]; endcase case(count) 3'd0:dig_r=8'b11111111; 3'd1:dig_r=8'b11111111; 3'd2:dig_r=8'b11111111; 3'd3:dig_r=8'b11111111; 3'd4:dig_r=8'b11111111; 3'd5:dig_r=8'b11111011; 3'd6:dig_r=8'b11111101; 3'd7:dig_r=8'b11111110; endcase end if(d>1000&d<10000) begin case(count) 3'd0:disp_dat=d[31:28]; 3'd1:disp_dat=d[27:24]; 3'd2:disp_dat=d[23:20]; 3'd3:disp_dat=d[19:16]; 3'd4:disp_dat=d[15:12]; 3'd5:disp_dat=d[11:8]; 3'd6:disp_dat=d[7:4]; 3'd7:disp_dat=d[3:0]; endcase case(count) 3'd0:dig_r=8'b11111111; 3'd1:dig_r=8'b11111111; 3'd2:dig_r=8'b11111111; 3'd3:dig_r=8'b11111111; 3'd4:dig_r=8'b11110111; 3'd5:dig_r=8'b11111011; 3'd6:dig_r=8'b11111101; 3'd7:dig_r=8'b11111110; endcase end if(d>10000&d<100000) begin case(count) 3'd0:disp_dat=d[31:28]; 3'd1:disp_dat=d[27:24]; 3'd2:disp_dat=d[23:20]; 3'd3:disp_dat=d[19:16]; 3'd4:disp_dat=d[15:12]; 3'd5:disp_dat=d[11:8]; 3'd6:disp_dat=d[7:4]; 3'd7:disp_dat=d[3:0]; endcase case(count) 3'd0:dig_r=8'b11111111; 3'd1:dig_r=8'b11111111; 3'd2:dig_r=8'b11111111; 3'd3:dig_r=8'b11101111; 3'd4:dig_r=8'b11110111; 3'd5:dig_r=8'b11111011; 3'd6:dig_r=8'b11111101; 3'd7:dig_r=8'b11111110; endcase end if(d>100000&d<1000000) begin case(count) 3'd0:disp_dat=d[31:28]; 3'd1:disp_dat=d[27:24]; 3'd2:disp_dat=d[23:20]; 3'd3:disp_dat=d[19:16]; 3'd4:disp_dat=d[15:12]; 3'd5:disp_dat=d[11:8]; 3'd6:disp_dat=d[7:4]; 3'd7:disp_dat=d[3:0]; endcase case(count) 3'd0:dig_r=8'b11111111; 3'd1:dig_r=8'b11111111; 3'd2:dig_r=8'b11011111; 3'd3:dig_r=8'b11101111; 3'd4:dig_r=8'b11110111; 3'd5:dig_r=8'b11111011; 3'd6:dig_r=8'b11111101; 3'd7:dig_r=8'b11111110; endcase end if(d>100000&d<1000000) begin case(count) 3'd0:disp_dat=d[31:28]; 3'd1:disp_dat=d[27:24]; 3'd2:disp_dat=d[23:20]; 3'd3:disp_dat=d[19:16]; 3'd4:disp_dat=d[15:12]; 3'd5:disp_dat=d[11:8]; 3'd6:disp_dat=d[7:4]; 3'd7:disp_dat=d[3:0]; endcase case(count) 3'd0:dig_r=8'b11111111; 3'd1:dig_r=8'b10111111; 3'd2:dig_r=8'b11011111; 3'd3:dig_r=8'b11101111; 3'd4:dig_r=8'b11110111; 3'd5:dig_r=8'b11111011; 3'd6:dig_r=8'b11111101; 3'd7:dig_r=8'b11111110; endcase end if(d>10000000) begin case(count) 3'd0:disp_dat=d[31:28]; 3'd1:disp_dat=d[27:24]; 3'd2:disp_dat=d[23:20]; 3'd3:disp_dat=d[19:16]; 3'd4:disp_dat=d[15:12]; 3'd5:disp_dat=d[11:8]; 3'd6:disp_dat=d[7:4]; 3'd7:disp_dat=d[3:0]; endcase case(count) 3'd0:dig_r=8'b01111111; 3'd1:dig_r=8'b10111111; 3'd2:dig_r=8'b11011111; 3'd3:dig_r=8'b11101111; 3'd4:dig_r=8'b11110111; 3'd5:dig_r=8'b11111011; 3'd6:dig_r=8'b11111101; 3'd7:dig_r=8'b11111110; endcase end end always @(disp_dat) begin case(disp_dat) //七段译码 4'h0:seg_r=8'hc0; //显示0 4'h1:seg_r=8'hf9; //显示1 4'h2:seg_r=8'ha4; //显示2 4'h3:seg_r=8'hb0; //显示3 4'h4:seg_r=8'h99; //显示4 4'h5:seg_r=8'h92; //显示5 4'h6:seg_r=8'h82; //显示6 4'h7:seg_r=8'hf8; //显示7 4'h8:seg_r=8'h80; //显示8 4'h9:seg_r=8'h90; //显示9 4'ha:seg_r=8'h88; //显示a 4'hb:seg_r=8'h83; //显示b 4'hc:seg_r=8'hc6; //显示c 4'hd:seg_r=8'ha1; //显示d 4'he:seg_r=8'h86; //显示e 4'hf:seg_r=8'h8e; //显示f endcase end endmodule |
|
相关推荐
|
|
1533 浏览 1 评论
1313 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
1523 浏览 0 评论
925 浏览 0 评论
2317 浏览 0 评论
1457 浏览 35 评论
5666 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 09:17 , Processed in 0.564037 second(s), Total 70, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号