EDA课程设计实验报告.docx

上传人:b****2 文档编号:22861809 上传时间:2023-04-28 格式:DOCX 页数:23 大小:167.24KB
下载 相关 举报
EDA课程设计实验报告.docx_第1页
第1页 / 共23页
EDA课程设计实验报告.docx_第2页
第2页 / 共23页
EDA课程设计实验报告.docx_第3页
第3页 / 共23页
EDA课程设计实验报告.docx_第4页
第4页 / 共23页
EDA课程设计实验报告.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

EDA课程设计实验报告.docx

《EDA课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《EDA课程设计实验报告.docx(23页珍藏版)》请在冰豆网上搜索。

EDA课程设计实验报告.docx

EDA课程设计实验报告

***********大学

课程设计报告

设计名称:

3位数字频率设计

姓名:

学号:

专业班级:

08级电子信息工程专业二班

院(系):

计算机与信息工程学院

设计时间:

2011年1月4日至10日

设计地点:

电子信息楼4楼

指导教师评语:

成绩:

 

签名:

年月日

目录

题目:

3位数字频率计1页

一、数字频率计的功能……………………………………………………1页

二、数字频率计的设计思路………………………………………………1页

三、硬件资源概述…………………………………………………………1~5页

四、各模块的VHDL语言描述与实现……………………………………5~13页

五、仿真模拟图……………………………………………………………13~15页

六、软件硬件结合实现……………………………………………… 15~17页

六、仿真及调试心得………………………………………………………… 17页

七、总结……………………………………………………………………  17页

 

3位数字频率计设计

 

1、数字频率计的功能

我设计的是3位数字频率计,用3个十进制数字显示式频率,其频率范围为1MHz。

有五个档位,并能自动换档。

五个档的具体功能是:

1、计数溢出档,当频率计数超过量程时,自动显示溢出标--"-1.-1.-1";

2、1MHz档,显示000到999,默认单位为1KHz;

3、100KHz档,显示00.0到99.9,默认单位为1KHz;

4、10KHz档,显示0.00到9.99,默认单位为1KHz;

5、测周档,当所测频率小于0.99KHz时,显示数值变为周期,以毫秒为默认单位。

2、数字频率计的设计思路

1、时基的设计

在测频时,输入信号的频率大于频率计提供的基准频率,所以这时以频率计提供的基准频率信号为时基,输入信号为时钟信号,在频率计提供的基准信号周期里,计算输入信号的周期数,再乘以频率计的基准频率,就是输入信号的频率值。

测周时,输入信号的频率小于频率计提供的基准频率信号,所以要以频率计提供的基准频率信号为时钟信号,以输入信号为时基信号,在输入信号周期内,计算频率计提供的基准信号的周期数,再乘以基准频率的周期值,就是输入信号的周期值。

输入信号是未知的,所以要求其自动调档,当测频为10KHz档时,提供时基应该是0.01KHz的脉冲。

当测频为100KHz档时,提供的时基为0.1KHz的脉冲。

当测频为1MKHz时,提供的时基为1KHz。

用一分频器对50MHz的晶振进行分频得到1KHz的脉冲。

然后用一个有100个状态状态机实现持续1ms、10ms、100ms的高电平即不同档位的闸门信号,状态机用1KHz的脉冲信号触发,产生1ms的高电平,只需在状态99的时候产生高电平,状态100时回到高电平;产生10ms的高电平,只需在状态90的时候产生高电平,在状态100的时候回到低电平。

产生100ms的高电平,则需在状态为1前的一个状态产生高电平,直到状态100的时候回到低电平。

在100个状态中,有很多状态的功能是相同的,可以将它们合并。

2、计数器的设计

各个档位之间的转换应遵循设计要求,要根据在时基有效时间内的计数值进行判断。

计数器可以定义成一个整形信号,这样计数器加1就非常方便,要显示计数的数值,直接用三位数码管动态扫描实现显示个位、十位、百位。

这样显示就要求计数器遵循加法逢十进一的规则。

然后在不同的档位,小数点的位置不同,所以小数点的显示要以所在档位为判断条件。

3、模块划分

可以将计数器跟七段译码器设计成单独的模块,这样更省资源,利用率更高。

3、硬件资源概述

A、EP1C12核心板

EP1C12核心板为基于AlteraCyclone器件的嵌入式系统开发提供了一个很好的硬件台,

它可以为开发人员提供以下资源:

1、主芯片采用AlteraCyclone器件EP1C12F324C8

2、EPCS4I8配置芯片

3、4个用户自定义按键

4、4个用户自定义LED

5、1个七段码LED

6、标准AS编程接口和JTAG调试接口

7、50MHz高精度时钟源

8、三个高密度扩展接口

9、系统上电复位电路

10、支持+5V直接输入,板上电源管理模块

系统主芯片采用324引脚、BGA封装的E1C12FPGA,它拥有12060个LE,52个M4K

片上RAM(共计239616bits),2个高性能PLL以及多达249个用户自定义IO。

B、FPGA开发板

FPGA开发平台提供了丰富的资源供学生或开发人员学习使用,资源包括接口通信、控制、存储、数据转换以及人机交互显示等几大模块,接口通信模块包括SPI接口、IIC接口、VGA接口、RS232接口、USB接口、PS2键盘/鼠标接口、1-Wire接口等;存储模块包括EEPROM存储器模块等;数据转换模块包括串行ADC、DAC以及音频CODE等;人机交互显示模块包括8个按键、16个LED发光二极管显示、1602字符型点阵LCD、8位动态7段码管、实时时钟、SD卡等。

上述的这些资源模块既可以满足初学者入门的要求,也可以满足开发人员进行二次开发的要求。

EDA/SOPC实验开发平台提供的资源有:

1、标准配置核心板为EP1C12核心板(核心芯片为EP1C12F324C8)。

可更换EP2C20F484C8等其它核心板。

2、1602字符型液晶点阵。

3、RTC,提供系统实时时钟。

4、1个256色VGA接口。

5、1个标准串行接口。

6、1个USB设备接口,利用PDIUSBD12芯片实现USB协议转换。

7、基于SPI或IIC接口的音频CODEC模块。

8、1个蜂鸣器输出模块。

9、2个PS2键盘/鼠标接口。

10、串行ADC和串行DAC模块。

11、IIC接口的EEPROM存储器模块。

12、基于1-Wire接口的数字温度传感器。

13、8位动态七段码管LED显示。

14、16个用户自定义LED显示,8个用户自定义按键输出。

15、一个SD卡接口模块。

16、扩展接口,供用户高速稳定的自由扩展。

开发板的系统平台功能图如下:

图1-2FPGA系统平台功能框图

 

EP1C12与开发平台硬件资源I/O接口对照表

信号名称

EP1C12IO接脚

信号名称

EP1C12IO接脚

FPGA开发板

液晶显示模块

RS

E3

D3

R1

RW

D4

D4

M6

E

D3

D5

L6

D0

F5

D6

N7

D1

P3

D7

N6

D2

E5

FPGA开发板

16位LED灯显示模块

D1

L14

D9

T7

D2

M14

D10

P7

D3

N14

D11

T6

D4

N13

D12

P6

D5

P12

D13

T5

D6

N12

D14

R6

D7

P10

D15

N5

D8

P9

D16

R5

FPGA开发板

八位七段数码管显示模块

A

N4

G

K5

B

G4

DP

H3

C

H4

SEL0

M4

D

L5

SEL1

F3

E

L4

SEL2

F4

F

K4

FPGA开发板

8位按键开关模块

S1

R16

S5

N16

S2

P14

S6

N15

S3

P16

S7

M16

S4

P15

S8

M15

EDA/SOPC开发平台

RTC实时时钟模块

SCLK

E14

RET

F16

IO

G14

EDA/SOPC开发平台

数字温度传感器模块

CLK/DAT

T4

4、各模块的VHDL语言描述及实现

1、计数器模块

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entityfrequencyis

port(treset:

instd_logic;

tclk:

instd_logic;

tsig:

instd_logic;

tkeep1:

outstd_logic_vector(3downto0);

tkeep2:

outstd_logic_vector(3downto0);

tkeep3:

outstd_logic_vector(3downto0));

endentityfrequency;

architectureoneoffrequencyis

signaltcou1:

std_logic_vector(3downto0);

signaltcou2:

std_logic_vector(3downto0);

signaltcou3:

std_logic_vector(3downto0);

begin

ctrcou:

process(treset,tclk)

begin

iftreset='0'then

tcou1<="0000";tcou2<="0000";tcou3<="0000";

else

iftclk'eventandtclk='1'then

iftsig='1'then

iftcou3="1010"then

tcou3<="1010";

else

iftcou1="1001"andtcou2="1001"andtcou3="1001"then

tcou1<="0000";tcou2<="0000";tcou3<="1010";

elsiftcou1="1001"andtcou2="1001"then

tcou1<="0000";tcou2<="0000";tcou3<=tcou3+1;

elsiftcou1="1001"then

tcou1<="0000";tcou2<=tcou2+1;

elsetcou1<=tcou1+1;

endif;

endif;

else

tcou1<="0000";tcou2<="0000";tcou3<="0000";

endif;

endif;

endif;

endprocessctrcou;

oputctr:

process(treset,tsig)

begin

iftreset='0'then

tkeep1<="0000";tkeep2<="0000";tkeep3<="0000";

else

iftsig'eventandtsig='0'then

tkeep1<=tcou1;

tkeep2<=tcou2;

tkeep3<=tcou3;

endif;

endif;

endprocessoputctr;

endone;

2、7段译码器模块

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entitydisplay1is

port(data_in:

instd_logic_vector(3downto0);

clk1k:

instd_logic;

del:

outstd_logic_vector(1downto0);

data_out:

outstd_logic_vector(6downto0));

endentitydisplay1;

architectureoneofdisplay1is

signalindata:

std_logic_vector(3downto0);

begin

process(clk1K)--数码管动态扫描

variabledount:

std_logic_vector(1downto0);

begin

ifclk1k'eventandclk1k='1'then--检测时钟上升沿

ifdount="10"thendount:

="00";

else

dount:

=dount+1;--计数器dount累加

endif;

endif;

del<=dount;

endprocess;

process(data_in)

begin

indata<=data_in;

caseindatais

when"0000"=>data_out<="1111110";

when"0001"=>data_out<="0110000";

when"0010"=>data_out<="1101101";

when"0011"=>data_out<="1111001";

when"0100"=>data_out<="0110011";

when"0101"=>data_out<="1011011";

when"0110"=>data_out<="1011111";

when"0111"=>data_out<="1110000";

when"1000"=>data_out<="1111111";

when"1001"=>data_out<="1111011";

whenothers=>data_out<="0110001";

endcase;

endprocess;

endone;

3、频率计综合设计

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entitydfreis

port(reset:

instd_logic;

clk:

instd_logic;

--testsignal:

instd_logic;

display:

outstd_logic_vector(6downto0);

del1:

outstd_logic_vector(1downto0);

unit:

outstd_logic;

d:

outstd_logic);

endentitydfre;

architectureoneofdfreis

typestateis

(start,judge,count1,count2to89,count90,count91to98,count99,count100);

signalmyfre:

state;

signalfrecou:

integerrange0to100;

signalclklk:

std_logic;

signalclkl0k:

std_logic;

signalcoulk:

integerrange0to9999;

signalenfre:

std_logic;

signalflag:

std_logic_vector(2downto0);

signalkeepcou1:

std_logic_vector(3downto0);

signalkeepcou2:

std_logic_vector(3downto0);

signalkeepcou3:

std_logic_vector(3downto0);

signalttclk:

std_logic;

signalttsig:

std_logic;

signals:

std_logic_vector(1downto0);

signaljishu:

std_logic_vector(3downto0);

signaldot:

std_logic_vector(2downto0);

signaltestsignal:

std_logic;

componentdisplay1is

port(data_in:

instd_logic_vector(3downto0);

clk1k:

instd_logic;

del:

outstd_logic_vector(1downto0);

data_out:

outstd_logic_vector(6downto0));

endcomponent;

componentfrequencyis

port(treset:

instd_logic;

tclk,tsig:

instd_logic;

tkeep1:

outstd_logic_vector(3downto0);

tkeep2:

outstd_logic_vector(3downto0);

tkeep3:

outstd_logic_vector(3downto0));

endcomponent;

begin

PROCESS(clk)--产生1Khz信号

variablecnt1:

INTEGERRANGE0TO49999;

BEGIN

IFclk='1'ANDclk'eventTHEN

IFcnt1=49999THENcnt1:

=0;

ELSE

IFcnt1<25000THENclklk<='1';

ELSEclklk<='0';

ENDIF;

cnt1:

=cnt1+1;

ENDIF;

ENDIF;

endprocess;

PROCESS(clk)--产生被测信号

variablecnt10:

INTEGERRANGE0TO3999999;

BEGIN

IFclk='1'ANDclk'eventTHEN

IFcnt10=3999999THENcnt10:

=0;

ELSE

IFcnt10<2000000THENclkl0k<='1';

ELSEclkl0k<='0';

ENDIF;

cnt10:

=cnt10+1;

ENDIF;

ENDIF;

testsignal<=clkl0k;

endprocess;

ctrdot:

process(flag)--控制小数点显示进程

begin

caseflagis

when"000"=>dot<="000";

when"001"=>dot<="100";

when"010"=>dot<="010";

when"011"=>dot<="001";

whenothers=>dot<="111";

endcase;

endprocessctrdot;

ctrfre:

process(reset,clklk)--用于产生时基的状态机

begin

ifreset='0'then

frecou<=0;enfre<='0';flag<="000";myfre<=start;

else

ifclklk'eventandclklk='1'then

casemyfreis

whenstart=>frecou<=0;enfre<='0';flag<="011";myfre<=judge;

whenjudge=>

ifflag="000"then--标志位0

ifkeepcou3="0000"andkeepcou2="0000"andkeepcou1="0000"then

flag<="001";enfre<='1';

elseflag<="000";

endif;

elsifflag="100"then--标志为4

ifkeepcou3="1010"then

flag<="100";

elseflag<="011";

endif;

elsifflag="010"then--标志为2

ifkeepcou3<"0001"then

flag<=flag-1;

enfre<='1';

elsifkeepcou3="1010"then

flag<=flag+1;

elseflag<=flag;

endif;

elsifflag="001"then--标志为1

ifkeepcou3<"0001"then

flag<=flag-1;

elsifkeepcou3="1010"then

flag<=flag+1;

elseflag<=flag;

enfre<='1';

endif;

else--标志为3

ifkeepcou3<"0001"then

flag<=flag-1;

elsifkeepcou3="1010"then

flag<=flag+1;

elseflag<=flag;

endif;

endif;

myfre<=count1;

whencount1=>--处于计数状态1

ifflag="001"orflag="000"then

enfre<='1';

elseenfre<=enfre;

endif;

frecou<=1;

myfre<=count2to89;

whencount2to89=>--处于计数状态2-89

iffrecou=88then

frecou<=89;

myfre<=count90;

elsefrecou<=frecou+1;

myfre<=count2to89;

endif;

whencount90=>--处于计数状态90

ifflag="010"then

enfre<='1';

elseenfre<=enfre;

endif;

frecou<=90;

myfre<=count91to98;

whencount91to98=>--处于计数状态91-98

iffrecou=97then

frecou<=98;

myfre<=count99;

elsefrecou<=frecou+1;

myfr

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

当前位置:首页 > 求职职场 > 笔试

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

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