版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、摘要介绍了一种运用FPGA开发软件Quartus 设计的数字频率计。使用Verilog HDL硬件描述语言编程,该数字频率计能够准确的测量1 H z 3MH z脉冲信号, 测量误差小。关键词: 数字频率计 fpga Verilog HDL引言频率测量是电子测量领域里的一项重要内容,而高精度频率计的应用尤为广泛。目前,宽范围、高精度数字式频率计的设计方法大都采用单片机加高速、专用计数器芯片来实现。本文设计的高精度频率计除了对被测信号的整形部分、键输入和最后的数码显示部分必须用硬件实现以外,其余全部采用Verilog HDL编程设计,并下载在一片FPGA(Field Programmable Ga
2、tes Array现场可编程门阵列)芯片上,整个系统非常精简,并能够达到同样的技术指标。根据不同的需要还可以重新编程下载,进行升级。FPGA器件作为系统控制的核心,其灵活的现场可更改性,可再配置能力,对系统的各种改进非常方便,在不更改硬件电路的基础上还可以进一步提高系统的性能。具有高速、精确、可靠、抗干扰性强和现场可编程等优点。设计原理本文设计了一个数字频率计的模型,其接口信号如图(一) 所示。50M时钟分频测量控制电 路计数器寄存器液晶LCD12864显 示驱动液晶模块待测信号 图(一)数字频率计模型方框图数字频率计设计框图如图1 所示, 主要由分频器、测量频率控制电路、十进制计数器、寄存器
3、、液晶驱动等六个模块组成。当系统正常工作时,系统时钟经分频得到的IHZ : 标准方波信号, 作为频率测量控制电路的输人信号,用1S 的时间使能计数器计数,将结果保存到锁存器, 就可以保证输出显示稳定。将计数值转换为ASCII码, 采用LCD12864显示待测信号的频率。设计内容一)源程序1分频计数模块本模块主要是把50M的信号分频为1hz和1/1.2khz。分频计数的模块的功能结构框图如图1-1所示。图1-1 计算里程和车费模块的功能结构框图根据模块实现的功能设计Verilog HDL源代码如下:module jishu( clk,rst, clk_1s,clk_1ms2);input clk
4、,rst;output clk_1s,clk_1ms2;reg clk_1ms2;reg clk_1s;reg25:0count_1s;reg14:0count_1ms2;/parameter cen_1ms2=30000;/parameter cen_1s=50000000;always(posedge clk or negedge rst) begin if(!rst) count_1s=0; else begin if(count_1s=50000000) begin count_1s=0; clk_1s=clk_1s; end else count_1s=count_1s+1b1; e
5、nd endalways(posedge clk or negedge rst) begin if(!rst) count_1ms2=0; else begin if( count_1ms2=30000) begin count_1ms2=0; clk_1ms2= clk_1ms2; end else count_1ms2= count_1ms2+1b1; end endendmodule该模块定义输入输出端口如下: clk:全局时钟信号,这里为50MHz的时钟。 rst:外部复位信号。 clk_1s: 由50MHZ的信号分频得到。 clk_1ms2:由50MHZ的信号分频得到。 在Alter
6、a公司的软件工具Quartus (Windows XP环境下)中编译和波形仿真后得到的波形如图2-2所示:图2-2 待测信号输入计数的仿真波形2待测信号输入计数模块本模块主要是将待测信号输入,然后对待测信号进行计数。待测信号输入计数模块的功能结构框图如图2-1所示:图2-1待测信号输入计数模块的功能结构框图根据模块实现的功能设计Verilog HDL源代码如下:module fm_jishu(clk_1s,rst,fm_in,fm_count); input fm_in,clk_1s,rst; output26:0 fm_count; reg26:0 fm_count; reg26:0 cou
7、nt; always(posedge fm_in or negedge rst) begin if(!rst) count=0; else if(!clk_1s)count=0; else begin count=count+1b1; end end always(negedge clk_1s or negedge rst) begin if(!rst) fm_count=0; else fm_count=count; end endmodule 该程序定义输入输出端口如下: clk_1s:分频得到的输入信号1HZ。 fm_in:待测输入信号。 fm_count:输入信号的计数。 rst:外部
8、复位信号。 在Altera公司的软件工具Quartus (Windows XP环境下)中编译和波形仿真后得到的波形如图2-2所示:图2-2 待测信号输入计数的仿真波形3液晶显示模块本模块为动态显示,时间间隔为秒。动态显示模块的功能结构框图如图3-1所示。图3-1动态显示模块的功能结构图根据模块实现的功能设计Verilog HDL源代码如下:module LCD_12864( input clk_1ms2, /1.2ms时钟 input26:0 data, /数据输入 input rst_n, /复位 output reg7:0 LCD_data,/LCD12864的数据线 output reg
9、 LCD_RS, /LCD12864的寄存器选择: H:数据寄存器 L:指令寄存器 output LCD_RW, /LCD12864的读写信号线: H:读 L:写 output LCD_EN, /LCD12864的使能端:下降沿触发,锁存数据 output LCD_PSB,/LCD12864串/并选择H:并行L:串行 output LCD_RST /LCD12864复位端:低电平有效 );/+/ LCD12864驱动部分 开始 /+ parameter init = 3d0, /初始化 写指令 write_data_1 =3d1, /第一行 写数据 write_data_2 =3d2, /第二
10、行 写数据 write_data_3 =3d3, /第三行 写数据 write_data_4 =3d4; /第四行 写数据 reg2:0 state; /状态码 reg4:0 counter; /计数 assign LCD_EN =clk_1ms2; /LCD12864的使能端:下降沿触发,锁存数据assign LCD_PSB = 1b1; /LCD12864串/并选择:H:并行 L:串行 assign LCD_RST = 1b1; /LCD12864复位端:低电平有效assign LCD_RW = 1b0; /没有读操作,R/W信号始终为低电平 always (posedge clk_1ms
11、2 or negedge rst_n) begin if(!rst_n) begin counter =0; /计数清零 state = init; /复位回到init码 end else begin case(state) init:begin /LCD12864初始化 写数据 LCD_RS = 0; counter = counter+4d1; case(counter) 1: LCD_data = 8h30;/0 x30:基本指令 2: LCD_data = 8h02;/0 x02:地址归位 3: LCD_data = 8h01;/0 x01:清屏 4: LCD_data = 8h06;
12、/0 x06:光标右移 5: LCD_data = 8h0c;/0 x0c: 6: begin LCD_data = 8h80; state = write_data_1;/转移到写第一行数据counter = 0; end default: counter = 0; endcase end write_data_1:begin /LCD12864写第一行数据 LCD_RS = 1; case(counter) 0: LCD_data = ; /空格 1: LCD_data = ; /空格 2: LCD_data = 8hD3; 3: LCD_data = 8hF1; 4: LCD_data
13、= 8hC1; 5: LCD_data = 8hD6; 6: LCD_data = 8hCA; 7: LCD_data = 8hA6; 8: LCD_data = 8hB7; 9: LCD_data = 8hB6; 10: LCD_data = 8hD1; 11: LCD_data = 8hA7; 12: LCD_data = 8hD4; 13: LCD_data = 8hBA; 14: LCD_data = ; 15: LCD_data = ; 16: beginLCD_RS = 0;LCD_data = 8h90; end default: counter = 0; endcase if(
14、counter = 16) begin counter = 0;state = write_data_2; end else counter = counter+4d1; endwrite_data_2:begin /LCD12864写第二行数据 LCD_RS = 1; case(counter) 0: LCD_data = 8hB4; 1: LCD_data = 8hB4; 2: LCD_data = 8hD0; 3: LCD_data = 8hC2; 4: LCD_data = 8hBB; 5: LCD_data = 8hF9; 6: LCD_data = 8hB5; 7: LCD_dat
15、a = 8hD8; 8: LCD_data =-; / 9: LCD_data =-; 10: LCD_data = F; /F 11: LCD_data = P; /P 12: LCD_data = G; /G 13: LCD_data = A; /A 14: LCD_data = !; /! 15: LCD_data = !; /! 16: beginLCD_RS = 0;LCD_data = 8h88;/写第三行数据 end default: counter = 0; endcase if(counter = 16) begin counter = 0;state = write_dat
16、a_3;/转移到写第三行数据 end else counter = counter+4d1; endwrite_data_3:begin /LCD12864写第三行数据 LCD_RS = 1; case(counter)0: LCD_data = F; 1: LCD_data = r;2: LCD_data = e; 3: LCD_data = =;4: LCD_data = 8h30+data/10000000;5: LCD_data = 8h30+data/1000000%10; 6: LCD_data = ,; 7: LCD_data = 8h30+data/100000%10; 8:
17、LCD_data = 8h30+data/10000%10;9: LCD_data = 8h30+data/1000%10; 10: LCD_data = ,;11: LCD_data = 8h30+data/100%10;12: LCD_data = 8h30+data/10%10;13: LCD_data = 8h30+data%10;14: LCD_data = H;15: LCD_data = Z; 16: beginLCD_RS = 0;LCD_data = 8h98;/写第四行数据 end default: counter = 0; endcase if(counter = 16)
18、 begin counter = 0;state = write_data_4;/转移到写第四行数据 end else counter = counter+4d1; end write_data_4:begin /LCD12864写第四行数据 LCD_RS = 1; case(counter) 0: LCD_data = -; 1: LCD_data = -; 2: LCD_data = -; 3: LCD_data = -; 4: LCD_data = 8hC6;/频 5: LCD_data = 8hB5; 6: LCD_data = 8hC2;/率 7: LCD_data = 8hCA;
19、8: LCD_data = 8hBC;/计 9: LCD_data = 8hC6; 10: LCD_data = -; 11: LCD_data = -; 12: LCD_data = 8hD6; 13: LCD_data = 8hA3; 14: LCD_data = 8hD3; 15: LCD_data = 8hC2; 16: beginLCD_RS = 0;LCD_data = 8h80;/写第一行数据 end default: counter = 0; endcase if(counter = 16) begin counter = 0;state = write_data_1;/转移到
20、写第一行数据 end else counter = counter+4d1; end default:state = init;/默认回到init码 endcase end end endmodule该模块定义输入输出端口如下: clk_1ms2: 分频得到的信号,这里为1/1.2MHZ的时钟 data: 数据输入 rst_n: 复位 LCD_data: LCD12864的数据线 LCD_RS: LCD12864的寄存器选择:H:数据寄存器 L:指令寄存器 LCD_RW: LCD12864的读写信号线 LCD_EN: LCD12864的使能 LCD_PSB: LCD12864串/并选择 LCD
21、_RST : LCD12864复位端4设计数字频率计电路Verilog HDL具有行为描述和结构描述功能。行为描述是对设计电路的逻辑功能的描述,并不用关心设计电路使用哪些元件及这些元件之间的连接关系。而结构描述是对设计电路的结构进行描述,即描述设计电路使用的元件及这些元件之间的连接关系。本文用行为描述和结构描述分别实现电路系统。生成的jishu、fm_jishu1和LCD_12864元件图形符号只是分别代表分立的电路设计结果,并没有形成系统。顶层设计文件就是调用jishu、fm_jishu和LCD_12864三个功能元件,将它们组装起来,成为一个完整的设计。plj.bdf是本例的顶层文件,实现的功能是将检测出的频率显示出来如图4-1所示。图4-1plj顶层设计图二)硬件实现1引脚锁定对数字频率计进行实验验证时,需要确定用开发板的哪些输入/输出端口(PI/O)来表示设计电路的输入输出。根据Cyclone II EP2C8Q208C8N开发板的管脚。数字频率计与EP2C8Q208C8N中的目标芯片引脚连接的全部关系见表1-1。表1-1频率计与目标芯
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 改进工作方式提案3篇
- 政府项目采购合同方3篇
- 文化传承责任状3篇
- 新版个人银行借款合同3篇
- 地铁站绿化施工合同协议书
- 汽车零部件仓储租赁协议
- 企业旅游贷款还款协议
- 药品生产厂供配电工程合同
- 城市绿化带级配碎石施工协议
- 垃圾处理场防水工程承包协议
- 酒店前台消防安全培训
- 2021-2022学年河北省唐山市高一上学期期末语文试题
- 【期末复习提升卷】浙教版2022-2023学年八年级上学期数学期末压轴题综合训练试卷1(解析版)
- 山东省临沂市费县2023-2024学年八年级上学期1月期末生物试题
- PDCA血液透析水循环案例汇报
- 岩石钻机施工方案
- 山东省烟台市2023-2024学年七年级上学期期末数学试题(含答案)
- 光明乳业财务报表分析报告
- 2024年贵州省铜仁市四年级数学第一学期期末教学质量检测模拟试题含解析
- 2024年贵阳市小河区四上数学期末教学质量检测模拟试题含解析
- 北京社区食堂招商方案
评论
0/150
提交评论