基于FPGA的数字频率计Word格式文档下载.docx

上传人:b****5 文档编号:17281175 上传时间:2022-11-30 格式:DOCX 页数:14 大小:63.03KB
下载 相关 举报
基于FPGA的数字频率计Word格式文档下载.docx_第1页
第1页 / 共14页
基于FPGA的数字频率计Word格式文档下载.docx_第2页
第2页 / 共14页
基于FPGA的数字频率计Word格式文档下载.docx_第3页
第3页 / 共14页
基于FPGA的数字频率计Word格式文档下载.docx_第4页
第4页 / 共14页
基于FPGA的数字频率计Word格式文档下载.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

基于FPGA的数字频率计Word格式文档下载.docx

《基于FPGA的数字频率计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于FPGA的数字频率计Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。

基于FPGA的数字频率计Word格式文档下载.docx

本模块主要是把50M的信号分频为1hz和1/1.2khz。

分频计数的模块的功能结构框图如图1-1所示。

图1-1计算里程和车费模块的功能结构框图

根据模块实现的功能设计VerilogHDL源代码如下:

modulejishu(

clk,rst,

clk_1s,clk_1ms2

);

inputclk,rst;

outputclk_1s,clk_1ms2;

regclk_1ms2;

regclk_1s;

reg[25:

0]count_1s;

reg[14:

0]count_1ms2;

//parametercen_1ms2=30000;

//parametercen_1s=50000000;

always@(posedgeclkornegedgerst)

begin

if(!

rst)count_1s<

=0;

elsebegin

if(count_1s==50000000)

count_1s<

clk_1s=~clk_1s;

end

elsecount_1s<

=count_1s+1'

b1;

rst)count_1ms2<

if(count_1ms2==30000)

count_1ms2<

clk_1ms2=~clk_1ms2;

elsecount_1ms2<

=count_1ms2+1'

endmodule

该模块定义输入输出端口如下:

■clk:

全局时钟信号,这里为50MHz的时钟。

■rst:

外部复位信号。

■clk_1s:

由50MHZ的信号分频得到。

■clk_1ms2:

由50MHZ的信号分频得到。

在Altera公司的软件工具QuartusⅡ(WindowsXP环境下)中编译和波形仿真后得到的波形如图2-2所示:

图2-2待测信号输入计数的仿真波形

2.待测信号输入计数模块

本模块主要是将待测信号输入,然后对待测信号进行计数。

待测信号输入计数模块的功能结构框图如图2-1所示:

图2-1待测信号输入计数模块的功能结构框图

modulefm_jishu(clk_1s,rst,fm_in,fm_count);

inputfm_in,clk_1s,rst;

output[26:

0]fm_count;

reg[26:

0]count;

always@(posedgefm_inornegedgerst)

begin

rst)count<

elseif(!

clk_1s)count<

elsebegin

count<

=count+1'

always@(negedgeclk_1sornegedgerst)

rst)fm_count<

elsefm_count<

=count;

endmodule

该程序定义输入输出端口如下:

分频得到的输入信号1HZ。

■fm_in:

待测输入信号。

■fm_count:

输入信号的计数。

外部复位信号。

3.液晶显示模块

本模块为动态显示,时间间隔为5秒。

动态显示模块的功能结构框图如图3-1所示。

图3-1动态显示模块的功能结构图

moduleLCD_12864(

inputclk_1ms2,//1.2ms时钟

input[26:

0]data,//数据输入

inputrst_n,//复位

outputreg[7:

0]LCD_data,//LCD12864的数据线

outputregLCD_RS,//LCD12864的寄存器选择:

H:

数据寄存器L:

指令寄存器

outputLCD_RW,//LCD12864的读写信号线:

读L:

outputLCD_EN,//LCD12864的使能端:

下降沿触发,锁存数据

outputLCD_PSB,//LCD12864串/并选择H:

并行L:

串行

outputLCD_RST//LCD12864复位端:

低电平有效

);

//++++++++++++++++++++++++++++++++++++++++++++++++

//LCD12864驱动部分开始

//++++++++++++++++++++++++++++++++++++++++++++++++

parameterinit=3'

d0,//初始化写指令

write_data_1=3'

d1,//第一行写数据

write_data_2=3'

d2,//第二行写数据

write_data_3=3'

d3,//第三行写数据

write_data_4=3'

d4;

//第四行写数据

reg[2:

0]state;

//状态码

reg[4:

0]counter;

//计数

assignLCD_EN=clk_1ms2;

//LCD12864的使能端:

assignLCD_PSB=1'

//LCD12864串/并选择:

H:

并行L:

assignLCD_RST=1'

//LCD12864复位端:

低电平有效

assignLCD_RW=1'

b0;

//没有读操作,R/W信号始终为低电平

always@(posedgeclk_1ms2ornegedgerst_n)

begin

if(!

rst_n)

begin

counter=0;

//计数清零

state=init;

//复位回到init码

end

elsebegin

case(state)

init:

begin//LCD12864初始化写数据

LCD_RS=0;

counter=counter+4'

d1;

case(counter)

1:

LCD_data=8'

h30;

//0x30:

基本指令

2:

h02;

//0x02:

地址归位

3:

h01;

//0x01:

清屏

4:

h06;

//0x06:

光标右移

5:

h0c;

//0x0c:

6:

LCD_data=8'

h80;

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:

2:

hD3;

3:

hF1;

4:

hC1;

5:

hD6;

6:

hCA;

7:

hA6;

8:

hB7;

9:

hB6;

10:

hD1;

11:

hA7;

12:

hD4;

13:

hBA;

14:

15:

16:

LCD_RS=0;

LCD_data=8'

h90;

end

default:

endcase

if(counter==16)

begin

state=write_data_2;

end

elsecounter=counter+4'

end

write_data_2:

begin//LCD12864写第二行数据

case(counter)

hB4;

2:

hD0;

hC2;

hBB;

hF9;

hB5;

hD8;

LCD_data="

-"

//

F"

//"

P"

G"

A"

!

"

h88;

//写第三行数据

state=write_data_3;

//转移到写第三行数据

write_data_3:

begin//LCD12864写第三行数据

0:

1:

r"

2:

e"

3:

="

4:

h30+data/10000000;

5:

h30+data/1000000%10;

6:

"

7:

h30+data/100000%10;

8:

h30+data/10000%10;

9:

h30+data/1000%10;

10:

11:

h30+data/100%10;

12:

h30+data/10%10;

13:

h30+data%10;

14:

H"

15:

Z"

16:

LCD_RS=0;

LCD_data=8'

h98;

//写第四行数据

state=write_data_4;

//转移到写第四行数据

write_data_4:

begin//LCD12864写第四行数据

hC6;

//频

//率

hBC;

//计

hA3;

LCD_data=8'

//写第一行数据

state=write_data_1;

default:

state=init;

//默认回到init码

endcase

end

end

分频得到的信号,这里为1/1.2MHZ的时钟

■data:

数据输入

■rst_n:

复位

■LCD_data:

LCD12864的数据线

■LCD_RS:

LCD12864的寄存器选择:

指令寄存器

■LCD_RW:

LCD12864的读写信号线

■LCD_EN:

LCD12864的使能

■LCD_PSB:

LCD12864串/并选择

■LCD_RST:

LCD12864复位端

4.设计数字频率计电路

VerilogHDL具有行为描述和结构描述功能。

行为描述是对设计电路的逻辑功能的描述,并不用关心设计电路使用哪些元件及这些元件之间的连接关系。

而结构描述是对设计电路的结构进行描述,即描述设计电路使用的元件及这些元件之间的连接关系。

本文用行为描述和结构描述分别实现电路系统。

生成的jishu、fm_jishu1和LCD_12864元件图形符号只是分别代表分立的电路设计结果,并没有形成系统。

顶层设计文件就是调用jishu、fm_jishu和LCD_12864三个功能元件,将它们组装起来,成为一个完整的设计。

plj.bdf是本例的顶层文件,实现的功能是将检测出的频率显示出来如图4-1所示。

图4-1plj顶层设计图

二)硬件实现

1.引脚锁定

对数字频率计进行实验验证时,需要确定用开发板的哪些输入/输出端口(PI/O)来表示设计电路的输入输出。

根据CycloneIIEP2C8Q208C8N开发板的管脚。

数字频率计与EP2C8Q208C8N中的目标芯片引脚连接的全部关系见表1-1。

表1-1频率计与目标芯片引脚连接关系表

2:

测试数据:

待测频率值/(khz)

测试频率值/(khz)

误差/(%)

0.520

50.000

49.999

0.002

200.010

200.010

400.000

400.010

0.025

600.000

600.000

0

1000.001

1000.000

0.0001

1500.000

1500.015

0.001

2000.000

2000.004

0.0002

2500.000

2500.050

结论

该频率计利用QuartusⅡ软件工作平台进行编译和综合仿真后,将程序下载到一片FPGA芯片中,经实验验证,该频率计达到了设计要求。

所设计的数字频率计由于采用VerilogHDL语言设计,用一片FPGA实现,因而体积小、功耗低,稍加修改就可以改变数字频率计测量范围,拥有较高的整体性能和可靠性,升级和维护都很方便,而且容易生产,造价比较低,具有较好的市场前景。

参考文献

1黄任.AVR单片机与CPLD/FPGA综合应用入门[M].北京:

京航空航天大学出版社,2004.

1王振红.VHDL数字电路设计与应用实践教程.北京:

机械工业出版社,2003年6月.

2江国强.EDA技术与与应用(第2版).北京:

电子工业出版社,2007年4月.

3王钿卓兴旺.基于VerilogHDL的数字系统应用设计.北京:

国防工业出版社,2006年1月.

4延明张亦华.数字电路EDA技术入门.北京:

北京邮电大学出版社,2006年1月.

5王钿卓兴旺盛.基于VerilogHDL的数字系统应用设计.北京:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1