第一篇:電子科技大學(xué)微機(jī)實(shí)驗(yàn)報(bào)告 實(shí)驗(yàn)4
實(shí)驗(yàn)四基于ARM的嵌入式Linux開發(fā)環(huán)境建立 【實(shí)驗(yàn)?zāi)康摹?1.掌握嵌入式Linux 開發(fā)環(huán)境的基本流程。2.熟悉Linux 操作系統(tǒng) 3.熟悉嵌入式開發(fā)平臺(tái)
【實(shí)驗(yàn)內(nèi)容】
在PC機(jī)虛擬機(jī)下的Linux系統(tǒng)中建立基于ARM 的嵌入式Linux 開發(fā)環(huán)境。
1.學(xué)會(huì)網(wǎng)口的配置 2.Minicom端口的使用
【預(yù)備知識(shí)】
1.了解ARM9處理器結(jié)構(gòu) 2.了解Linux 系統(tǒng)結(jié)構(gòu)
3.了解ARM開發(fā)板使用常識(shí)
【實(shí)驗(yàn)設(shè)備和工具】
硬件:PC機(jī)Pentium100以上,ARM嵌入式開發(fā)平臺(tái)
軟件:PC機(jī)Linux 操作系統(tǒng)+MINICOM+AMRLINUX開發(fā)環(huán)境
【實(shí)驗(yàn)原理】
1.交叉編譯器在一種計(jì)算機(jī)環(huán)境中運(yùn)行的編譯程序,能編譯出在另外一種環(huán)境下運(yùn)行的代碼,我們就稱這種編譯器支持交叉編譯,這個(gè)編譯過(guò)程就叫交叉編譯。簡(jiǎn)單地說(shuō),就是在一個(gè)平臺(tái)上生成另一個(gè)平臺(tái)上的可執(zhí)行代碼。這里需要注意的是所謂平臺(tái),實(shí)際上包含兩個(gè)概念:體系結(jié)構(gòu)
(Architecture)、操作系統(tǒng)(OperatingSystem)。同一個(gè)體系結(jié)構(gòu)可以運(yùn)行不同的操作系統(tǒng);同樣,同一個(gè)操作系統(tǒng)也可以在不同的體系結(jié)構(gòu)上運(yùn)行。舉例來(lái)說(shuō),我們常說(shuō)的x86 Linux平臺(tái)實(shí)際上是Intelx86體系結(jié)構(gòu)和Linuxforx86操作系統(tǒng)的統(tǒng)稱;而x86WinNT平臺(tái) 實(shí)際上是Intelx86體系結(jié)構(gòu)和Windows NTforx86操作系統(tǒng)的簡(jiǎn)稱。交叉編譯這個(gè)概念的出現(xiàn)和流行是和嵌入式系統(tǒng)的廣泛發(fā)展同步的。我們常用的計(jì)算機(jī)軟
件,都需要通過(guò)編譯的方式,把使用高級(jí)計(jì)算機(jī)語(yǔ)言編寫的代碼(比如C代碼)編譯(compile)成計(jì)算機(jī)可以識(shí)別和執(zhí)行的二進(jìn)制代碼。比如,我們?cè)赪indows平臺(tái)上,可使用Visual C++ 開發(fā)環(huán)境,編寫程序并編譯成可執(zhí)行程序。這種方式下,我們使用PC平臺(tái)上的Windows工具開發(fā)針對(duì)Windows本身的可執(zhí)行程序,這種編譯過(guò)程稱為nativecompilation,中文可理解
為本機(jī)編譯。然而,在進(jìn)行嵌入式系統(tǒng)的開發(fā)時(shí),運(yùn)行程序的目標(biāo)平臺(tái)通常具有有限的存儲(chǔ)空間和運(yùn)算能力,比如常見的ARM平臺(tái),其一般的靜態(tài)存儲(chǔ)空間大概是16到32MB,而CPU 的主頻大概在100MHz到500MHz之間。這種情況下,在ARM平臺(tái)上進(jìn)行本機(jī)編譯就不太可能了,這是因?yàn)橐话愕木幾g工具鏈(compilationtoolchain)需要很大的存儲(chǔ)空間,并需要很強(qiáng) 的CPU運(yùn)算能力。為了解決這個(gè)問(wèn)題,交叉編譯工具就應(yīng)運(yùn)而生了。通過(guò)交叉編譯工具,我們就可以在CPU能力很強(qiáng)、存儲(chǔ)空間足夠的主機(jī)平臺(tái)上(比如PC上)編譯出針對(duì)其他平臺(tái)的可執(zhí)行程序。
要進(jìn)行交叉編譯,我們需要在主機(jī)平臺(tái)上安裝對(duì)應(yīng)的交叉編譯工具鏈(crosscompilation tool-chain),然后用這個(gè)交叉編譯工具鏈編譯我們的源代碼,最終生成可在目標(biāo)平臺(tái)上運(yùn)行的代碼。常見的交叉編譯例子如下:
1、在WindowsPC上,利用RVDS(ARM開發(fā)環(huán)境),使用armcc編譯器,則可編譯出針對(duì)ARMCPU的可執(zhí)行代碼。
2、在LinuxPC上,利用arm-linux-gcc編譯器,可編譯出針對(duì)LinuxARM平臺(tái)的可執(zhí)行代碼。
3、在Windows PC上,利用cygwin環(huán)境,運(yùn)行arm-elf-gcc編譯器,可編譯出針對(duì)ARMCPU的可執(zhí)行代碼。
2.NFS服務(wù)
NFS是Net FileSystem的簡(jiǎn)寫,即網(wǎng)絡(luò)文件系統(tǒng).網(wǎng)絡(luò)文件系統(tǒng)是FreeBSD支持的文件系統(tǒng)中的一種,也被稱為NFS.NFS允許一個(gè)系統(tǒng)在網(wǎng)絡(luò)上與它人共享目錄和文件。通過(guò)使用NFS,用戶和程序可以像訪問(wèn)本地文件一樣訪問(wèn)遠(yuǎn)端系
統(tǒng)上的文件。
NFS至少有兩個(gè)主要部分:一臺(tái)服務(wù)器和一臺(tái)(或者更多)客戶機(jī)??蛻魴C(jī)遠(yuǎn)程訪問(wèn)存放在服務(wù)器上的數(shù)據(jù)。為了正常工作,一些進(jìn)程需要被配置并運(yùn)行。
在本實(shí)驗(yàn)中就是將PC機(jī)作為服務(wù)器,而將ARM開發(fā)板作為客戶機(jī),這樣ARM開發(fā)板就可以遠(yuǎn)程
訪問(wèn)存放在在PC機(jī)上的數(shù)據(jù),這樣可以縮短研發(fā)周期,更方便的調(diào)試程序。
【實(shí)驗(yàn)步驟】
1.雙擊桌面上VMWARE,打開Linux 虛擬機(jī) 2.點(diǎn)擊啟動(dòng)虛擬機(jī),啟動(dòng)虛擬機(jī) 3.以root身份登陸虛擬機(jī),密碼123456
4.其他步驟詳見實(shí)驗(yàn)指導(dǎo)書
【實(shí)驗(yàn)結(jié)果和程序】
基于ARM 的嵌入式Linux開發(fā)環(huán)境建立完畢。
【思考題】
1.如何驗(yàn)證交叉編譯器已安裝成功? 答:在終端輸入命令:cd/arm/rootfs/home/driver(文件夾里已有test_led.c文件)arm-linux-gcc–o test_ledtest_led.c
若有可執(zhí)行文件test_led生成則表示交叉編譯器已安裝成功
2.如果我們需要變更根文件系統(tǒng)的目錄,該如何設(shè)置使得ARM開發(fā)板可以成功掛載?答:修改/etc/exports 文件的內(nèi)容,將/arm/rootfs*(rw,sync,no_root_squash)改為/XX/XXX
*(rw,sync,no_root_squash)(/XX/XXX為變更后點(diǎn)的文件目錄)
3.怎么在u-boot命令行下修改ARM 開發(fā)板的IP?
答:輸入setenvip=x.x.x.x:192.168.0.1:192.168.0.1:255.255.255.0:uestc:eth0:off
Saveenv
x,x,x,x為ARM開發(fā)板的新IP。
【實(shí)驗(yàn)結(jié)論】
本實(shí)驗(yàn)實(shí)現(xiàn)了基于ARM 的嵌入式Linux 開發(fā)環(huán)境建立
第二篇:電子科技大學(xué)微機(jī)實(shí)驗(yàn)報(bào)告 實(shí)驗(yàn)5
實(shí)驗(yàn)五 基于ARM的模塊方式驅(qū)動(dòng)程序?qū)嶒?yàn) 【實(shí)驗(yàn)?zāi)康摹?1.掌握Linux 系統(tǒng)下設(shè)備驅(qū)動(dòng)程序的作用與編寫技巧 2.掌握Linux 驅(qū)動(dòng)程序模塊加載和卸載的方法 3.了解Linux 內(nèi)核中的makefile和kconfig文件
【實(shí)驗(yàn)內(nèi)容】
1.基于s3c2440 開發(fā)板編寫led 驅(qū)動(dòng)程序。2.將編寫好的led驅(qū)動(dòng)加入linux內(nèi)核中,修改makefile和kconfig文件,配置和編譯內(nèi)核。3.編寫關(guān)于led 的測(cè)試程序,交叉編譯后運(yùn)行,控制led 燈的亮滅。
【預(yù)備知識(shí)】
1.了解ARM9處理器結(jié)構(gòu)和Linux 系統(tǒng)結(jié)構(gòu)
2.熟練掌握C語(yǔ)言。
【實(shí)驗(yàn)設(shè)備和工具】
? 硬件:ARM嵌入式開發(fā)平臺(tái),PC機(jī)Pentium100 以上。
? 軟件:PC機(jī)Linux操作系統(tǒng)+MINICOM+AMRLINUX 開發(fā)環(huán)境
【實(shí)驗(yàn)原理】
?
linux設(shè)備驅(qū)動(dòng)程序 ? 驅(qū)動(dòng)的模塊式加載和卸載
? 編譯模塊
? 裝載和卸載模塊
? led 驅(qū)動(dòng)的原理
在本開發(fā)板上有八個(gè)led指示燈,從下往上分別為L(zhǎng)ED0-LED7。這八個(gè)led燈都是接的芯片上的gpio口(通用功能輸入輸出口)。在本實(shí)驗(yàn)的開發(fā)板硬件設(shè)計(jì)中,當(dāng)led 燈對(duì)應(yīng)的gpio的電平為低時(shí),led燈被點(diǎn)亮;當(dāng)led燈對(duì)應(yīng)的gpio的電平為高時(shí),led燈滅。本驅(qū)動(dòng)的作用就是通過(guò)設(shè)置對(duì)應(yīng)gpio口的電平來(lái)控制led 的亮滅。
因?yàn)锳RM 芯片內(nèi)的GPIO口都是復(fù)用的,即它可以被配置為多種不同的功能,本實(shí)
驗(yàn)是使用它的普通的I/O口的輸出功能,故需要對(duì)每個(gè)GPIO口進(jìn)行配置。在內(nèi)核中已經(jīng)定義了對(duì)GPIO口進(jìn)行配置的函數(shù),我們只需要調(diào)用這些函數(shù)就可以完成對(duì)GPIO口的配置。
【實(shí)驗(yàn)步驟】實(shí)驗(yàn)程
序運(yùn)行效果:
程序會(huì)提示:“pleaseenterthe led status”
輸入與希望顯示的led狀態(tài)對(duì)應(yīng)的ledstatus值(輸入十進(jìn)制值即可),觀察led 的顯示情況。例如:
? 輸入數(shù)字“3”,對(duì)應(yīng)的二進(jìn)制數(shù)字為00000011
故點(diǎn)亮LED2~LED7
? 輸入數(shù)字“4”,對(duì)應(yīng)的二進(jìn)制數(shù)字為00000100
故點(diǎn)亮LED0,LED1,LED3~LED7
【實(shí)驗(yàn)結(jié)果和程序】
C語(yǔ)言程序:
#include
static intLedMajor=231;
staticintLedMinor=0;
static charledstatus=0xff;staticstructclass*s3c2440_class;staticstructcdev *s3c2440_led_cdev;
/*
******************************************************************************* ************************
** Function name:Update_led()**Descriptions **Input :NONE **Output :NONE :update the led status
******************************************************************************* ************************
*/ staticvoid Update_led(void)
{
if(ledstatus&0x01)
s3c2410_gpio_setpin(S3C2410_GPC7,1);//LED0滅
else
s3c2410_gpio_setpin(S3C2410_GPC7,0);//LED0亮
if(ledstatus&0x02)
s3c2410_gpio_setpin(S3C2410_GPC5,1);//LED1滅
else
s3c2410_gpio_setpin(S3C2410_GPC5,0);//LED1亮
if(ledstatus&0x04)
s3c2410_gpio_setpin(S3C2410_GPH9,1);//LED2滅
else
s3c2410_gpio_setpin(S3C2410_GPH9,0);//LED2亮
if(ledstatus&0x08)
s3c2410_gpio_setpin(S3C2410_GPB4,1);//LED3滅
else
s3c2410_gpio_setpin(S3C2410_GPB4,0);//LED3亮
if(ledstatus&0x10)
s3c2410_gpio_setpin(S3C2410_GPG5,1);//LED4滅
else
s3c2410_gpio_setpin(S3C2410_GPG5,0);//LED4亮
if(ledstatus&0x20)
s3c2410_gpio_setpin(S3C2410_GPG6,1);//LED5滅
else
s3c2410_gpio_setpin(S3C2410_GPG6,0);//LED5亮
if(ledstatus&0x40)
s3c2410_gpio_setpin(S3C2410_GPG7,1);//LED6滅elses3c2410_gpio_setpin(S3C2410_GPG7,0);//LED6亮
if(ledstatus&0x80)
s3c2410_gpio_setpin(S3C2410_GPG8,1);//LED7滅
else
s3c2410_gpio_setpin(S3C2410_GPG8,0);//LED7亮
}
staticssize_ts3c2440_Led_write(structfile*file,constchar*buffer,size_tcount,loff_t*ppos){
copy_from_user(&ledstatus,buffer,sizeof(ledstatus));
Update_led();
printk(“write: led=0x%x,count=%dn”,ledstatus,count);returnsizeof(ledstatus);} staticints3c2440_Led_open(structinode*inode,struct file *filp)
{
printk(“l(fā)ed device openn”);
return 0;
} staticints3c2440_Led_release(structinode*inode,struct file*filp)
{
printk(“l(fā)ed device releasen”);
return 0;} staticstructfile_operationss3c2440_fops={.owner=THIS_MODULE,.open=s3c2440_Led_open,.write=s3c2440_Led_write,.release=s3c2440_Led_release, };
staticintinits3c2440_Led_init(void)
{
dev_ts3c2440_leds_devno;
/*configure the gpiofor leds*/
s3c2410_gpio_cfgpin(S3C2410_GPG5,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPG6,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPG7,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPG8,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPC7,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPC5,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPH9,S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPB4,S3C2410_GPIO_OUTPUT);
Update_led();/*registerthe devnumber*/ s3c2440_leds_devno=MKDEV(LedMajor,LedMinor);ret=register_chrdev_region(s3c2440_leds_devno, 1,DEVICE_NAME);
/*registerthe chardevice*/
s3c2440_led_cdev=cdev_alloc();if
(s3c2440_led_cdev!= NULL)
{ cdev_init(s3c2440_led_cdev, &s3c2440_fops);s3c2440_led_cdev->owner=THIS_MODULE;if(cdev_add(s3c2440_led_cdev, s3c2440_leds_devno, 1))
printk(KERN_NOTICE “Something wrong when addings3c2440_led_cdev!n”);
else
printk(“Success addings3c2440_led_cdev!n”);} /*create the device node in /dev*/ s3c2440_class =class_create(THIS_MODULE, “l(fā)ed_class”);class_device_create(s3c2440_class, NULL, s3c2440_leds_devno, NULL, DEVICE_NAME);
printk(DEVICE_NAME “ initializedn”);
return 0;
}
staticvoid exits3c2440_Led_exit(void)
cdev_del(s3c2440_led_cdev);class_device_destroy(s3c2440_class, MKDEV(LedMajor,LedMinor));class_destroy(s3c2440_class);printk(DEVICE_NAME “ removedn”);
}
module_init(s3c2440_Led_init);
module_exit(s3c2440_Led_exit);
【思考題】
1.設(shè)備驅(qū)動(dòng)程序的功能是什么?答:設(shè)備驅(qū)動(dòng)的功能就是將系統(tǒng)提供的調(diào)用映射到作用于實(shí)際硬件的和設(shè)備相關(guān)的操作上。
2.模塊化的最大優(yōu)點(diǎn)是什么?答:可以在系統(tǒng)正在運(yùn)行著的時(shí)候給內(nèi)核增加模塊
提供的功能(也可以移除功能)。
3.如果在驅(qū)動(dòng)模塊中刪除module_exit(s3c2440_Led_exit);后會(huì)有什么影響?
答:這個(gè)模塊將不能被移除。
4.驅(qū)動(dòng)代碼中調(diào)用的宏MKDEV 的作用是什么?答:獲取設(shè)備在設(shè)備表中的位置。輸入主設(shè)備號(hào),從設(shè)備號(hào),返回位置號(hào)。
【實(shí)驗(yàn)結(jié)論】
本實(shí)驗(yàn)實(shí)現(xiàn)了linux環(huán)境下的led燈驅(qū)動(dòng)的添加。
第三篇:北京科技大學(xué)微機(jī)原理實(shí)驗(yàn)報(bào)告
微機(jī)原理及應(yīng)用實(shí)驗(yàn)報(bào)告
學(xué)院: 班級(jí): 學(xué)號(hào): 姓名:
微機(jī)實(shí)驗(yàn)報(bào)告書(Ⅰ)學(xué)號(hào):姓名:班級(jí): 同組名單:實(shí)驗(yàn)日期:
實(shí)驗(yàn)題目:8253可編程定時(shí)器計(jì)數(shù)器
實(shí)驗(yàn)?zāi)繕?biāo):掌握8253的基本工作原理和編程方法 實(shí)驗(yàn)步驟:
連接電路圖
如圖虛線連接電路,將計(jì)數(shù)器0設(shè)置為方式0,計(jì)數(shù)器初值為N(N<=0FH),用手動(dòng)逐個(gè)輸入單脈沖,編程使計(jì)數(shù)值在屏幕上顯示,并同時(shí)用邏輯筆觀察OUT0電平變化(當(dāng)輸入N+1個(gè)脈沖后OUT0變高電平)。程序框圖:
程序清單:
;*************************;;* 8253方式0計(jì)數(shù)器實(shí)驗(yàn) *;;*************************;IOPORT
EQU
0C800H-0280H
IO8253A EQU
IOPORT+283H
IO8253B EQU
IOPORT+280H
CODE SEGMENT
ASSUME
CS:CODE
START: MOV
AL,00010000B
;設(shè)置8253工作方式
MOV
DX,IO8253A
OUT
DX,AL
MOV
DX,IO8253B
;送計(jì)數(shù)初值為0FH
MOV
AL,0FH
OUT
DX,AL
LLL: IN
AL,DX
;讀計(jì)數(shù)初值
CALL
DISP
;調(diào)顯示子程序
PUSH
DX
MOV
AH,06H
MOV
DL,0FFH
INT
21H
POP
DX
JZ
LLL
;跳轉(zhuǎn)到LLL
MOV
AH,4CH
;退出
INT
21H
DISP PROC
NEAR
;顯示子程序
PUSH
DX
AND
AL,0FH
;首先取低四位
MOV
DL,AL
CMP
DL,9
;判斷是否<=9
JLE
NUM
;若是則為'0'-'9',ASCII碼加30H
ADD
DL,7
;否則為'A'-'F',ASCII碼加37H
NUM: ADD
DL,30H
MOV
AH,02H
;顯示
INT
21H
MOV
DL,0DH
;加回車符
INT
21H
MOV
DL,0AH
;加換行符
INT
21H
POP
DX
RET
;子程序返回
DISP ENDP
CODE ENDS
END
START 運(yùn)行結(jié)果:
每輸入一個(gè)單脈沖,屏幕上的數(shù)值減1,從15減到0后(撥動(dòng)16次后),檢測(cè)到OUT0輸出由低電平變?yōu)楦唠娖健P〗Y(jié)(體會(huì)與收獲):
通過(guò)預(yù)習(xí)和實(shí)驗(yàn),學(xué)會(huì)了 8253 芯片和微機(jī)接口原理和方法,掌握 8253 定時(shí)器/計(jì)數(shù)器的基本工作原理、工作方式和編程原理,熟悉了匯編代碼的編寫。實(shí)驗(yàn)中,連接電路,利用代碼控制實(shí)驗(yàn)電路,深對(duì)了課本理論的理解。
由于是第一次實(shí)驗(yàn),進(jìn)程比較緩慢,所以僅進(jìn)行了8253可編程定時(shí)器/計(jì)數(shù)器的一個(gè)實(shí)驗(yàn),下次實(shí)驗(yàn)會(huì)熟練一些。
微機(jī)實(shí)驗(yàn)報(bào)告書(Ⅱ)
學(xué)號(hào):姓名:班級(jí): 同組名單:實(shí)驗(yàn)日期:
實(shí)驗(yàn)題目:1.8253可編程定時(shí)器計(jì)數(shù)器
2.8255可編程并行接口(方式0)3.七段數(shù)碼管
實(shí)驗(yàn)?zāi)繕?biāo):1.掌握8253的基本工作原理和編程方法
2.掌握8255方式0的工作原理及使用方法 3.掌握數(shù)碼管顯示數(shù)字的原理
實(shí)驗(yàn)步驟: 實(shí)驗(yàn)一:
連接電路圖
按上圖連接電路,將計(jì)數(shù)器0、計(jì)數(shù)器1分別設(shè)置為方式3,計(jì)數(shù)初值設(shè)為1000,用邏輯筆觀察OUT1輸出電平的變化(頻率1HZ)。實(shí)驗(yàn)二:
連接電路圖
1)實(shí)驗(yàn)電路如圖,8255C口接邏輯電平開關(guān)K0~K7,A口接LED顯示電路L0~L7。
2)編程從8255C口輸入數(shù)據(jù),再?gòu)腁口輸出。實(shí)驗(yàn)三:
連接電路圖
靜態(tài)顯示:按圖連接好電路,將8255的A口PA0~PA6分別與七段數(shù)碼管的段碼驅(qū)動(dòng)輸入端a~g相連,位碼驅(qū)動(dòng)輸入端S1接+5V(選中), S0、dp接地(關(guān)閉)。編程從鍵盤輸入一位十進(jìn)制數(shù)字(0~9),在七段數(shù)碼管上顯示出來(lái)。程序框圖: 實(shí)驗(yàn)一:
實(shí)驗(yàn)二:
實(shí)驗(yàn)三:
程序清單: 實(shí)驗(yàn)一:
;*******************;* 8253分頻 *;******************* IOPORT EQU
0C800H-0280H
IO8253A EQU
IOPORT+283H
IO8253B EQU
IOPORT+280H
IO8253C EQU
IOPORT+281H
CODE SEGMENT
ASSUME
CS:CODE
START: MOV
DX,IO8253A;向8253寫控制字
MOV
AL,36H
;工作方式
OUT
DX,AL
MOV
AX,1000
;寫入循環(huán)計(jì)數(shù)初值1000
MOV
DX,IO8253B
OUT
DX,AL
;先寫入低字節(jié)
MOV
AL,AH
OUT
DX,AL
;后寫入高字節(jié)
MOV
DX,IO8253A
MOV
AL,76H
;設(shè)工作方式
OUT
DX,AL
MOV
AX,1000
;寫入循環(huán)計(jì)數(shù)初值1000
MOV
DX,IO8253C
OUT
DX,AL
;先寫低字節(jié)
MOV
AL,AH
OUT
DX,AL
;后寫高字節(jié)
MOV
AH,4CH
;程序退出
INT
21H
CODE ENDS
END
START
實(shí)驗(yàn)二:
;*************************;;* 8255A的基本輸入輸出 *;;*************************;IOPORT EQU 0C800H‐280H IO8255A EQU IOPORT+288H IO8255B EQU IOPORT+ 28BH IO8255C EQU IOPORT+28AH CODE SEGMENT ASSUME CS:CODE START: MOV DX,IO8255B;對(duì) 8255 進(jìn)行設(shè)定,A 輸出,C 輸入
MOV AL,10001001B
OUT DX,AL INPUT: MOV DX,IO8255C;從 C 輸入
IN AL,DX
MOV DX,IO8255A;從 A 輸出
OUT DX,AL
MOV DL,0FFH;判斷是否有按鍵
MOV AH,06H
INT 21H
JZ INPUT;若無(wú),則繼續(xù) C 輸入,A 輸出
MOV AH,4CH;否則,返回 DOS
INT 21H CODE ENDS END START 實(shí)驗(yàn)三:
;************************************;;*鍵盤輸入數(shù)據(jù)(0-9)控制LED數(shù)碼管顯示*;;************************************;
DATA
SEGMENT
IOPORT
EQU
0C800H-280H IO8255A
EQU
IOPORT+288H IO8255B
EQU
IOPORT+28BH IO8255C
EQU
IOPORT+28AH
LED
DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
MESG1
DB
0DH,0AH,'Input a num(0--9),other key is exit:',0DH,0AH,'$' DATA
ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:
MOV
AX,DATA
MOV
DS,AX
MOV
DX,IO8255B
;使 8255 的A口為輸出方式
MOV
AX,10000000B
OUT
DX,AL
SSS:
MOV
DX,OFFSET MESG1
;顯示提示信息
MOV
AH,09H
INT
21H
MOV
AH,01
;從鍵盤接收字符
INT
21H
CMP
AL,30H
;是否小于 0
JL
EXIT
;若是則退出
CMP
AL,39H
;是否大于9
JG
EXIT
;若是則退出
SUB
AL,30H
;將所得字符的 ASCII 碼減 30H
MOV
BX,OFFSET LED
;BX為數(shù)碼表的起始地址
XLAT
;求出相應(yīng)的段碼
MOV
DX,IO8255A
;從 8255 的A口輸出
OUT
DX,AL
JMP
SSS
;轉(zhuǎn) SSS EXIT:
MOV
AH,4CH
;返回
INT
21H CODE
ENDS
END
START;
運(yùn)行結(jié)果: 實(shí)驗(yàn)一:
8253通道0和通道1均工作在方式3,計(jì)數(shù)初值均為1000。通道0的時(shí)鐘輸入為1MHz標(biāo)準(zhǔn)脈沖,產(chǎn)生1000Hz的方波;通道1以通道0輸出的1000Hz方波脈沖為輸入,產(chǎn)生1Hz的方波。用邏輯筆發(fā)現(xiàn),OUT1 輸出電平呈規(guī)律性高低變化(顯示燈閃爍),時(shí)間間隔為 1s,說(shuō)明輸出頻率為 1Hz,實(shí)現(xiàn)計(jì)時(shí)器功能。實(shí)驗(yàn)二:
當(dāng)邏輯開關(guān)K0~K7中的一個(gè)或幾個(gè)打開時(shí),對(duì)應(yīng)的LED燈就會(huì)亮起來(lái),即利用8255A實(shí)現(xiàn)了基本的輸入輸出控制。實(shí)驗(yàn)三:
靜態(tài)顯示:當(dāng)從鍵盤輸入0~9任一數(shù)字時(shí),七段數(shù)碼管上便 會(huì)顯示相應(yīng)的數(shù)字,按下其他按鍵則退出程序。小結(jié)(體會(huì)和收獲):
通過(guò)本次實(shí)驗(yàn),進(jìn)一步了解了8253可編程定時(shí)器/計(jì)數(shù)器;鞏固了可編程并行接口8255的基本知識(shí)點(diǎn),了解了該芯片的應(yīng)用。通過(guò)編程實(shí)現(xiàn),熟悉了8255方式控制字,了解了方式0和基本工作原理。通過(guò)這三次實(shí)驗(yàn)的學(xué)習(xí),對(duì)于可編程接口芯片有了更深的認(rèn)識(shí),掌握了基本的微機(jī)接口方法。
在實(shí)驗(yàn)過(guò)程中要細(xì)心,當(dāng)編譯、鏈接或者運(yùn)行的時(shí)候遇到錯(cuò)誤的時(shí)候,要仔細(xì)檢查程序的輸入是否正確,很容易輸錯(cuò)字母數(shù)字。
微機(jī)實(shí)驗(yàn)報(bào)告書(Ⅲ)
學(xué)號(hào):姓名:班級(jí): 同組名單:實(shí)驗(yàn)日期: 實(shí)驗(yàn)題目:步進(jìn)電機(jī)控制實(shí)驗(yàn)
實(shí)驗(yàn)?zāi)繕?biāo):1.了解步進(jìn)電機(jī)控制的基本原理
2.掌握控制步進(jìn)電機(jī)轉(zhuǎn)動(dòng)的編程方法
實(shí)驗(yàn)步驟:
連接電路圖
1)按圖14連接線路,利用8255輸出脈沖序列,開關(guān)K0~K6控制步進(jìn)電機(jī)轉(zhuǎn)速,K7控制步進(jìn)電機(jī)轉(zhuǎn)向。8255 CS接288H~28FH。PA0~PA3接BA~BD;PC0~PC7接K0~K7。
2)編程:當(dāng)K0~K6中某一開關(guān)為“1”(向上撥)時(shí)步進(jìn)電機(jī)啟動(dòng)。K7向上撥電機(jī)正轉(zhuǎn),向下?lián)茈姍C(jī)反轉(zhuǎn)。程序框圖:
程序清單:
;*******************************;;*
步進(jìn)電機(jī)
*;;*******************************;
DATA
SEGMENT
IOPORT
EQU
0E400H-280H
IO8255A
EQU
IOPORT+288H
;8255A 輸出端口
IO8255B
EQU
IOPORT+ 28BH
;8255B 控制端口
IO8255C
EQU
IOPORT+ 28AH
;8255C 輸入端口
BUF
DB
0
MES
DB
'K0-K6 ARE SPEED CONTROL',0AH,0DH
DB
'K6 IS THE LOWEST SPEED ',0AH,0DH
DB
'K0 IS THE HIGHEST SPEED',0AH,0DH
DB
'K7 IS THE DIRECTION CONTROL',0AH,0DH,'$'
DATA
ENDS
CODE SEGMENT
ASSUME
CS:CODE,DS:DATA
START:
MOV
AX,CS
MOV
DS,AX
MOV
AX,DATA
MOV
DS,AX
MOV
DX,OFFSET MES
MOV
AH,09
INT
21H
MOV
DX,IO8255B
MOV
AL, 10001001B
OUT
DX,AL
;8255 C輸入, A 輸出
MOV
BUF,33H
OUT1:
MOV
AL,BUF
MOV
DX,IO8255A
OUT
DX,AL
PUSH
DX
MOV
AH,06H
MOV
DL,0FFH
INT
21H
POP
DX
JE
IN1
MOV
AH,4CH
INT
21H
IN1:
MOV
DX,IO8255C
IN
AL,DX
;輸入開關(guān)狀態(tài)
TEST
AL,01H
JNZ
K0
TEST
AL,02H
JNZ
K1
TEST
AL,04H
JNZ
K2
TEST
AL,08H
JNZ
K3
TEST
AL,10H
JNZ
K4
TEST
AL,20H
JNZ
TEST
JNZ
STOP:
MOV
MOV
JMP
K0:
MOV
SAM:
TEST
JZ
JMP
K1:
MOV
JMP
SAM
K2:
MOV
JMP
K3:
MOV
JMP
K4:
MOV
JMP
K5:
MOV
JMP
K6:
MOV
JMP
SAM
ZX0:
CALL
MOV
ROR
MOV
JMP
NX0:
CALL
MOV
ROL
MOV
JMP
DELAY
PROC
DELAY1:
MOV
DELAY2:
LOOP
K5
AL,40H K6
DX,IO8255C AL,0FFH
OUT1
BL,40H
AL,80H ZX0 NX0
BL,50H
BL,70H
SAM
BL,80H SAM
BL,0A0H SAM
BL,0C0H SAM
BL,0FFH
DELAY
AL,BUF
AL,1
BUF,AL OUT1
DELAY
AL,BUF
AL,1
BUF,AL OUT1
NEAR
CX,0FFFFH
DELAY2
DEC
BL
JNZ
DELAY1
RET
DELAY
ENDP
CODE
ENDS
END
START 運(yùn)行結(jié)果:
當(dāng)K0~K6中任意一開關(guān)向上撥時(shí)步進(jìn)電機(jī)啟動(dòng),且K1速度最快,K6速度最慢;當(dāng)K7向上撥電機(jī)正轉(zhuǎn),向下?lián)茈姍C(jī)反轉(zhuǎn)。當(dāng)鍵盤中有任意鍵輸入的時(shí)候則程序終止。小結(jié)(收獲與體會(huì)):
實(shí)驗(yàn)和理論是相互檢驗(yàn),相互補(bǔ)充和相互促進(jìn)的,在實(shí)際動(dòng)手動(dòng)腦運(yùn)用理論知識(shí)的時(shí)候,能更深入地領(lǐng)會(huì)概念,熟練運(yùn)用,在此基礎(chǔ)上方能進(jìn)行創(chuàng)新和自由發(fā)揮。通過(guò)本次實(shí)驗(yàn),我了解了步進(jìn)電機(jī)控制的基本原理,掌握了控制步進(jìn)電機(jī)轉(zhuǎn)動(dòng)的編程方法。更加深入地了解了微機(jī)原理這門課程。
第四篇:現(xiàn)代電子實(shí)驗(yàn)報(bào)告 電子科技大學(xué)
基于FPGA的現(xiàn)代電子實(shí)驗(yàn)設(shè)計(jì)報(bào)告
——數(shù)字式秒表設(shè)計(jì)(VHDL)
學(xué)院:物理電子學(xué)院
專業(yè):
學(xué)號(hào):
學(xué)生姓名:
指導(dǎo)教師:
實(shí)驗(yàn)地點(diǎn):
實(shí)驗(yàn)時(shí)間:
劉曦 科研樓303
摘要:
通過(guò)使用VHDL語(yǔ)言開發(fā)FPGA的一般流程,重點(diǎn)介紹了秒表的基本原理和相應(yīng)的設(shè)計(jì)方案,最終采用了一種基于 FPGA 的數(shù)字頻率的實(shí)現(xiàn)方法。該設(shè)計(jì)采用硬件描述語(yǔ)言VHDL,在軟件開發(fā)平臺(tái)ISE上完成。該設(shè)計(jì)的秒表能準(zhǔn)確地完成啟動(dòng),停止,分段,復(fù)位功能。使用 ModelSim 仿真軟件對(duì)VHDL 程序做了仿真,并完成了綜合布局布線,最終下載到EEC-FPGA實(shí)驗(yàn)板上取得良好測(cè)試效果。
關(guān)鍵詞:FPGA,VHDL,ISE,ModelSim
目錄
緒論.........................................................4
第一章實(shí)驗(yàn)任務(wù)…………………………………..5
第二章系統(tǒng)需求和解決方案計(jì)劃………..5
第三章設(shè)計(jì)思路…………………………………..6
第四章系統(tǒng)組成和解決方案………………..6
第五章各分模塊原理……………………………8
第六章仿真結(jié)果與分析………………………..11
第七章分配引腳和下載實(shí)現(xiàn)…………………13
第八章實(shí)驗(yàn)結(jié)論…………………...………………14 緒論:
1.1 課程介紹:
《現(xiàn)代電子技術(shù)綜合實(shí)驗(yàn)》課程通過(guò)引入模擬電子技術(shù)和數(shù)字邏輯設(shè)計(jì)的綜合應(yīng)用、基于MCU/FPGA/EDA技術(shù)的系統(tǒng)設(shè)計(jì)等綜合型設(shè)計(jì)型實(shí)驗(yàn),對(duì)學(xué)生進(jìn)行電子系統(tǒng)綜合設(shè)計(jì)與實(shí)踐能力的訓(xùn)練與培養(yǎng)。
通過(guò)《現(xiàn)代電子技術(shù)綜合實(shí)驗(yàn)》課程的學(xué)習(xí),使學(xué)生對(duì)系統(tǒng)設(shè)計(jì)原理、主要性能參數(shù)的選擇原則、單元電路和系統(tǒng)電路設(shè)計(jì)方法及仿真技術(shù)、測(cè)試方案擬定及調(diào)測(cè)技術(shù)有所了解;使學(xué)生初步掌握電子技術(shù)中應(yīng)用開發(fā)的一般流程,初步建立起有關(guān)系統(tǒng)設(shè)計(jì)的基本概念,掌握其基本設(shè)計(jì)方法,為將來(lái)從事電子技術(shù)應(yīng)用和研究工作打下基礎(chǔ)。
本文介紹了基于FPGA的數(shù)字式秒表的設(shè)計(jì)方法,設(shè)計(jì)采用硬件描述語(yǔ)言VHDL,在軟件開發(fā)平臺(tái)ISE上完成,可以在較高速時(shí)鐘頻率(48MHz)下正常工作。該數(shù)字頻率計(jì)采用測(cè)頻的方法,能準(zhǔn)確的測(cè)量頻率在10Hz到100MHz之間的信號(hào)。使用ModelSim仿真軟件對(duì)VHDL程序做了仿真,并完成了綜合布局布線,最終下載到芯片Spartan3A上取得良好測(cè)試效果。1.2VHDL語(yǔ)言簡(jiǎn)介: VHDL 的英文全名是 Very-High-Speed Integrated Circuit Hardware Description Language,誕生于 1982 年。1987 年底,VHDL被 IEEE 和美國(guó)國(guó)防部確認(rèn)為標(biāo)準(zhǔn)硬件描述語(yǔ)言。VHDL主要用于描述數(shù)字系統(tǒng)的結(jié)構(gòu),行為,功能和接口。除了含有許多具有硬件特征的語(yǔ)句外,VHDL的語(yǔ)言形式和描述風(fēng)格與句法是十分類似于一般的計(jì)算機(jī)高級(jí)語(yǔ)言。VHDL的程序結(jié)構(gòu)特點(diǎn)是將一項(xiàng)工程設(shè)計(jì),或稱設(shè)計(jì)實(shí)體(可以是一個(gè)元件,一個(gè)電路模塊或一個(gè)系統(tǒng))分成外部(或稱可視部分,及端口)和內(nèi)部(或稱不可視部分),既涉及實(shí)體的內(nèi)部功能和算法完成部分。在對(duì)一個(gè)設(shè)計(jì)實(shí)體定義了外部界面后,一旦其內(nèi)部開發(fā)完成后,其他的設(shè)計(jì)就可以直接調(diào)用這個(gè)實(shí)體。這種將設(shè)計(jì)實(shí)體分成內(nèi)外部分的概念是VHDL系統(tǒng)設(shè)計(jì)的基本點(diǎn)。
VHDL語(yǔ)言的特點(diǎn): VHDL 語(yǔ)言能夠成為標(biāo)準(zhǔn)化的硬件描述語(yǔ)言并獲得廣泛應(yīng)用,它自身必然具有很多其他硬件描述語(yǔ)言所不具備的優(yōu)點(diǎn)。歸納起來(lái),VHDL 語(yǔ)言主要具有以下優(yōu)點(diǎn):(1)VHDL 語(yǔ)言功能強(qiáng)大,設(shè)計(jì)方式多樣(2)VHDL 語(yǔ)言具有強(qiáng)大的硬件描述能力(3)VHDL 語(yǔ)言具有很強(qiáng)的移植能力(4)VHDL 語(yǔ)言的設(shè)計(jì)描述與器件無(wú)關(guān)(5)VHDL 語(yǔ)言程序易于共享和復(fù)用 由于 VHDL 語(yǔ)言是一種描述、模擬、綜合、優(yōu)化和布線的標(biāo)準(zhǔn)硬件描述語(yǔ)言,因此它可以使設(shè)計(jì)成果在設(shè)計(jì)人員之間方便地進(jìn)行交流和共享,從而減小硬件電路設(shè)計(jì)的工作量,縮短開發(fā)周期。1.3FPGA簡(jiǎn)介
FPGA(Field-Programmable Gate Array),即現(xiàn)場(chǎng)可編程門陣列,它是在PAL、GAL、CPLD等可編程器件的基礎(chǔ)上進(jìn)一步發(fā)展的產(chǎn)物。它是作為專用集成電路(ASIC)領(lǐng)域中的一種半定制電路而出現(xiàn)的,既解決了定制電路的不足,又克服了原有可編程器件門電路數(shù)有限的缺點(diǎn)。
以硬件描述語(yǔ)言(Verilog或VHDL)所完成的電路設(shè)計(jì),可以經(jīng)過(guò)簡(jiǎn)單的綜合與布局,快速的燒錄至 FPGA 上進(jìn)行測(cè)試,是現(xiàn)代 IC設(shè)計(jì)驗(yàn)證的技術(shù)主流。這些可編輯元件可以被用來(lái)實(shí)現(xiàn)一些基本的邏輯門電路(比如AND、OR、XOR、NOT)或者更復(fù)雜一些的組合功能比如解碼器或數(shù)學(xué)方程式。在大多數(shù)的FPGA里面,這些可編輯的元件里也包含記憶元件例如觸發(fā)器(Flip-flop)或者其他更加完整的記憶塊。系統(tǒng)設(shè)計(jì)師可以根據(jù)需要通過(guò)可編輯的連接把FPGA內(nèi)部的邏輯塊連接起來(lái),就好像一個(gè)電路試驗(yàn)板被放在了一個(gè)芯片里。一個(gè)出廠后的成品FPGA的邏輯塊和連接可以按照設(shè)計(jì)者而改變,所以FPGA可以完成所需要的邏輯功能。
FPGA一般來(lái)說(shuō)比ASIC(專用集成電路)的速度要慢,實(shí)現(xiàn)同樣的功能比ASIC電路面積要大。但是他們也有很多的優(yōu)點(diǎn)比如可以快速成品,可以被修改來(lái)改正程序中的錯(cuò)誤和更便宜的造價(jià)。廠商也可能會(huì)提供便宜的但是編輯能力差的FPGA。因?yàn)檫@些芯片有比較差的可編輯能力,所以這些設(shè)計(jì)的開發(fā)是在普通的FPGA上完成的,然后將設(shè)計(jì)轉(zhuǎn)移到一個(gè)類似于ASIC的芯片上。另外一種方法是用CPLD(Complex Programmable Logic Device,復(fù)雜可編程邏輯器件)。
FPGA設(shè)計(jì)流程:
對(duì)于目標(biāo)文件為FPGA的HDL設(shè)計(jì),其一般流程如下:
1、文本編輯
用任何文本編輯器都可以進(jìn)行,通常 VHDL文件保存為vhd文件,Verilog 文件保存為 v文件。
2、使用編譯工具編譯源文件
HDL 的編譯器有很多,ACTIVE 公司,MODELSIM 公司,SYNPLICITY 公司,SYNOPSYS 公司,VERIBEST公司等都有自己的編譯器。
3、邏輯綜合
將源文件調(diào)入邏輯綜合軟件進(jìn)行綜合。綜合的目的是在于將設(shè)計(jì)的源文件由語(yǔ)言轉(zhuǎn)換為實(shí)際的電路。但是此時(shí)還沒有在芯片中形成真正的電路。這一步的最終目的是生成門電路級(jí)的網(wǎng)表(Netlist)。
4、布局、布線
將第 3 步生成的網(wǎng)表文件調(diào)入 PLD 廠家提供的軟件中進(jìn)行布線,即把設(shè)計(jì)好的邏輯安放到 CPLD/FPGA 內(nèi)。這一步的目的是生成用于下載(編程 Programming)的編程文件。在這一步,將用到第 3 步生成的網(wǎng)表,并根據(jù) CPLD /FPGA 廠商的器件容量,結(jié)構(gòu)等進(jìn)行布局、布線。這就好像在設(shè)計(jì) PCB 時(shí)的布局布線一樣。先將各個(gè)設(shè)計(jì)中的門根據(jù)網(wǎng)表的內(nèi)容和器件的結(jié)構(gòu)放在器件的特定部位。然后,在根據(jù)網(wǎng)表中提供的各門的連接,把各個(gè)門的輸入輸出連接起來(lái)。最后,生成一個(gè)供編程的文件。這一步同時(shí)還會(huì)加一些時(shí)序信息(Timing)到你的設(shè)計(jì)項(xiàng)目中去,以便于你做后仿真。
5、后仿真
利用在布局布線中獲得的精確參數(shù),用仿真軟件驗(yàn)證電路的時(shí)序。(也叫布局布線仿真或時(shí)序仿真)。這一步主要是為了確定你的設(shè)計(jì)在經(jīng)過(guò)布局布線之后,是不是還滿足你的設(shè)計(jì)要求。
6、編程,下載
如果前幾步都沒有發(fā)生錯(cuò)誤,并且符合設(shè)計(jì)要求,這一步就可以將由適配器等產(chǎn)生的配置或下載文件通過(guò)編程器或下載電纜下載到目標(biāo)芯片中。
7、硬件測(cè)試
硬件測(cè)試的目的是為了在更真實(shí)的環(huán)境中檢驗(yàn) HDL設(shè)計(jì)的運(yùn)行情況,特別是對(duì)于 HDL 程序設(shè)計(jì)上不是十分規(guī)范,語(yǔ)義上含有一定歧義的程序。
一、實(shí)驗(yàn)任務(wù)——設(shè)計(jì)一個(gè)秒表:
秒表的計(jì)時(shí)范圍為00’00”00 ~ 59’59”99。有兩個(gè)按鈕開關(guān)Start/Stop和Split/Reset,控制秒表的啟動(dòng)、停止、分段和復(fù)位:
1,在秒表已經(jīng)被復(fù)位的情況下,按下“Start/Stop”鍵,秒表開始計(jì)時(shí)。
2,在秒表正常運(yùn)行的情況下,如果按下“Start/Stop”鍵,則秒表暫停計(jì)時(shí)。3,再次按下該鍵,秒表繼續(xù)計(jì)時(shí)。
4,在秒表正常運(yùn)行的情況下,如果按下“Split/Reset”鍵,顯示停止在按鍵時(shí)的時(shí)間,但秒表仍然在計(jì)時(shí); 5,再次按下該鍵,秒表恢復(fù)正常顯示。
6,在秒表暫停計(jì)時(shí)的情況下,按下“Split/Reset”鍵,秒表復(fù)位歸零。
二、系統(tǒng)需求和解決方案計(jì)劃:
在項(xiàng)目開始設(shè)計(jì)時(shí),首先要確定系統(tǒng)的需求并發(fā)展出一個(gè)針對(duì)這些需求的計(jì)劃。
按照秒表的設(shè)計(jì)要求,整個(gè)電路需要下面這些組成部分: 2.1 分頻器:
對(duì)晶體振蕩器產(chǎn)生的時(shí)鐘信號(hào)進(jìn)行分頻,產(chǎn)生時(shí)間基準(zhǔn)信號(hào)。2.2 計(jì)數(shù)器:
對(duì)時(shí)間基準(zhǔn)脈沖進(jìn)行計(jì)數(shù),完成計(jì)時(shí)功能。2.3 數(shù)據(jù)鎖存器:
鎖存數(shù)據(jù)使顯示保持暫停。2.4 控制器:
控制計(jì)數(shù)器的運(yùn)行、停止以及復(fù)位產(chǎn)生鎖存器的使能信號(hào)。2.5 掃描顯示的控制電路:
包括掃描計(jì)數(shù)器、數(shù)據(jù)選擇器和7段譯碼器,控制8個(gè)數(shù)碼管以掃描方式顯示計(jì)時(shí)結(jié)果。2.6 按鍵消抖電路:
消除按鍵輸入信號(hào)抖動(dòng)的影響,輸出單脈沖。
三、設(shè)計(jì)思路:
從FPGA開發(fā)板的電路可以看出,其不具備對(duì)按鍵輸入的消抖功能,故須編寫消抖功能的模塊代碼。消除按鍵抖動(dòng)的影響;每按一次鍵,只輸出一個(gè)脈沖,其寬度為一個(gè)時(shí)鐘周期。由開發(fā)板電路結(jié)構(gòu)可以看出,其為共陽(yáng)結(jié)構(gòu),故在其運(yùn)行為低有效。
8個(gè)數(shù)碼顯示管共用一個(gè)段位,故為了將時(shí)鐘顯示在8個(gè)數(shù)碼管上,需要一定頻率(本秒表為1KHz)的信號(hào)進(jìn)行掃描,使得我們?nèi)庋劭瓷先ナ?個(gè)數(shù)碼管同時(shí)顯示的。為了實(shí)現(xiàn)秒表暫停和復(fù)位的功能,需要鎖存器模塊將時(shí)鐘數(shù)據(jù)鎖存起來(lái),并且結(jié)合控制電路滿足秒表的功能。
FPGA開發(fā)板的晶振頻率為48MHz,而實(shí)際電路需要的頻率為1KHz,故須建立分頻模塊,將48MHz的晶振頻率分頻成1KHz。在構(gòu)建計(jì)數(shù)范圍從00’00”00-59’59”99的秒表時(shí),從數(shù)碼管顯示的角度可知,需要建立模六和模十兩種計(jì)數(shù)模塊進(jìn)行組合形成。設(shè)計(jì)圖如下:
四、系統(tǒng)組成和解決方案:
在項(xiàng)目開始設(shè)計(jì)時(shí),首先要確定系統(tǒng)的需求并發(fā)展出一個(gè)針對(duì)這些需求的計(jì)劃。按照數(shù)字式秒表工作原理的描述,需要下面這些主要的子系統(tǒng): 1,控制電路;
2,由石英振蕩器和數(shù)字分頻器構(gòu)成的時(shí)基信號(hào)發(fā)生器; 3,按鍵開關(guān)(按鍵消抖); 4,計(jì)數(shù)器; 5,數(shù)據(jù)鎖存器; 6,掃描顯示的控制子系統(tǒng)(包括顯示譯碼和掃描控制); 7,六個(gè)數(shù)碼管(LED顯示電路)。
設(shè)計(jì)框圖如下:
五、各分模塊原理:
5.1、48M-1K分頻器
對(duì)晶振振蕩器產(chǎn)生的時(shí)鐘信號(hào)進(jìn)行分頻,產(chǎn)生時(shí)間基準(zhǔn)信號(hào)。由于FPGA開發(fā)板的晶振頻率為48MHz,故在設(shè)計(jì)分頻器模塊時(shí),為了將頻率分頻成1KHz,即將輸入的信號(hào)源每48000個(gè)周期轉(zhuǎn)換成輸出的一個(gè)周期。因此利用上升沿計(jì)數(shù)手段,將0-47999用16位二進(jìn)制數(shù)表示,而在從0-47999的計(jì)數(shù)過(guò)程中,該二進(jìn)制數(shù)的最高位只有一次狀態(tài)變化,故可取對(duì)應(yīng)二進(jìn)制數(shù)的最高位來(lái)輸出達(dá)到分頻到1KHz的目的。如下代碼為將晶振振蕩器48MHz頻率分頻成1KHz信號(hào):
5.2、計(jì)數(shù)器
對(duì)時(shí)間基準(zhǔn)脈沖進(jìn)行計(jì)數(shù),完成計(jì)時(shí)功能。實(shí)現(xiàn)數(shù)字秒表的設(shè)計(jì)需要模6和模10計(jì)數(shù)器進(jìn)行組合??紤]到秒表的暫停和清零等功能,在設(shè)計(jì)計(jì)數(shù)器模塊時(shí),必須有時(shí)鐘輸入端、使能以及清零端。在有時(shí)鐘信號(hào)輸入的情況下,當(dāng)使能端無(wú)效時(shí),計(jì)數(shù)器不能進(jìn)行計(jì)數(shù);當(dāng)清零端有效時(shí),計(jì)數(shù)重新歸為0值。而為了實(shí)現(xiàn)計(jì)數(shù)的目的,故必須將各個(gè)計(jì)數(shù)器級(jí)聯(lián)來(lái)實(shí)現(xiàn)從00’00”00-59’59”99的計(jì)數(shù),使得級(jí)聯(lián)的各技術(shù)模塊有共同的清零端與使能端,因此該單個(gè)模塊需要有輸出進(jìn)位以及該時(shí)刻的計(jì)數(shù)值并且前一級(jí)的進(jìn)位端連在下一級(jí)的使能端上。如下為模6和模10計(jì)數(shù)器代碼:
5.2.1、模6計(jì)數(shù)器
為了實(shí)現(xiàn)在秒表計(jì)數(shù)是0-5的計(jì)數(shù)部分,故須設(shè)計(jì)一個(gè)模6計(jì)數(shù)器,輸入時(shí)鐘信號(hào)、使能和清零,遇上升沿則記一次數(shù),當(dāng)從0記到5時(shí),進(jìn)位端(用于與下一級(jí)計(jì)數(shù)器級(jí)聯(lián))有效,且遇上升沿后從5變到0,并且輸出的還有每一時(shí)刻的計(jì)數(shù)值。
5.2.2、模10計(jì)數(shù)器
為了實(shí)現(xiàn)在秒表計(jì)數(shù)是0-9的計(jì)數(shù)部分,故須設(shè)計(jì)一個(gè)模10計(jì)數(shù)器,輸入時(shí)鐘信號(hào)、使能和清零,遇上升沿則記一次數(shù),當(dāng)從0記到9時(shí),進(jìn)位端(用于與下一級(jí)計(jì)數(shù)器級(jí)聯(lián))有效,且遇上升沿后從9變到0,并且輸出的還有每一時(shí)刻的計(jì)數(shù)值。
5.3、控制電路
控制計(jì)數(shù)器的運(yùn)行、暫停以及復(fù)位;產(chǎn)生鎖存器的使能信號(hào)。從如下狀態(tài)圖可知,在設(shè)計(jì)控制模塊時(shí),為實(shí)現(xiàn)開發(fā)板上控制秒表的運(yùn)行暫停和清零功能,必須設(shè)置兩個(gè)控制輸入端,以及需要時(shí)鐘信號(hào)輸入端。在時(shí)鐘信號(hào)輸入情況下,由狀態(tài)圖顯示,在輸入不同的控制信號(hào)是,控制模塊需輸出信號(hào)控制計(jì)數(shù)器及其他各模塊的清零和使能端,即當(dāng)外部控制運(yùn)行/暫停鍵首次按下時(shí),控制模塊輸出控制技術(shù)模塊最開始的計(jì)數(shù)器模塊使能有效,各模塊清零無(wú)效;當(dāng)?shù)诙伟聪聲r(shí)為暫停信號(hào),控制模塊控制鎖存器鎖存并控制顯示。當(dāng)清零控制鍵按下時(shí),控制模塊控制技術(shù)模塊清零,故要兩個(gè)輸出使能端。
5.4、鎖存器
鎖存數(shù)據(jù),使顯示保持鎖定。為達(dá)到鎖存數(shù)據(jù)目的,則必須要有對(duì)應(yīng)的8個(gè)數(shù)碼顯示數(shù)據(jù)輸入,當(dāng)其中兩個(gè)數(shù)碼數(shù)據(jù)為不變的,故只需輸入6組由4位二進(jìn)制碼構(gòu)成的數(shù)據(jù)、1KHz時(shí)鐘信號(hào)以及控制模塊作用的使能端。當(dāng)使能端有效的情況下,將輸入6組數(shù)據(jù)輸出。5.5、消抖電路
消除按鍵輸入信號(hào)抖動(dòng)的影響,輸出單脈沖。在手動(dòng)控制按鍵輸入控制信號(hào)前,由于人為因素,會(huì)導(dǎo)致輸入信號(hào)不穩(wěn)定等問(wèn)題,故須添加一個(gè)消抖模塊,使得每次按鍵只會(huì)產(chǎn)生一個(gè)脈沖。故除1KHz時(shí)鐘信號(hào)輸入外,還需要一個(gè)按鍵控制信號(hào)輸入端以及一個(gè)按鍵消抖后輸出信號(hào)。
5.6、譯碼器
包括掃描計(jì)數(shù)器、3-8譯碼器、數(shù)據(jù)選擇器以及7段譯碼器;控制8個(gè)數(shù)碼管一掃描方式顯示計(jì)時(shí)結(jié)果。譯碼模塊的功能是對(duì)之前計(jì)數(shù)模塊的計(jì)數(shù)值進(jìn)行譯碼,使其可以在數(shù)碼管上顯示出來(lái)。在8個(gè)數(shù)碼管中有兩個(gè)數(shù)碼管顯示是不變的,故不需要輸出,所以譯碼模塊要求輸入需要譯碼的6組數(shù)據(jù)以及1KHz時(shí)鐘信號(hào)。譯碼模塊除了要求對(duì)每一個(gè)可能的值(0-9)進(jìn)行譯碼外,還有設(shè)計(jì)要求8個(gè)數(shù)碼管顯示共用一個(gè)段位,故還需設(shè)計(jì)一個(gè)3-8譯碼模塊對(duì)8個(gè)數(shù)碼顯示管進(jìn)行選擇,使其輪流顯示,在1KHz的掃描下,使人看上去是8個(gè)數(shù)碼管同時(shí)顯示的。
l
5.7、計(jì)數(shù)器模塊
由模6和模10計(jì)數(shù)器級(jí)聯(lián)而成。為了實(shí)現(xiàn)從00’00”00-59’59”99的計(jì)數(shù),需要將4個(gè)模10計(jì)數(shù)模塊和2個(gè)模6計(jì)數(shù)模塊級(jí)聯(lián),并且為了達(dá)到設(shè)計(jì)要求是這6個(gè)計(jì)數(shù)器工作在100Hz的時(shí)鐘信號(hào)下,可利用一個(gè)模10的計(jì)數(shù)模塊對(duì)1KHz進(jìn)行分頻,輸出的信號(hào)頻率即為100Hz,該總計(jì)數(shù)模塊最終需輸出6組計(jì)數(shù)數(shù)據(jù)以及其最終的進(jìn)位。
5.8、top文件
由以上各個(gè)文件相互連接而成,以及硬件的管腳管腳分布。將之前所建立的各個(gè)模塊級(jí)聯(lián)起來(lái),從按鍵輸入信號(hào)到按鍵消抖模塊再進(jìn)而連接到控制器,通過(guò)控制模塊對(duì)總計(jì)數(shù)器模塊、鎖存器模塊、譯碼器模塊、分頻器模塊相互連接起來(lái),并設(shè)置晶振輸入信號(hào)以及兩個(gè)按鍵控制信號(hào)輸入,再由譯碼器模塊知,秒表設(shè)計(jì)的最終輸出由一個(gè)3-8對(duì)應(yīng)的8位位選信號(hào)和一組7位的段選信號(hào)組成。最后對(duì)總文件的輸出進(jìn)行管腳分配,并下載到FPGA開發(fā)板上驗(yàn)證設(shè)計(jì)。
六、仿真結(jié)果與分析::
6.11000HZ信號(hào)的產(chǎn)生
6.210位計(jì)數(shù)器的產(chǎn)生
由圖可得,10位計(jì)數(shù)器從0000計(jì)到1001
6.3 6位計(jì)數(shù)器的產(chǎn)生
由圖可得,6位計(jì)數(shù)器從0000計(jì)到0101。
6.4七段數(shù)碼管顯示數(shù)字
6.5鎖存器
由圖可得,當(dāng)沒有時(shí)鐘信號(hào)時(shí)Q不變。6.6分頻器 1000Hz-100Hz
七、分配引腳和下載實(shí)現(xiàn):
全部仿真通過(guò)后,就運(yùn)行ISE 的設(shè)計(jì)實(shí)現(xiàn),然后再打開XILINX PACE,在里面分配引腳,即實(shí)現(xiàn)設(shè)計(jì)的輸入輸出端口與實(shí)際芯片的輸入輸出端口的對(duì)應(yīng)連接。
比如七段LED 管的控制信號(hào)就連接到實(shí)際電路的七個(gè)引腳。需要注意的是一些端口是固定的,不能胡亂的連接。比如時(shí)基信號(hào)即石英振蕩器所提供的信號(hào)就只能由P181 輸入。同時(shí)還要考慮內(nèi)部的可配制邏輯塊CLB 的數(shù)量是否夠滿足程序的綜合要求。一切都準(zhǔn)備就緒后就可以運(yùn)行Configure Device,選擇要下載的位文件(.bit)便可開始。
八、實(shí)驗(yàn)結(jié)論:
8.1、本次實(shí)驗(yàn)實(shí)現(xiàn)了秒表的計(jì)數(shù),復(fù)位,暫停,鎖顯等功能,讓我充分了解和認(rèn)識(shí)到ISE 和Modelsim軟件的強(qiáng)大功能和FPGA 技術(shù)的優(yōu)越性。并對(duì)軟件開發(fā)產(chǎn)生了興趣。
8.2、仿真和下載實(shí)現(xiàn)是兩個(gè)不同的檢驗(yàn),仿真從軟件內(nèi)部來(lái)檢驗(yàn)程序的合理性和正確性,準(zhǔn)確性較高。而下載實(shí)現(xiàn)是從外部來(lái)觀察程序的實(shí)現(xiàn)效果,更直觀,但不具有準(zhǔn)確性。8.3、有時(shí)候下載實(shí)現(xiàn)了所有的功能,但是仿真通不過(guò),這可能是因?yàn)槌绦蛑杏行┎糠植⒉煌晟茖?dǎo)致。從外部來(lái)看,效果是一樣的,但實(shí)際程序卻存在漏洞。附:參考文獻(xiàn):
《數(shù)字設(shè)計(jì)原理與實(shí)踐》作者:(美)John F.Wakerly編 《FPGA應(yīng)用開發(fā)入門與典型實(shí)例》華清遠(yuǎn)見嵌入式培訓(xùn)中心編
附件:(源程序)
1.TOP文件:
library IEEE;use IEEE.STD_LOGIC_1164.ALL;
entity top is
Port(S_S : in STD_LOGIC;
S_R : in STD_LOGIC;clk : in STD_LOGIC;
Out8: out STD_LOGIC_VECTOR(7 downto 0);Seg : out STD_LOGIC_VECTOR(6 downto 0));end top;
architecture Behavioral of top is
COMPONENT fenpingqi_48m_1k PORT(clk : IN std_logic;
q : OUT std_logic);END COMPONENT;
COMPONENT counter PORT(clk : IN std_logic;
eng : IN std_logic;
clear : IN std_logic;
ou : OUT std_logic;
daout1 : OUT std_logic_vector(3 downto 0);
daout2 : OUT std_logic_vector(3 downto 0);
daout3 : OUT std_logic_vector(3 downto 0);
daout4 : OUT std_logic_vector(2 downto 0);daout5 : OUT std_logic_vector(3 downto 0);daout6 : OUT std_logic_vector(2 downto 0));
END COMPONENT;
COMPONENT keydb PORT(clk : IN std_logic;key_in : IN std_logic;
key_out : OUT std_logic);END COMPONENT;
COMPONENT control PORT(clk : IN std_logic;q : IN std_logic;p : IN std_logic;
j_clr : OUT std_logic;j_en : OUT std_logic;s_en : OUT std_logic);END COMPONENT;COMPONENT latch PORT(cnt_0 : IN std_logic_vector(3 downto 0);cnt_00 : IN std_logic_vector(3 downto 0);cnt_1 : IN std_logic_vector(3 downto 0);cnt_11 : IN std_logic_vector(2 downto 0);cnt_2 : IN std_logic_vector(3 downto 0);cnt_22 : IN std_logic_vector(2 downto 0);display_in : IN std_logic;
cnt0 : OUT std_logic_vector(3 downto 0);cnt00 : OUT std_logic_vector(3 downto 0);cnt1 : OUT std_logic_vector(3 downto 0);cnt11 : OUT std_logic_vector(2 downto 0);cnt2 : OUT std_logic_vector(3 downto 0);cnt22 : OUT std_logic_vector(2 downto 0));END COMPONENT;
COMPONENT display PORT(clk_1k : IN std_logic;
cnt0 : IN std_logic_vector(3 downto 0);
cnt00 : IN std_logic_vector(3 downto 0);
cnt1 : IN std_logic_vector(3 downto 0);
cnt11 : IN std_logic_vector(2 downto 0);
cnt2 : IN std_logic_vector(3 downto 0);
cnt22 : IN std_logic_vector(2 downto 0);
output: out STD_LOGIC_VECTOR(7 downto 0);
seg : OUT std_logic_vector(7 downto 1));END COMPONENT;
signal clk_1k,clk_100:std_logic;signal S_S_out,S_R_out:std_logic;signal clr_A,ena_A,lock_A:std_logic;signal co_out1,co_out2,co_out3,co_out4,co_out5:std_logic;signal dao1,dao2,dao3,dao5,daoA,daoB,daoC,daoE:std_logic_vector(3 0);signal dao4,dao6,daoD,daoF:std_logic_vector(2 downto 0);signal Dig:std_logic_vector(2 downto 0);
begin
Inst_fenpingqi_48000: fenpingqi_48m_1k PORT MAP(clk =>clk,q => clk_1k);
Inst_counter: counter PORT MAP(clk =>clk_1k ,eng =>ena_A ,clear =>clr_A ,daout1 =>dao1 ,daout2 => dao2,daout3 => dao3,daout4 => dao4,daout5 => dao5,daout6 => dao6);
Inst_keydb1: keydb PORT MAP(clk =>clk_1k ,key_in => S_S,downto
key_out =>S_S_out);
Inst_keydb2: keydb PORT MAP(clk =>clk_1k , key_in => S_R, key_out =>S_R_out);Inst_control: control PORT MAP(clk =>clk_1k , q =>S_S_out , p =>S_R_out , j_clr =>clr_A , j_en =>ena_A , s_en =>lock_A);Inst_latch: latch PORT MAP(cnt_0 => dao1, cnt_00 => dao2, cnt_1 => dao3, cnt_11 => dao4, cnt_2 => dao5, cnt_22 => dao6, display_in =>lock_A , cnt0 =>daoA, cnt00 =>daoB, cnt1 =>daoC, cnt11 =>daoD, cnt2 =>daoE, cnt22 =>daoF);Inst_display: display PORT MAP(clk_1k => clk_1k, cnt0 =>daoA , cnt00 =>daoB, cnt1 =>daoC, cnt11 =>daoD, cnt2 =>daoE, cnt22 =>daoF, output => Out8, seg =>Seg);
end Behavioral;
2.模10計(jì)算器:
entity counter10 is
Port(clr : in STD_LOGIC;clk : in STD_LOGIC;
en : in STD_LOGIC;
co : out STD_LOGIC;daout : out STD_LOGIC_VECTOR(3 downto 0));end counter10;
architecture Behavioral of counter10 is signal count:std_logic_vector(3 downto 0);begin process(clk,clr,count)begin if clr='1' then count<=“0000”;co<='0';elsif(clk='1' and clk'event)then if en='1' then if count=“1001” then count<=“0000”;else count<=count+1;end if;end if;end if;if count=“1001”and en='1' then co<='1';else co<='0';end if;daout<=count;end process;
end Behavioral;3.模6計(jì)算器:
entity counter6 is
Port(clr : in STD_LOGIC;clk : in STD_LOGIC;
en : in STD_LOGIC;
co : out STD_LOGIC;daout : out STD_LOGIC_VECTOR(2 downto 0));end counter6;
architecture Behavioral of counter6 is signal count:std_logic_vector(2 downto 0);
begin process(clk,clr,count)begin if clr='1' then count<=“000”;
co<='0';elsif(clk='1' and clk'event)then if en='1' then if count=“101” then count<=“000”;else count<=count+1;end if;end if;end if;if count=“101”and en='1' then co<='1';else co<='0';end if;daout<=count;end process;end Behavioral;
4.計(jì)算器級(jí)聯(lián):
entity counter is
Port(clk : in STD_LOGIC;eng : in STD_LOGIC;
clear : in STD_LOGIC;
ou : out STD_LOGIC;
daout1 : out STD_LOGIC_VECTOR(3 downto 0);
daout2 : out STD_LOGIC_VECTOR(3 downto 0);
daout3 : out STD_LOGIC_VECTOR(3 downto 0);
daout4 : out STD_LOGIC_VECTOR(2 downto 0);
daout5 : out STD_LOGIC_VECTOR(3 downto 0);
daout6 : out STD_LOGIC_VECTOR(2 downto 0));end counter;
architecture Behavioral of counter is COMPONENT fenpingqi_1k_100 PORT(clk : IN std_logic;
q : OUT std_logic);END COMPONENT;
COMPONENT counter10 PORT(clr : IN std_logic;
clk : IN std_logic;
en : IN std_logic;
co : OUT std_logic;
daout : OUT std_logic_vector(3 downto 0));END COMPONENT;
COMPONENT counter6 PORT(clr : IN std_logic;
clk : IN std_logic;
en : IN std_logic;
co : OUT std_logic;
daout : OUT std_logic_vector(2 downto 0));END COMPONENT;
signal clk_100:std_logic;signal clr_A,ena_A:std_logic;signal co_out1,co_out2,co_out3,co_out4,co_out5:std_logic;
begin Inst_fenpingqi_10: fenpingqi_1k_100 PORT MAP(clk =>clk,q => clk_100);
Inst_counter10_1: counter10 PORT MAP(clr => clear,clk =>clk_100 ,en =>eng,co => co_out1,daout => daout1);Inst_counter10_2: counter10 PORT MAP(clr => clear,clk =>clk_100 ,en => co_out1,co => co_out2,daout => daout2);Inst_counter10_3: counter10 PORT MAP(clr => clear,clk =>clk_100 ,en => co_out2,co => co_out3,daout => daout3);
Inst_counter6_1: counter6 PORT MAP(clr =>clear ,clk =>clk_100,en =>co_out3,co =>co_out4 ,daout => daout4);Inst_counter10_4: counter10 PORT MAP(clr => clear,clk =>clk_100 ,en => co_out4,co => co_out5,daout => daout5);Inst_counter6_2: counter6 PORT MAP(clr =>clear,clk =>clk_100,en =>co_out5,co =>ou,daout => daout6);
end Behavioral;
5.控制電路:
entity control is
Port(clk : in STD_LOGIC;
q : in STD_LOGIC;
p : in STD_LOGIC;j_clr : out STD_LOGIC;j_en : out STD_LOGIC;s_en : out STD_LOGIC);end control;
architecture Behavioral of control is signal state:std_logic_vector(1 downto 0):=“00”;signal next_state:std_logic_vector(1 downto 0);signal key:std_logic_vector(1 downto 0);
begin key<=q&p;process(state,key)begin case state is when“00”=> if key=“10” then next_state<=“01”;else next_state<=state;end if;when“01”=> case key is when“10”=>next_state<=“11”;when“01”=>next_state<=“10”;when others=>next_state<=state;end case;when“10”=> if key=“01” then next_state<=“01”;else next_state<=state;end if;when others=> case key is when“10”=>next_state<=“01”;when“01”=>next_state<=“00”;when others=>next_state<=state;end case;end case;end process;process(clk)begin if rising_edge(clk)then state<=next_state;end if;end process;process(state)begin case state is when“00”=> j_clr<='1';j_en<='1';s_en<='1';when“01”=> j_clr<='0';j_en<='1';s_en<='1';when“10”=> j_clr<='0';j_en<='1';s_en<='0';when others=> j_clr<='0';j_en<='0';s_en<='1';end case;end process;end Behavioral;
6.分頻器(2個(gè)): entity fenpingqi_48m_1k is
Port(clk : in STD_LOGIC;
q : out STD_LOGIC);end fenpingqi_48m_1k;
architecture Behavioral of fenpingqi_48m_1k is signal counter:STD_LOGIC_VECTOR(15 downto 0);begin process(clk)begin if(clk='1'and clk'event)then if counter=47999 then counter<=(others=>'0');else
counter<=counter+1;end if;end if;
q<= counter(15);end process;
end Behavioral;
entity fenpingqi_1k_100 is
Port(clk : in STD_LOGIC;
q : out STD_LOGIC);end fenpingqi_1k_100;architecture Behavioral of fenpingqi_1k_100 is signal counter:STD_LOGIC_vector(3 downto 0);
begin process(clk)begin if(clk='1'and clk'event)then if counter=9 then counter<=“0000”;else
counter<=counter+1;end if;end if;q<=counter(3);end process;end Behavioral;
7.顯示電路:
entity display is
Port(clk_1k : in STD_LOGIC;
cnt0 : in STD_LOGIC_VECTOR(3 downto 0);
cnt00 : in STD_LOGIC_VECTOR(3 downto 0);
cnt1 : in STD_LOGIC_VECTOR(3 downto 0);
cnt11 : in STD_LOGIC_VECTOR(2 downto 0);
cnt2 : in STD_LOGIC_VECTOR(3 downto 0);
cnt22 : in STD_LOGIC_VECTOR(2 downto 0);
output: out STD_LOGIC_VECTOR(7 downto 0);seg : out STD_LOGIC_VECTOR(7 downto 1));end display;
architecture Behavioral of display is signal dig:std_logic_vector(2 downto 0):=“000”;signal bcd:std_logic_vector(3 downto 0):=“1000”;signal seg7:std_logic_vector(7 downto 1):=“1111110”;
begin process(clk_1k)begin if clk_1k'event and clk_1k='1' then dig<=dig+1;end if;end process;process(dig)begin case dig is when“000”=>bcd<=cnt0;when“001”=>bcd<=cnt00;when“010”=>bcd<=“1010”;when“011”=>bcd<=cnt1;when“100”=>bcd<='0'& cnt11;when“101”=>bcd<=“1010”;when“110”=>bcd<=cnt2;when“111”=>bcd<='0'&cnt22;when others=>bcd<=“1010”;end case;end process;process(bcd)begin case bcd is when“0000”=>seg7<=“0000001”;when“0001”=>seg7<=“1001111”;when“0010”=>seg7<=“0010010”;when“0011”=>seg7<=“0000110”;when“0100”=>seg7<=“1001100”;when“0101”=>seg7<=“0100100”;when“0110”=>seg7<=“1100000”;when“0111”=>seg7<=“0001111”;when“1000”=>seg7<=“0000000”;when“1001”=>seg7<=“0001100”;when others=>seg7<=“1111110”;end case;end process;process(dig)begin case dig is when“000”=>output<=“01111111”;when“001”=>output<=“10111111”;when“010”=>output<=“11011111”;when“011”=>output<=“11101111”;when“100”=>output<=“11110111”;when“101”=>output<=“11111011”;when“110”=>output<=“11111101”;when“111”=>output<=“11111110”;when others=>output<=“11111111”;end case;end process;seg<=seg7;end Behavioral;
8.鎖存器:
entity latch is
Port(cnt_0 : in STD_LOGIC_VECTOR(3 downto 0);
cnt_00 : in STD_LOGIC_VECTOR(3 downto 0);
cnt_1 : in STD_LOGIC_VECTOR(3 downto 0);
cnt_11 : in STD_LOGIC_VECTOR(2 downto 0);
cnt_2 : in STD_LOGIC_VECTOR(3 downto 0);
cnt_22 : in STD_LOGIC_VECTOR(2 downto 0);display_in : in STD_LOGIC;
cnt0 : out STD_LOGIC_VECTOR(3 downto 0);
cnt00 : out STD_LOGIC_VECTOR(3 downto 0);
cnt1 : out STD_LOGIC_VECTOR(3 downto 0);
cnt11 : out STD_LOGIC_VECTOR(2 downto 0);
cnt2 : out STD_LOGIC_VECTOR(3 downto 0);
cnt22 : out STD_LOGIC_VECTOR(2 downto 0));end latch;
architecture Behavioral of latch is
begin process(display_in,cnt_0,cnt_00,cnt_1,cnt_11,cnt_2,cnt_22)begin if display_in='1' then cnt0<=cnt_0;cnt00<=cnt_00;cnt1<=cnt_1;cnt11<=cnt_11;cnt2<=cnt_2;cnt22<=cnt_22;end if;end process;end Behavioral;
9.消抖電路:
entity keydb is
Port(clk : in STD_LOGIC;key_in : in STD_LOGIC;key_out : out STD_LOGIC);end keydb;
architecture Behavioral of keydb is signal k1,k2:STD_LOGIC;signal cnt : STD_LOGIC_VECTOR(1 DOWNTO 0);
begin process(clk,key_in)begin if clk'event and clk ='0' then if cnt =3 then k1<='1';else k1<='0';cnt<=cnt+1;end if;k2<=k1;end if;if key_in ='0' then cnt<=“00”;end if;end process;key_out<= not k1 and k2;
end Behavioral
第五篇:電子科技大學(xué)實(shí)驗(yàn)報(bào)告格式
九、實(shí)驗(yàn)結(jié)論:
十、總結(jié)及心得體會(huì):
十一、對(duì)本實(shí)驗(yàn)過(guò)程及方法、手段的改進(jìn)建議:
報(bào)告評(píng)分:指導(dǎo)教師簽字:
電子科技大學(xué)
學(xué)生姓名:
學(xué)號(hào):
指導(dǎo)教師:
日期:實(shí) 驗(yàn) 報(bào) 告年月日
一、實(shí)驗(yàn)室名稱:
二、實(shí)驗(yàn)項(xiàng)目名稱:
三、實(shí)驗(yàn)原理:
四、實(shí)驗(yàn)?zāi)康模?/p>
五、實(shí)驗(yàn)內(nèi)容:
六、實(shí)驗(yàn)器材(設(shè)備、元器件):
七、實(shí)驗(yàn)步驟:
八、實(shí)驗(yàn)數(shù)據(jù)及結(jié)果分析: