没有合适的资源?快使用搜索试试~ 我知道了~
首页基于FPGA的数字频率计的源代码.docx
资源详情
资源评论
资源推荐
基于 FPGA 的数字频率计的源代码
主模块 top
module
top(clk,rst_n,fre_in,LCD_E,LCD_DI,LCD_RW,LCD_CS_0,LCD_CS_1,LCD_RESET,LCD_DATA,BUSY_DAT
A,write
);
input clk;
input rst_n;
input fre_in;//输入频率
output LCD_E;
output LCD_DI;
output LCD_RW;
output LCD_CS_0;
output LCD_CS_1;
output LCD_RESET;
output [7:0]BUSY_DATA;
output write;
inout [7:0]LCD_DATA;
wire [19:0] fre_out;
wire [3:0] million,hunthousand,tenthousand,thousand,hundred,ten,one;
fre_meter fre_meter(
.clk(clk),
.rst_n(rst_n),
.fre_in(fre_in),
.fre_out(fre_out)
);
bin_dec bin_dec(
.clk(clk),
.rst(rst_n),
.hex(fre_out),
.million(million),
.hunthousand(hunthousand),
.tenthousand(tenthousand),
.thousand(thousand),
.hundred(hundred),
.ten(ten),
.one(one)
);
LCD LCD (
clk,//系统时钟 50MHZ
LCD_E,
LCD_DI,
LCD_RW,
LCD_CS_0,
LCD_CS_1,
LCD_RESET,
LCD_DATA,//LCD 数据口
BUSY_DATA,//读 LCD 状态输出
write
);
endmodule
测频模块 fre_meter
module fre_meter(clk,rst_n,fre_in,fre_out
);
input clk,rst_n,fre_in; //rst_n 为异步复位信号,fre_in 为被测输入信号
output [19:0] fre_out;
reg [19:0] fre_out; // 被测频率输出值,由最高 1MHz,二进制达 20bit 宽
reg [30:0] count1,count2; //两个计数器,count1 为分频计数器,count2 为频率值计数器,
将频率值传给 fre_out
reg clk_1hz,enb; //enb 为使能端
wire lob,clr; //lob 为使能端处的反转载入信号,clr 为清零信号
////////////////////////////////////////////////进行分频
always @ ( posedge clk or negedge rst_n )
begin
if( !rst_n ) //如果进行复位(处于低电平),进行 if 条件栏
begin
count1<=0;
clk_1hz<=0;
end
else
begin
if ( count1<25000000-1 ) //将 50MHz 的失踪进行分频,得到一个 2Hz 占空比 1:1 的方
波
begin
count1 <= count1 + 1 ; //分频器的计数器加一,
clk_1hz <= 1;
end
else if ( count1 <50000000-1 )
begin
count1 <= count1 + 1;
clk_1hz <= 0;
end
else
begin
count1 <= 0;
clk_1hz <=0;
end
end
end
////////////////////////////////////////检测脉冲宽度
/*always @ ( posedge clk or negedge rst_n)
begin
if(!rst_n)
count3<=0;
else begin
if(clk_in)
count3<=count3+1;
end
end
assign clk_1=~clk_in;
always @ (posedge clk_1 or negedge rst_n)
begin
if(!rst_n)
pulse_width<=0;
else begin
pulse_width<=count3; //单位 us, clk 周期为 20ns
count3<=0;
end
end*/
//////////////////////////////////////////////////测量频率值
always @ ( posedge clk_1hz or negedge rst_n ) //negedge 为下降沿
begin
if ( !rst_n)
enb <=0; //使能端处于低电平
else
begin
enb<=~enb; //使能端取反,为载入信号做准备
end
end
assign load = ~enb ; //进行相应的逻辑运算
assign clr=load&&(~clk_1hz) ;
always @ ( posedge fre_in or posedge clr )
begin
if ( clr) //进行清零操作
count2 <= 0;
else
begin
if ( enb )
count2 <= count2 + 1; //计数器加 1,直至加到所测的频率值为止
else
count2 <= count2;
end
end
always @ ( posedge load or negedge rst_n)
begin
if(!rst_n)
begin
fre_out<=0;
end
else
fre_out <= count2/2 ; //将计数器中的频率值传送给 fre_out
end
endmodule
进制转换模块 bin_dec
module bin_dec(clk,rst,hex,million,hunthousand,tenthousand,thousand,hundred,ten,one
); //hex 为 20bit 的二进制频率值,rst 为异步复位信号
input clk;
input rst;
input [19:0] hex;
output reg [3:0] million; //百万位
reg [19:0] d5;
output reg [3:0] hunthousand; //十万位
reg [19:0] d6;
output reg [3:0] tenthousand; //万位
reg [19:0] d1;
output reg [3:0] thousand; //千位
reg [16:0] d2;
output reg [3:0] hundred; //百位
reg [16:0] d3;
output reg [3:0] ten; //十位
reg [3:0] d4;
output reg [3:0] one;
initial begin
million=4'h0;
d5=20'h00000;
hunthousand=4'h0;
d6=20'h00000;
tenthousand=4'h0;
d1=20'h00000;
thousand=4'h0;
d2=16'h0000;
hundred=4'h0;
d3=16'h0000; //频率测量值最低为 100Hz
d4=4'h0;
剩余28页未读,继续阅读
qq_38148455
- 粉丝: 1
- 资源: 21
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0