第一篇:北邮-信息与网络实验报告一
北京邮电大学
信息网络应用基础实验报告
实验一
静态网页的设计
学院:电子工程学院
班级:
姓名:
学号:
一、实验主题
1、设计主题:本次实验我设计的该网页主题是围绕当前热门的多人联机在线网游DOTA2进行的。并对该游戏的由来、背景及其内容做了一些简要的描述。
2、功能:在主页中可以观看该游戏的宣传视频以及该游戏的一些精美的图片,并且通过选择相应选项可以了解更多的游戏内容。
3、运行流程:
① 首先打开主页时可以选择播放视频,并且看到丰富的图片;
② 然后点击相应的选项可以进入到分别的附页中查看内容;
③ 并且在主页点击最下的图片可以回到主页顶部,在其他页面点击最下的图片也可以回到主页。
4、实现功能的html技术:
① 在主页中观看视频利用的是html多媒体中的
② 在页面中的图片是利用了html多媒体中的标签进行图片的加入;
③ 设置页面的背景图片是在
标签中加入background参数即可;④ 在页面内、本机页面间及本机文档连接互联网页面时则是利用了超链接的三种方法建立;
⑤ 在页面中显示表格则是利用了相关的表格创建的语句来建立一个表格,并且可以对表格中插入图片并且可以改变表格的背景颜色以及背景图片。
二、实验内容运行结果
① 打开主页可以看到插入的图片以及背景图片
② 点击页面中插入的视频,点击播放即可以进行播放
插入视频的html代码如下:
③ 点击主页中的超链接则可以跳转到相应的页面。如:
点击英雄介绍链接
则可以显示英雄介绍页面
当选择一个类型的英雄时可以在本页面跳转到对应类型的介绍
当选择某个英雄时则可以链接到互联网上的详细介绍页面
④ 当在副页面点击最下面的图片则可以跳转到主页面
⑤ 在页面中建立的表格并且改变表格背景颜色并且插入图片
三、实验心得与感受
本次实验真正的了解到了如何设计一个最基本的网页,也是将所学的html语言的知识进行了充分的应用,也对这些知识有了更加可视化的了解。由于是第一次进行网页的设计,我选择的是利用记事本来编辑html代码来进行设计的,由于代码都是利用各种标签手动输入的,所以对语句有了深刻的记忆,包括在以后的学习中也会很好的利用它们。我认为这样相对于利用dreamweaver来设计有很多的好处,因为这样第一次可以让我们了解页面的每一部分是怎么实现的,不过在了解过后可以选择软件来设计,因为那样更加具有可视化且方便。
在设计的过程中,也遇到了不少的困难。首先感觉就是对于一个网页的背景图片选择来说比较困难,因为在网页中不会对一个图片进行伸缩,显示的是图片本身的大小,所以只好找到与页面较符合的图片。而且在插入视频时,我利用书中的代码写入时不能在页面中无法播放视频。后来我在网上查阅相关资料,后来直接利用视频网站中的分享视频的代码加入即可在页面中显示一个可播放的视频。
通过这个实验来进行静态网页的设计还是很有意思的,既能学到知识又能了解自己喜欢的东西,而且在网页完成后再进行浏览是一件很有成就感的事情!
第二篇:北邮嵌入式实验报告
北京邮电大学
嵌入式系统开发实验报告
学院:
班级: 姓名: 学号:
序号:
目录
一、实验目的..............................................................................................1
二、实验设备..............................................................................................1
三、基础实验(实验一~实验七)............................................................1
1.实验五..................................................................................................1 2.实验六..................................................................................................1 3.实验七..................................................................................................1
四、驱动程序..............................................................................................5
1.设备驱动程序的概念..........................................................................5 2.驱动程序结构......................................................................................6 3.设备注册和初始化..............................................................................7 4.设备驱动程序的开发过程..................................................................8
五、基本接口实验......................................................................................8
1.实验十二简单设备驱动程序..............................................................9 2.实验十三 CPU GPIO驱动程序设计...................................................9 3.实验十四中断实验...........................................................................10 4.实验十五数码管显示实验................................................................12 5.实验十六 LED点阵驱动程序设计...................................................19 6.实验十七 AD驱动实验....................................................................23 7.实验十八 DA驱动实验....................................................................26
六、实验中遇到的问题及解决方法........................................................30
七、实验总结及心得................................................................................31
一、实验目的
通过实验熟悉Linux环境,并掌握一些基本接口驱动的写法和用C语言编写简单的实验程序。学习LINUX开发环境的搭建,通讯配置等。并熟练掌握LINUX驱动程序的编写及开发流程。对嵌入式系统有进一步的了解。
二、实验设备
1.一套PXA270EP嵌入式实验箱
2.安装Redhat9的宿主PC机,并且配置好ARM Linux的开发环境
三、基础实验(实验一~实验七)
实验一~七为基础实验,目的是为后续实验搭建好软、硬件环境,配置好相关的协议、服务,并通过编写最简单的HelloWorld程序进行测试。由于后面的实验都要依靠前面实验的配置,故本段只着重叙述实验七的具体实现。
1.实验五
实验五为宿主PC机配置了TFTP服务。TFTP(Trivial File Transfer Protocol)是简单文件传输协议,由于特定开发环境的制约,这一服务是必须的。在配置完成后,每次重启宿主PC机时,都须先输入命令:service xinetd restart,以启动TFTP服务。
2.实验六
实验六为宿主PC机配置了NFS服务。NFS(Network File System)指网络文件系统,它实现了文件在不同的系统间使用。当我们想用远端档案时,只需调用“mount”就可以远端系统挂接在自己的档案系统之下。每次重启宿主PC机时,都须先输入命令:service nfs restart,以启动nfs服务。
3.实验七
实验七通过用c语言编写的简单程序HelloWorld,测试前面几个实验是否成功配置好环境,从超级终端可以看到HelloWorld程序的运行结果。
实验步骤如下: 1)硬件连接:
连接宿主 PC 机和一台 PXA270-RP目标板。2)打开宿主PC 机电源,进入 Linux操作系统。
3)启动RedHat 9.0 的图形界面,如下图,若您是以 root 身份登陆在文本模式下,则输入命令startx启动图形界面。进入RedHat 9.0 图形界面后,打开一个终端窗(Terminal)。
4)输入minicom然后回车,minicim设置为115200 8NI无流控。
5)打开PXA270_RP目标板电源,按目标板上的BOOT键,在minicom中应该会看到如下图:
6)在minicom终端窗口中,如图,输入下列四条命令 root ifconfig eth 192.168.0.50 up mount-o nolock 192.168.0.100:/ /mnt cd /mnt 此时,先将该窗口最小化,在后面的第 10 操作步骤中还将会回到该窗口中进行操作。
7)宿主机上打开一个终端窗口(Terminal),点击【红帽/System Tools/Terminal】启动终端窗口,输入下列 4 条命令: ① cd /home
②mkdir HW
③ cd HW
④ vi
HelloWorld.c
/*请您输入程序 7.1 程序清单*/
此时会显示一个空白的屏幕,这条命令的含义是,使用 Vi 编辑器,对一个名叫HelloWorld.c的文件进行编辑,我们看到的空白窗口是对文件进行编辑的窗口,如下图。就像在 Windows系统下面使用写字板等一样道理。
在 vi 里面先单击键盘 A 键,然后左下角会变成—INSER。输入程序的时候和其他编辑器是一样的,如下图。
当输入程序完毕后,单击键盘 Esc 键,然后按“:”(冒号)此时左下角会出现冒号然后输入“wq”最后按“Enter”确认存盘退出 vi 编辑器,如下图。
8)在上面同一个终端窗口中,输入下列 2 条命令交叉编译HelloWorld.c源程序,并查看生成的.o 目标文件,如图 7-10,图7-11: ①
arm-linux-gcc–oHelloWorldHelloWorld.c ②ls 等到再次出现提示符,代表程序已经正确编译。如果此步出现错误信息,请查看错误信息,并且重新编辑原来的 C文件,修改错误。直到正确编译。
9)重新打开第 7 步最小化的开有minicom的终端窗口,即到 PXA270-RP 目标板的mnt目录下,请您输入下列 3 条命令,运行HelloWorld编译成功的HelloWorld目标程序:
① cd home/HW
/*回到minicom中目标板的/mnt/home/HW目录下*/ ②ls ③./ HelloWorld
/*此时会看到如下图*/
四、驱动程序
1.设备驱动程序的概念
设备驱动程序实际是处理和操作硬件控制器的软件,从本质上讲,是内核中具有最高特权级的、驻留内存的、可共享的底层硬件处理例程。驱动程序是内核的一部分,是操作系统内核与硬件设备的直接接口,驱动程序屏蔽了硬件的细节,完成以下功能:
对设备初始化和释放;
对设备进行管理,包括实时参数设置,以及提供对设备的操作接口; 读取应用程序传送给设备文件的数据或者回送应用程序请求的数据; 检测和处理设备出现的错误。
Linux操作系统将所有的设备全部看成文件,并通过文件的操作界面进行操作。对用户程序而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,一般来说,是把设备映射为一个特殊的设备文件,用户程序可以像对其他文件一样对此设备文件进行操作。这意味着:
由于每一个设备至少由文件系统的一个文件代表,因而都有一个“文件名”。应用程序通常可以通过系统调用open()打开设备文件,建立起与目标设备的连接。
打开了代表着目标设备的文件,即建立起与设备的连接后,可以通过read()、write()、ioctl()等常规的文件操作对目标设备进行操作。
设备文件的属性由三部分信息组成:第一部分是文件的类型,第二部分是一个主设备号,第三部分是一个次设备号。其中类型和主设备号结合在一起惟一地确定了设备文件驱动程序及其界面,而次设备号则说明目标设备是同类设备中的第几个。
由于Linux 中将设备当做文件处理,所以对设备进行操作的调用格式与对文件的操作类似,主要包括open()、read()、write()、ioctl()、close()等。应用程序发出系统调用命令后,会从用户态转到核心态,通过内核将open()这样的系统调用转换成对物理设备的操作。
2.驱动程序结构
一个设备驱动程序模块的基本框架
在系统内部,I/O设备的存取通过一组固定的入口点来进行,入口点也可以理解为设备的句柄,就是对设备进行操作的基本函数。字符型设备驱动程序提供如下几个入口点:
open入口点。打开设备准备I/O操作。对字符设备文件进行打开操作,都会调用设备的open入口点。open子程序必须对将要进行的I/O操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,则open子程序必须设置一些标志以表示设备处于忙状态。
close入口点。关闭一个设备。当最后一次使用设备完成后,调用close子程序。独占设备必须标记设备方可再次使用。
read入口点。从设备上读数据。对于有缓冲区的I/O操作,一般是从缓冲区里读数据。对字符设备文件进行读操作将调用read子程序。
write入口点。往设备上写数据。对于有缓冲区的I/O操作,一般是把数据写入缓冲区里。对字符设备文件进行写操作将调用write子程序。
ioctl入口点。执行读、写之外的操作。
select入口点。检查设备,看数据是否可读或设备是否可用于写数据。select系统调用在检查与设备文件相关的文件描述符时使用select入口点。
3.设备注册和初始化
设备的驱动程序在加载的时候首先需要调用入口函数init_module(),该函数最重要的一个工作就是向内核注册该设备,对于字符设备调用register_chrdev()完成注册。register_chrdev的定义为:intregister_chrdev(unsigned int major, const char *name, struct file_ operations *fops);其中,major是为设备驱动程序向系统申请的主设备号,如果为0,则系统为此驱动程序动态分配一个主设备号。name是设备名,fops是对各个调用的入口点说明。此函数返回0时表示成功;返回-EINVAL,表示申请的主设备号非法,主要原因是主设备号大于系统所允许的最大设备号;返回-EBUSY,表示所申请的主设备号正在被其他设备程序使用。如果动态分配主设备号成功,此函数将返回所分配的主设备号。如果register_chrdev()操作成功,设备名就会出现在/proc/dvices文件中。
Linux在/dev目录中为每个设备建立一个文件,用ls–l命令列出函数返回值,若小于0,则表示注册失败;返回0或者大于0的值表示注册成功。注册以后,Linux将设备名与主、次设备号联系起来。当有对此设备名的访问时,Linux通过请求访问的设备名得到主、次设备号,然后把此访问分发到对应的设备驱动,设备驱动再根据次设备号调用不同的函数。
当设备驱动模块从Linux内核中卸载,对应的主设备号必须被释放。字符设备在cleanup_ module()函数中调用unregister_chrdev()来完成设备的注销。unregister_chrdev()的定义为:intunregister_chrdev(unsigned int major, const char *name);包括设备注册在内,设备驱动的初始化函数主要完成的功能是有以下5项。(1)对驱动程序管理的硬件进行必要的初始化。
对硬件寄存器进行设置。比如,设置中断掩码,设置串口的工作方式、并口的数据方向等。
(2)初始化设备驱动相关的参数。
一般说来,每个设备都要定义一个设备变量,用以保存设备相关的参数。在这一步骤里对设备变量中的项进行初始化。
(3)在内核注册设备。
调用register_chrdev()函数来注册设备。(4)注册中断。
如果设备需要IRQ支持,则要使用request_irq()函数注册中断。(5)其他初始化工作。
初始化部分一般还负责给设备驱动程序申请包括内存、时钟、I/O端口等在内的系统资源,这些资源也可以在open子程序或者其他地方申请。这些资源不用时,应该释放,以利于资源的共享。
若驱动程序是内核的一部分,初始化函数则要按如下方式声明: int __initchr_driver_init(void);其中__init是必不可少的,在系统启动时会由内核调用chr_driver_init,完成驱动程序的初始化。
当驱动程序是以模块的形式编写时,则要按照如下方式声明: intinit_module(void)当运行后面介绍的insmod命令插入模块时,会调用init_module函数完成初始化工作。
4.设备驱动程序的开发过程
由于嵌入式设备由于硬件种类非常丰富,在默认的内核发布版中不一定包括所有驱动程序。所以进行嵌入式Linux系统的开发,很大的工作量是为各种设备编写驱动程序。除非系统不使用操作系统,程序直接操纵硬件。嵌入式Linux系统驱动程序开发与普通Linux开发没有区别。可以在硬件生产厂家或者Internet上寻找驱动程序,也可以根据相近的硬件驱动程序来改写,这样可以加快开发速度。实现一个嵌入式Linux设备驱动的大致流程如下。
(1)查看原理图,理解设备的工作原理。一般嵌入式处理器的生产商提供参考电路,也可以根据需要自行设计。
(2)定义设备号。设备由一个主设备号和一个次设备号来标识。主设备号惟一标识了设备类型,即设备驱动程序类型,它是块设备表或字符设备表中设备表项的索引。次设备号仅由设备驱动程序解释,区分被一个设备驱动控制下的某个独立的设备。
(3)实现初始化函数。在驱动程序中实现驱动的注册和卸载。(4)设计所要实现的文件操作,定义file_operations结构。(5)实现所需的文件操作调用,如read、write等。
(6)实现中断服务,并用request_irq向内核注册,中断并不是每个设备驱动所必需的。
(7)编译该驱动程序到内核中,或者用insmod命令加载模块。(8)测试该设备,编写应用程序,对驱动程序进行测试。
五、基本接口实验
在完成了基本实验后,我们开始着手基本接口实验。在这些实验中,我们学习如何编写设备驱动程序,及如何用测试程序检验驱动程序是否正确,并通过改写测试程序正常地对驱动程序进行相关操作。
1.实验十二 简单设备驱动程序
本次实验的任务是编写一个字符型设备驱动程序,并学习在应用程序中调用驱动。考虑到我们初次接触驱动程序的编写,对此还十分陌生,因此指导书中提供了本次实验所要用到的程序源代码。虽然这样一个字符型设备驱动程序并没有任何实际作用,但是它让我们轻松掌握了嵌入式驱动的编写过程,因为复杂繁琐的驱动,其骨架都是相同的。因此,看懂本实验的源代码,学习并模仿其编写方法,对于后续实验有着非常重要的意义。
2.实验十三 CPU GPIO驱动程序设计
在本实验中,我们要编写第一个针对实际硬件的驱动程序。我们知道,凡是操作系统控制外部设备,即使是最简单的硬件电路,也是需要驱动的。本实验涉及的外部硬件只有电阻和发光二极管。我们使用自己编写的驱动程序与应用程序控制 GPIO96的电平,通过 LED 的亮灭来判断,是否 CPU 做出了正确的响应。
补充代码(1)
//-------------------WRITE-----------------------ssize_tSIMPLE_GPIO_LED_write(struct file * file ,const char * buf, size_t count, loff_t * f_ops){ #ifdef OURS_GPIO_LED_DEBUG printk(“SIMPLE_GPIO_LED_write [--kernel--]n”);
#endif
return count;}
补充代码(2)
//-------------------OPEN------------------------ssize_tSIMPLE_GPIO_LED_open(structinode * inode ,struct file * file){ #ifdef OURS_GPIO_LED_DEBUG printk(“SIMPLE_GPIO_LED_open [--kernel--]n”);
#endif
MOD_INC_USE_COUNT;
return 0;}
补充代码(3)
//------------------structfile_operationsGPIO_LED_ctl_ops ={ open:SIMPLE_GPIO_LED_open, read:SIMPLE_GPIO_LED_read, write:SIMPLE_GPIO_LED_write, ioctl:SIMPLE_GPIO_LED_ioctl, release:SIMPLE_GPIO_LED_release, };实验作业
要求在目标板上LED闪烁产生亮7秒,灭2秒的效果 在测试程序中有这样一段代码: while(1){ ioctl(fd,LED_OFF);sleep(1);
sleep(1);while(1){ ioctl(fd,LED_OFF);sleep(2);
sleep(7);} 3.实验十四
中断实验
// 灭2秒 // 亮7秒 ioctl(fd,LED_ON);}
// 休眠1秒
ioctl(fd,LED_ON);只需将上面的代码改为如下代码即可:
在理论课中,我们学习了许多中断方面的知识,包括中断向量、中断优先级、中断过程等。在PXA270系统里,中断控制器分外部设备和 PXA270X 处理器设备产生的两个层次的中断,前者是初级的中断源,后者是次级中断源,大量的次级中断源通常被映射为一个初级中断源。
补充代码1 voidshowversion(void){ printk(“*********************************************n”);
printk(“t %s tn”, VERSION);
printk(“*********************************************nn”);
} static intSimpleINT_temp_count = 0;补充代码2 //-------------------READ------------------------ssize_tSIMPLE_INT_read(struct file * file ,char * buf, size_t count, loff_t * f_ops){
#ifdef OURS_INT_DEBUG
#endif return count;printk(“SIMPLE_INT_read [--kernel--]n”);} 补充代码3 //-------------------WRITE-----------------------ssize_tSIMPLE_INT_write(struct file * file ,const char * buf, size_t count, loff_t * f_ops){
#ifdef OURS_INT_DEBUG
} 补充代码4 //------------------structfile_operationsINT_ctl_ops ={ open: SIMPLE_INT_open, read: SIMPLE_INT_read, #endif return count;printk(“SIMPL_INT_write [--kernel--]n”);write:SIMPLE_INT_write, ioctl:SIMPLE_INT_ioctl, release:SIMPLE_INT_release, };
通过此实验,我了解了硬件中断管脚与中断号的对应关系,以及中断号与中断处理程序的对应关系,对于今后编写更为复杂的中断程序打下基础。
4.实验十五
数码管显示实验
在此实验中,我们要编写针对 74LV164 的驱动程序,并用其串并转换功能来控制八段LED数码管的显示。
补充代码1 voidshowversion(void){ printk(“*********************************************n”);
printk(“t %s tn”, VERSION);
printk(“*********************************************nn”);
} 补充代码2 //-------------------READ------------------------ssize_tSERIAL_LED_read(struct file * file ,char * buf, size_t count, loff_t * f_ops){ #ifdef OURS_HELLO_DEBUG
} 补充代码3 //-------------------WRITE-----------------------ssize_tSERIAL_LED_write(struct file * file ,const char * buf, size_t count, loff_t * f_ops)return count;printk(“SERIAL_LED_read [--kernel--]n”);#endif { #ifdef OURS_HELLO_DEBUG
} 补充代码4 //-------------------IOCTL-----------------------ssize_tSERIAL_LED_ioctl(structinode * inode ,struct file * file, unsigned intcmd, long data){ #ifdef OURS_HELLO_DEBUG
#endif
} 补充代码5 //-------------------OPEN------------------------ssize_tSERIAL_LED_open(structinode * inode ,struct file * file){ #ifdef OURS_HELLO_DEBUG
#endif
return 0;} MOD_INC_USE_COUNT;printk(“SERIAL_LED_open [--kernel--]n”);return 0;printk(“SERIAL_LED_ioctl [--kernel--]n”);return count;#endif write_byte(* buf);printk(“SERIAL_LED_write [--kernel--]n”);补充代码6 //-------------------RELEASE/CLOSE---------------ssize_tSERIAL_LED_release(structinode *inode ,struct file * file){ #ifdef OURS_HELLO_DEBUG
printk(“SERIAL_LED_release [--kernel--]n”);
#endif MOD_DEC_USE_COUNT;return 0;} 补充代码7 //------------------structfile_operationsSERIAL_LED_ops ={ open: SERIAL_LED_open,read: SERIAL_LED_read,write:SERIAL_LED_write,ioctl:SERIAL_LED_ioctl,release:SERIAL_LED_release, };补充代码8 staticint __initHW_SERIAL_LED_init(void){ int ret =-ENODEV;
ret =
devfs_register_chrdev(SERIAL_LED_MAJOR, &SERIAL_LED_ops);
showversion();if(ret < 0)“serial_led_ctl”,} {
} else { } return ret;printk(“ pxa270 serial_led_driver register success!![--kernel--]n”);printk(“ pxa270 init_module failed with %dn [--kernel--]”, ret);return ret;补充代码9 staticint __init pxa270_SERIAL_LED_init(void){ int ret =-ENODEV;
printk(“pxa270_SERIAL_LED_init [--kernel--]n”);
#endif
ret = HW_SERIAL_LED_init();if(ret)return ret;return 0;} 补充代码10 static void __exit cleanup_SERIAL_LED(void){ #ifdef OURS_HELLO_DEBUG #ifdef OURS_HELLO_DEBUG
#endif }
补充代码11 MODULE_DESCRIPTION(“serial_led driver module”);
MODULE_AUTHOR(“liduo”);
MODULE_LICENSE(“GPL”);
module_init(pxa270_SERIAL_LED_init);module_exit(cleanup_SERIAL_LED);使用测试程序看到的测试结果是数码管按0-9显示输出。实验作业要求在上述基础上,分别实现一下两个功能:
①要求您再编写一个测试程序,实现 PXA270-EP 目标板上的 LED 数码管循环显示的数字9-0。
②要求您再编写一个测试程序,实现 PXA270-EP 目标板上的 LED 数码管循环显示的数字02468。
由于在测试程序中定义了数组buf[10]分别存储了0-9是个数,因此上述功能的实现方法是,分别对测试程序做如下修改:
原测试程序: while(1){ for(count=0;count<10;count++){ data[0] = buf[count];ret=write(fd,data,1);sleep(1);} } 实现功能①: while(1){ for(count=9;count>=0;count--)} } 结果显示
// 倒序显示数字
{ data[0] = buf[count];ret=write(fd,data,1);sleep(1);devfs_unregister_chrdev(SERIAL_LED_MAJOR, “serial_led”);printk(“cleanup_SERIAL_LED [--kernel--]n”);实现功能②: while(1){ for(count=0;count<9;count=count+2)} } 结果显示
// 更改显数顺序
{ data[0] = buf[count];ret=write(fd,data,1);sleep(1);
通过更改显数的顺序,很容易实现实验作业里要求的功能。
5.实验十六 LED点阵驱动程序设计
通过本实验的操作,我们将 8X8 的点阵 LED 驱动起来并通过编写测试程序,使其能够按照您的意图进行显示。要求您还编写更多的测试程序
补充代码1 voidshowversion(void){ printk(“*********************************************n”);printk(“t %s tn”, VERSION);printk(“*********************************************nn”);
} 补充代码2 //-------------------READ------------------------ssize_tSIMPLE_LED_read(struct file * file ,char * buf, size_t count, loff_t * f_ops){ #ifdef OURS_LED_DEBUG
#endif return count;printk(“SIMPLE_LED_read [--kernel--]n”);} 补充代码3 //-------------------IOCTL-----------------------ssize_tSIMPLE_LED_ioctl(structinode * inode ,struct file * file, unsigned intcmd, long data){
#endif
} 补充代码4 //------------------structfile_operationsLED_ctl_ops ={ open: SIMPLE_LED_open, read:
SIMPLE_LED_read, write: SIMPLE_LED_write, ioctl: SIMPLE_LED_ioctl, release:SIMPLE_LED_release, };补充代码5 staticint __init pxa270_LED_CTL_init(void){ int ret =-ENODEV;
printk(“pxa270_LED_CTL_init [--kernel--]n”);
#endif
ret = HW_LED_CTL_init();if(ret)
return ret;#ifdef OURS_LED_DEBUG return 0;printk(“SIMPLE_LED_ioctl [--kernel--]n”);#ifdef OURS_LED_DEBUG return 0;} 补充代码6 static void __exit cleanup_LED_ctl(void){
#ifdef OURS_LED_DEBUG
#endif
} ①要求您再编写一个测试程序,实现按横的方向隔行顺序扫描 LED 点阵数码管。
②要求您再编写一个测试程序,实现按竖的方向顺序扫描 LED 点阵数码管。作业一,隔行扫描:
printk(“cleanup_LED_ctl [--kernel--]n”);outw(0x0000,ioremap_addr);
devfs_unregister_chrdev(SIMPLE_LED_MAJOR, “led_ary_ctl”);for(i=1;i<=8;i2++){
buf[0]=c;buf[1]=~r;// row for(j=1;j<=8;j++){
} r = 1;c = c<<1;
write(fd,buf,2);
printf(“buf[0],buf[1]: [%x,%x]n”,buf[0],buf[1]);usleep(200000);// sleep 0.2 second r=r<<1;
buf[1]=~r;// column
结果显示
作业二,竖向扫描:
for(i=1;i<=8;i++){
buf[0]=c;buf[1]=~r;// row for(j=1;j<=8;j++){
} r = 1;c = c<<1;
write(fd,buf,2);
printf(“buf[0],buf[1]: [%x,%x]n”,buf[0],buf[1]);usleep(200000);// sleep 0.2 second r=r<<1;
buf[1]=~r;// column
结果显示
6.实验十七 AD驱动实验
通过本实验的操作,我们将 AD 转换器驱动起来并通过编写测试程序,使其能够将模拟信号量按照我们的要求转换成数字信号量。为了更加清楚地理解 AD 转换器的工作过程,请您再编写一个测试程序,将 UCB_ADC_INP_AD0 换成其他通道,来观察其他 AD 通道情况。
补充代码1 voidshowversion(void){ printk(“%sn”,VERSION);} struct ucb1x00 *ad_ucb;
补充代码2 //-------------------READ------------------------staticssize_tadctl_read(struct file * file ,char *buf, size_t count, loff_t *offset){
} 补充代码3 //-------------------WRITE-----------------------ssize_tadctl_write(struct file * file ,const char *buf, size_t count, loff_t *offset){
#ifdef OURS_HELLO_DEBUG printk(“writen”);
#endif
} 补充代码4 //-------------------OPEN------------------------ssize_tadctl_open(structinode * inode ,struct file * file){
#ifdef OURS_HELLO_DEBUG printk(“openn”);
#endif
}
补充代码5 //-------------------RELEASE/CLOSE---------------ssize_tadctl_release(structinode *inode ,struct file * file){
#ifdef OURS_HELLO_DEBUG printk(“releasen”);
#endif return 0;return 0;return count;#ifdef OURS_HELLO_DEBUG printk(“readn”);#endif return count;} 补充代码6 staticstructfile_operationsadctl_ops = {
};补充代码7 //-------------------INIT------------------------staticint __initHW_AD_CTL_init(void){
return ret;}
补充代码8 staticint __init pxa270_AD_CTL_init(void){ int ret =-ENODEV;#ifdef OURS_HELLO_DEBUG int ret =-ENODEV;ret = devfs_register_chrdev(ADCTL_MAJOR, “adctl”, &adctl_ops);showversion();ad_ucb=ucb1x00_get();if(ret < 0){
} else { } adctl_dev_handle = devfs_register(NULL, “ad_ctl”, DEVFS_FL_DEFAULT, printk(“adctl driver register success!n”);printk(“fail %dn”,ret);return 0;read: ioctl: adctl_read, adctl_ioctl, write: adctl_write, open: adctl_open, release:adctl_release,ADCTL_MAJOR, 0, S_IFCHR, &adctl_ops, NULL);printk(“initn”);#endif ret=HW_AD_CTL_init();if(ret)}
补充代码9 static void __exit cleanup_AD_ctl(void){
}
7.实验十八 DA驱动实验
通过本实验的操作,我们使用示波器看到了通过DA转换而输出的波形。在此基础上,要求试写一个实现输出三角波的测试程序。
补充代码1 #include
} printk(“t %st n”,VERSION);printk(“*****************************n”);static long ioremap_addr;补充代码3 //-------------------READ------------------------ssize_tSIMPLE_DA_read(struct file * file ,char * buf, size_t count, loff_t * f_ops){ #ifdef OURS_DA_DEBUG
} 补充代码4 //-------------------WRITE-----------------------ssize_tSIMPLE_DA_write(struct file * file ,const char * buf, size_t count, loff_t * f_ops){
printk(“SIMPLE_DA_write[--kernel--]n”);
#endif
return count;} 补充代码5 //-------------------IOCTL-----------------------ssize_tSIMPLE_DA_ioctl(structinode * inode ,struct file * file, unsigned intcmd, outb(buf[0],ioremap_addr);#ifdef OURS_DA_DEBUG return count;#endif printk(“SIMPLE_DA_read[--kernel--]n”);long data){ #ifdef OURS_DA_DEBUG
printk(“SIMPLE_DA_ioctl[--kernel--]n”);
#endif return 0;} 补充代码6 //-------------------OPEN------------------------ssize_tSIMPLE_DA_open(structinode * inode ,struct file * file){
#ifdef OURS_DA_DEBUG printk(“SIMPLE_DA_open [--kernel--]n”);
MOD_INC_USE_COUNT;return 0;
#endif } 补充代码7 /------------------structfile_operationsDA_ctl_ops ={
read: SIMPLE_DA_read,};
补充代码8 release:
SIMPLE_DA_release, ioctl:
SIMPLE_DA_ioctl, write:
SIMPLE_DA_write, //-------------------INIT------------------------staticint __initHW_DA_CTL_init(void){ int ret =-ENODEV;
}
补充代码9 staticint __init pxa270_DA_CTL_init(void){ int ret =-ENODEV;
printk(“pxa270_DA_CTL_init [--kernel--]n”);
#endif #ifdef OURS_DA_DEBUG } printk(“ pxa270 led_driver register success!![--kernel--]n”);{ else } return ret;printk(“ pxa270: init_module failed with %dn [--kernel--]”, ret);{ if(ret < 0)showversion();ret = devfs_register_chrdev(SIMPLE_DA_MAJOR, “da_ctl”, &DA_ctl_ops);
ret = HW_DA_CTL_init();if(ret)
return ret;return 0;} 补充代码10 static void __exit cleanup_DA_ctl(void){
#endif } 补充代码11 MODULE_DESCRIPTION(“DA_ctl driver module”);MODULE_AUTHOR(“liduo”);MODULE_LICENSE(“GPL”);module_init(pxa270_DA_CTL_init);module_exit(cleanup_DA_ctl);printk(“cleanup_DA_ctl [--kernel--]n”);#ifdef OURS_DA_DEBUG
六、实验中遇到的问题及解决方法
每一次上课重新启动后,当需要将宿主PC机的根目录挂在到PXA270-EP目标板的mnt目录下(即在超级终端中输入命令“mount –o soft,timeo=100,rsize=1024 192.168.0.100:/ /mnt”)时,常显示无法挂载。
解决方法:在超级终端下的挂载命令应该用”mount –o nolock 192.168.0.100:/ /mnt”,如果依然不能挂载需要重启NFS服务,即在PC机终端中输入命令”service nfs restart”两遍后就可以挂载,当然有时候也可能是因为网线没插好。
在每次重启机器之后都需要将PC机终端的IP地址和开发板中的系统的IP地址设定正确,不然也无法挂载。
七、实验总结及心得
本学期的所有实验均在宿主PC机与PXA270-EP目标板上进行。在实验中,我们先建立硬件实验平台,又建立主机软件开发环境,接着为实验进行各项配置,最后完成了各个实验中的多种功能。值得注意的是,前期的硬件、软件准备必须完整无误地实现,后续的实验才能顺利进行。所以,打基础的工作一定要仔细谨慎。后续实验中虽然给出了驱动程序的框架,仍需要我们自己补充完整,并开动脑筋举一反三,在原代码的基础上进行一定修改以实现新的功能。
通过这学期的实验,我逐步完成了建立实验软件开发平台,搭建实验编译软件环境,在PC上编辑、编译一个应用程序,并且在嵌入式系统上运行和调试它的过程。在实验中,不难发现,编译驱动程序大体框架都是一样的,比如里面的读函数、写函数、ioctl函数、打开、关闭以及函数模块的初始化并且在超级终端上显示出等。但所不同的是,要根据不同的实验要求修改名称,并且对其中必要的部分进行修改。
除此之外,我认为很多基础知识对实验的进行也起着非常大的作用,例如数码管的显示原理。在掌握了基础知识之后,上机的过程会显得相对简单,尤其是代码框架已经给出,我们所以需要做的就是根据需要稍作改动来得到我们想要的结果。
在实验过程中常常会遇到各种各样的问题,刚开始时我不知如何是好,只能求助于老师和同学,后来随着实验的进行,我对实验的内容和虚拟机都有了一定的了解,遇到问题时也可以静下心来思考其原因,自己尝试各种方法去解决问题。整个实验让我了解了一套完整的嵌入式系统驱动程序开发的全过程,学到的内容非常丰富,相信在学习了这些内容后,在今后的学习工作中接触到类似内容,我不会感到无从下手,而是能够有条不紊。
感谢老师的辛勤指导!
第三篇:北邮数据库实验报告
数据库实验报告
(三)姓名:学号:班级:
1.用Transact-SQL语句、数据导入、SQL Server Management Studio(企业管理器)输入的方法对所给定的8张表的数据输入到数据库中。自行决定每张表的数据导入办法,但每种方法各针对二或三张表。
Transact-SQL语句: 导入department,student, student_course表。
insertinto department select*from openrowset
('microsoft.jep.oledb.4.0','excel 5.0;hdr=yes;database=D:课件数据库database2.xls',department$);
insertinto student select*from openrowset
('microsoft.jep.oledb.4.0','excel 5.0;hdr=yes;database=D:课件数据库database2.xls',student$);
insertinto student_course select*from openrowset
('microsoft.jep.oledb.4.0','excel 5.0;hdr=yes;database=D:课件数据库database2.xls',student_course$);
数据导入:
操作:选中数据库studentsdb,右键-任务-导入数据。导入book, class, course表。
SQL Server Management Studio: 操作:右键需要编辑的表,选择编辑前200行。
Teacher:
Teacher_course_class:
导入结果: Book:
Class:
Course:
Department:
Student:
Student_course:
Teacher:
Teacher_course_class:
2.用Transact-SQL向Course表中插入一条记录,course_name为空,看运行的结果。
SQL语句:
INSERTINTO course VALUES('dep02_s002', null,'dep02_s002', '72', '5', '4');运行结果:
分析:course_name有not null的约束,因此这条语句不能执行。
3.用Transact-SQL修改Course表中credit为5的记录,将其credit改为7, credit小于4的改为2,看运行的结果。
SQL语句:
update course set credit=7 where credit=5;执行结果:
分析:约束C1指定了credit的范围为1至6.SQL语句:
update course set credit=2 where credit<4;执行结果:
4.删除一条学生记录,看运行结果,对运行结果进行分析。SQL语句:
deletefrom student where student_id='g9940201';执行结果:
分析:因为有参照完整性约束,不能删除。
5.用Transact-SQL完成将编号为dep04_b001的课程的选修信息插入到一个新的选课信息表中。
SQL语句:
Creattablestudent_course2(course_idchar(20), student_idchar(20)gradeint, creditint, semesterint,school_yearchar(20),primarykey(course_id,student_id));
insertintostudent_course2 select*fromstudent_course wherecourse_id='dep04_b001';执行结果:
6.用Transact-SQL完成删除单片机原理课程的选课信息,分析运行结果。
SQL语句:
deletefrom student_course where course_id in(select course_id from course
where course_name='单片机原理')执行结果: 分析:所有课程号为dep04_s003的课程被删除。
本实验中遇到的问题和解决方法:
本实验的顺利完成需要预先作很多准备工作。以下就是我在遇到缺少组件accessdatabaseengine时的解决过程的记录。
AccessDatabaseEngine的安装
accessdatabaseengine用于和office连接,导入导出数据,本实验中需要导入excel文件。安装配合office的版本,我安装的是accessdatabaseengine2017(English)版本。安装32位版本,因office2016是32位。之前误操作安装了不能使用的老旧版本accessdatabaseengine2007,通过控制面板-应用程序卸载将其卸载了。安装accessdatabaseengine依然报错,是因为microsoftofficeclicktorun阻碍sqlserver的一些功能,需要将其卸载。这是微软推出的用于减少office打开速度的应用程序,安装office2016时会自动安装上,原理是开机时将一部分内容放到内存中,因此打开文件时会更快一些。检测自己的office是通过clickto run 还是MSI安装的,可以在word中点击文件-账户,查看产品信息,如果有下图中“office更新”这个选项,则说明安装过click to run。这个程序在控制面板-应用程序中找不到,因此用删除注册表的方式卸载。快捷键“win+R”输入“regedit”打开注册表编辑器,左边HKEY_CLASSES_ROOT-Installer-Product-00006开头的选项,有四个。单击这几个选项,在右侧查看详细信息,可以看到ProductNam是Microsoft Access database engine 2007(我原来误安装的老版本)。删除之前先备份注册表。方法一:选中要删除的文件,右键-导出,保存。只保存了要删除的文件。方法二:注册表编辑器,文件-导出,保存。保存了注册表所有信息。这是因为如果误删了重要文件会导致严重后果,可能需要重装系统,留此备份是为了可以恢复系统。
备份完之后,选中要删除的文件(00006开头的四个),右键-删除即可。回到Access database engine 32位的程序安装包,安装。我无法安装64位,可能是因为office是32位。安装成功之后就可以在sqlserver中导入excel文件了。
第四篇:北邮数字电路与逻辑设计实验报告
北京邮电大学数字电路与逻辑
设计实验报告
学院: 班级:
姓名:
学号:
实验一 Quartus II原理图输入法设计与实现
一、实验目的:
(1)熟悉Quartus II原理图输入法进行电路设计和仿真;(2)掌握Quartus II 图形模块单元的生成与调用;(3)熟悉实验板的使用;
二、实验所用器材:
(1)计算机;
(2)直流稳压电源;
(3)数字系统与逻辑设计实验开发板。
三、实验任务要求
(1)用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图形模块单元。
(2)用(1)中生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号。
(3)用3线-8线译码器(74LS138)和逻辑门设计实现函数 ,仿真验证其功能,并下载到实验板测试。要求用拨码开关设定输入信号,发光二极管显示输出信号。
四、实验原理图及仿真波形图
(1)半加器
半加器原理图
仿真波形
仿真波形图分析:根据仿真波形对比半加器真值表,可以确定电路实现了半加器的功能。但我们也可以发现输出SO出现了静态功能冒险,要消除该冒险可以加入相应的选通脉冲。
(2)全加器
全加器原理图
仿真波形
仿真波形图分析 :根据仿真波形对比半加器真值表,可以确定电路实现了全加器的功能
(2)
74138 3线-8线译码器 原理图
仿真波形图
仿真波形图分析;当且仅当ABC输入为000、010、100、111时,F=1,可知电路实现了函数。
实验二 用VHDL设计与实现组合逻辑电路
一、实验目的:
(1)熟悉用VHDL语言设计时序逻辑电路的方法;(2)熟悉用Quartus II文本输入法进行电路设计;(3)熟悉不同的编码及其之间的转换。
二、实验所用器材:
(1)计算机;
(2)直流稳压电源;
(3)数字系统与逻辑设计实验开发板。
三、实验任务要求
(1)用 VHDL语言设计实现一个共阴极7段数码管译码器;(2)用VHDL语言设计一个8421码转余三码的代码转换器;(3)用VHDL语言设计设计一个四位2进制奇校验器。
四、实验代码及仿真波形图
数码管译码器 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY shumaguanyimaqi IS
PORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
B:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
C:OUT STD_LOGIC_VECTOR(5 DOWNTO 0));END shumaguanyimaqi;
ARCHITECTURE encoder_arch OF shumaguanyimaqi IS BEGIN
PROCESS(A)BEGIN
C<=“011111”;CASE A IS
WHEN“0000”=> B<=“1111110”;--0 WHEN“0001”=> B<=“0110000”;--1 WHEN“0010”=> B<=“1101101”;--2 WHEN“0011”=> B<=“1111001”;--3 WHEN“0100”=> B<=“0110011”;--4 WHEN“0101”=> B<=“1011011”;--5 WHEN“0110”=> B<=“1011111”;--6 WHEN“0111”=> B<=“1110000”;--7 WHEN“1000”=> B<=“1111111”;--8 WHEN“1001”=> B<=“1111011”;--9 WHEN OTHERS=> B<=“ZZZZZZZ”;END CASE;END PROCESS;END encoder_arch;仿真波形图
仿真波形分析:A是输入,A0-A3是由低位到高位变化,B是数码管的各个部分,随着A输入的变化,B数码管对应译码出相应的数字显示出来。
8421码转余三码 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY jxhyusanma IS PORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
B:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END jxhyusanma;
ARCHITECTURE trans_ex3 OF jxhyusanma IS BEGIN
PROCESS(A)BEGIN CASE A IS
WHEN“0000”=> B<=“0011”;WHEN“0001”=> B<=“0100”;WHEN“0010”=> B<=“0101”;WHEN“0011”=> B<=“0110”;WHEN“0100”=> B<=“0111”;WHEN“0101”=> B<=“1000”;WHEN“0110”=> B<=“1001”;WHEN“0111”=> B<=“1010”;WHEN“1000”=> B<=“1011”;WHEN“1001”=> B<=“1100”;WHEN OTHERS=> B<=“ZZZZ”;END CASE;END PROCESS;END trans_ex3;仿真波形图
仿真波形分析:8421码转换余三码,由0111转换成为了1010可以看出功能已经实现,仿真验证了代码功能正确。奇校验
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;ENTITY jxhjijiaoyan IS PORT(A:STD_LOGIC;
B:STD_LOGIC;
C:STD_LOGIC;
D:STD_LOGIC;
F:OUT STD_LOGIC);END jxhjijiaoyan;
ARCHITECTURE one OF jxhjijiaoyan IS
SIGNAL n1,n2 : STD_LOGIC;BEGIN
n1<=A XOR B;
n2<=n1 XOR C;
F<=n2 XOR D;END one;仿真波形图
仿真波形分析:当ABCD为1111时,输出F为0,ABCD为1110时,输出F为1,可见奇校验功能得以实现。
实验三 用VHDL设计与实现时序逻辑电路
一、实验目的:
(1)熟悉用VHDL语言设计时序逻辑电路的方法;(2)熟悉用Quartus II文本输入法进行电路设计;(3)熟悉不同的编码及其之间的转换。
二、实验所用器材:
(1)计算机;
(2)直流稳压电源;
(3)数字系统与逻辑设计实验开发板。
三、实验任务要求
(1)用 VHDL语言设计实现一个8421十进制计数器;(2)用VHDL语言设计一个分频器;(3)将(1)、(2)和数码管译码器3个电路进行连接,并下载到实验板显示计数结果。
四、实验代码及仿真波形图
8421十进制计数器 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY jxhshijinzhijishuqi IS PORT(clk,reset:IN STD_LOGIC;q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END jxhshijinzhijishuqi;ARCHITECTURE a OF jxhshijinzhijishuqi IS SIGNAL q_temp:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN PROCESS(clk,reset)BEGIN IF reset='0' THEN q_temp <=“0000”;ELSIF clk'EVENT AND clk='1' THEN IF q_temp=“1001” THEN q_temp <=“0000”;ELSE q_temp <=q_temp+1;END IF;END IF;END PROCESS;q<= q_temp;END a;仿真波形图
仿真波形图分析:8421十进制计数器随着时钟的信号进行计数,restart是复位,当复位为零的时候计数器重新计数。根据仿真结果来看,8421十进制计数器功能得以实现。
分频器
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY jxhfenpinqi IS PORT(clk:IN STD_LOGIC;clear:IN STD_LOGIC;clk_out:OUT STD_LOGIC);END jxhfenpinqi;ARCHITECTURE a OF jxhfenpinqi IS SIGNAL temp:INTEGER RANGE 0 TO 11;BEGIN p1:PROCESS(clear,clk)BEGIN IF clear='0'THEN temp<=0;ELSIF clk'EVENT AND clk='1' THEN IF temp=11 THEN temp<=0;ELSE temp<=temp+1;END IF;END IF;END PROCESS p1;p2:PROCESS(temp)BEGIN IF temp<6 THEN clk_out<='0';ELSE clk_out<='1';END IF;END PROCESS p2;END a;仿真波形
仿真波形分析:分频器将频率分开,置零端正常工作,根据仿真波形可以看出来,分频器的功能得以正常实现。
组合电路
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY jxhfenpinqi IS PORT(clk:IN STD_LOGIC;clk_out:OUT STD_LOGIC);END jxhfenpinqi;ARCHITECTURE behave OF jxhfenpinqi IS SIGNAL temp:INTEGER RANGE 0 TO 24999999;SIGNAL clktmp:STD_LOGIC;BEGIN
PROCESS(clk)
BEGIN
IF clk'event AND clk='1' THEN
IF temp=24999999 THEN
temp<=0;clktmp<=NOT clktmp;
ELSE
temp<=temp+1;
END IF;
END IF;
END PROCESS;
clk_out<=clktmp;END behave;
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY jxhshijinzhi IS
PORT(CLK,CLEAR:IN STD_LOGIC;
Q: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END jxhshijinzhi;
ARCHITECTURE A OF jxhshijinzhi IS SIGNAL Q_TEMP:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN PROCESS(CLK,clear)BEGIN IF CLEAR='1'THEN
Q_TEMP<=“0000”;elsIF(CLK'EVENT AND CLK='1')THEN
IF Q_TEMP=“1001”THEN
Q_TEMP<=“0000”;
ELSE
Q_TEMP<=Q_TEMP+1;
END IF;END IF;END PROCESS;Q<=Q_TEMP;END A;
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY jxhshumaguan IS PORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
b:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
c:OUT STD_LOGIC_VECTOR(5 DOWNTO 0));
END jxhshumaguan;ARCHITECTURE seg7_arch OF jxhshumaguan IS BEGIN PROCESS(a)BEGIN c<=“011111”;CASE a IS WHEN“0000”=>b<=“01111110”;--0 WHEN“0001”=>b<=“00110000”;--1 WHEN“0010”=>b<=“01101101”;--2 WHEN“0011”=>b<=“01111001”;--3 WHEN“0100”=>b<=“00110011”;--4 WHEN“0101”=>b<=“01011011”;--5 WHEN“0110”=>b<=“01011111”;--6 WHEN“0111”=>b<=“01110000”;--7 WHEN“1000”=>b<=“01111111”;--8 WHEN“1001”=>b<=“01111011”;--9 WHEN OTHERS=>b<=“00000000”;END CASE;END PROCESS;END seg7_arch;
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY jxhzuhedianlu IS PORT(ain:IN STD_LOGIC;bin:IN STD_LOGIC;cout:OUT STD_LOGIC_VECTOR(7 downto 0);cat:OUT STD_LOGIC_VECTOR(5 downto 0));end jxhzuhedianlu;ARCHITECTURE behave OF jxhzuhedianlu IS COMPONENT jxhfenpinqi PORT(clk:IN STD_LOGIC;clk_out:OUT STD_LOGIC);END COMPONENT;COMPONENT jxhshijinzhi PORT(clk,clear:IN STD_LOGIC;q:OUT STD_LOGIC_VECTOR(3 downto 0));END COMPONENT;COMPONENT jxhshumaguan PORT(a:IN STD_LOGIC_VECTOR(3 downto 0);b:OUT STD_LOGIC_VECTOR(7 downto 0);c:OUT STD_LOGIC_VECTOR(5 downto 0));end COMPONENT;SIGNAL d:STD_LOGIC;SIGNAL f:STD_LOGIC_VECTOR(3 downto 0);BEGIN u1:jxhfenpinqi PORT MAP(clk=>ain,clk_out=>d);u2:jxhshijinzhi PORT MAP(clk=>d,clear=>bin,q=>f);u3:jxhshumaguan PORT MAP(a=>f,b=>cout,c=>cat);END behave;端口的绑定:
端口分析:Ain是时钟信号的输入绑定了18串口,bin是置零信号绑定了20 串口,cat5-0是每个数码管各自的绑定,根据板子上的串口数字绑定,cout7-0是数码管的每一个亮的部分,根据板子上的提示串口进行绑定,根据编程可以实现让数码管显示不同的数字。电路图:
代码中是使用PORT MAP 进行连接的
u1:jxhfenpinqi PORT MAP(clk=>ain,clk_out=>d);u2:jxhshijinzhi PORT MAP(clk=>d,clear=>bin,q=>f);u3:jxhshumaguan PORT MAP(a=>f,b=>cout,c=>cat);在此图中可以看出ain接分频器的clk,分频器的clk_out接十进制译码器的CLK,bin接十进制译码器的CLEAR,十进制译码器的Q接数码管的a,数码管的b,c分别接count和cat。
实验四 数码管扫描显示控制器设计与实现
一、实验目的:
1.掌握VHDL语言的语法规范,掌握时序电路描述方法。
2.掌握多个数码管动态扫描现实的原理及设计方法。
二、实验所用器材:
1.计算机:装有Quartus软件,为VHDL语言提供操作场所。
2.直流稳压电源:通过USB接口实现,为实验开发板提供稳定电源。3.数字系统与逻辑设计实验开发板:使试验结果下载到开发板上,实现整个实验的最终结果。
三、实验任务要求
1.用VHDL语言设计并实现六个数码管串行扫描电路,要求同时显示0、1、2、3、4、5这6个不同的数字图形到6个数码管上。
2.用VHDL语言设计并实现六个数码管滚动显示电路。
(1)循环左滚动,始终点亮6个数码管,左出右进。状态为:012345→123450→234501→345012→450123→501234→012345(2)向左滚动,用全灭的数码管填充右边,直至全部变灭,然后再一次从右边一个一个的点亮。状态为012345→12345X→2345XX→345XXX→45XXXX→5XXXXX→XXXXXX→XXXXX0→XXXX01→XXX012→XX0123→X01234→012345,其中“X”表示数码管不显示。
四、实验原理
多个数码管动态扫描显示,是将所有数码管的相同段并联在一起,通过选通信号分时控制各个数码管的公共端,循环依次点亮多个数码管,利用人眼的视觉暂留现象,只要扫描的频率大于50HZ,将看不到闪烁现象。如下图10-1,是多个数码管动态扫描显示的电路连接图。
当闪烁显示的发光二极管闪烁频率较高时我们将观察到持续点亮的现象。同理,当多个数码管依次显示,当切换速度够快时,我们将观察到所有数码管都是同事在显示。一个数码管要稳定显示要求显示频率>50hz,那么6个数码管则需要50*6=300hz以上才能看到持续稳定点亮的现象。
cat1~cat6是数码管选通控制信号,分别对应于6个共阴极数码管的公共端,当catn=’0’时,其对应的数码管被点亮。因此,通过控制cat1~cat6,就可以控制6个数码管循环依次点亮。
五、代码及仿真波形图
1.实现六个数码管串行扫描电路的思路及代码: 串行数码管 library ieee;
use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jxhchuanxing is port(clear,clk_in:in std_logic;
num:out std_logic_vector(6 downto 0);
cat:out std_logic_vector(5 downto 0));end jxhchuanxing;
architecture one of jxhchuanxing is
signal status:integer range 0 to 6;begin
process(clk_in)begin
if clear='0' then status<=0;
elsif(clk_in'event and clk_in='1')then
if status=6 then status<=1;
else status<=status+1;
end if;
end if;
end process;
process(status)
begin case status is
when 1 => num<=“1111110”;cat<=“011111”;
when 2 => num<=“0110000”;cat<=“101111”;
when 3 => num<=“1101101”;cat<=“110111”;
when 4 => num<=“1111001”;cat<=“111011”;
when 5 => num<=“0110011”;cat<=“111101”;
when 6 => num<=“1011011”;cat<=“111110”;
when others =>num<=“0000000”;cat<=“000000”;
end case;
end process;
end one;仿真波形:
仿真波形分析:由仿真波形可以看出数码管的串行显示得以实现,置零正常。随着时钟输入的变化,数码管进行串行显示。电路图:
端口连接:
Clk_in接18口,是时钟输入,cat5-0是每个数码管各自的绑定,根据板子上的串口数字绑定,num7-0是数码管的每一个亮的部分,根据板子上的提示串口进行绑定,根据编程可以实现让数码管显示不同的数字。
2.六个数码管滚动电路的思路及代码: 数码管滚动显示 library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity jxhgundong is port(clk:in STD_LOGIC;en: out STD_LOGIC_VECTOR(5 downto 0);z: out STD_LOGIC_VECTOR(6 downto 0));end jxhgundong;architecture quanmiegundong of jxhgundong is signal a:INTEGER RANGE 0 to 6;signal b:INTEGER RANGE 0 to 20;signal c:INTEGER RANGE 0 to 3000;signal d:INTEGER RANGE 0 to 3000;begin
p1:process(a)begin case a is when 0=>en<=“011111”;b<=c mod 12;when 1=>en<=“101111”;b<=(1+c)mod 12;when 2=>en<=“110111”;b<=(2+c)mod 12;when 3=>en<=“111011”;b<=(3+c)mod 11;when 4=>en<=“111101”;b<=(4+c)mod 12;when 5=>en<=“111110”;b<=(5+c)mod 12;when others=>null;end case;end process p1;
p2:process(clk)begin if clk'event and clk='1'then if a=5 then
a<=0;d<=1+d;else
a<=a+1;end if;if d=2999 then
d<=0;c<=c+1;end if;end if;end process p2;
p3:process(b)begin case b is when 0=> z<=“1111110”;--0 when 1=> z<=“0110000”;--1 when 2=> z<=“1101101”;--2 when 3=> z<=“1111001”;--3 when 4=> z<=“0110011”;--4 when 5=> z<=“1011011”;--5 when others=>z<=“0000000”;
end case;end process p3;
end;仿真波形:
仿真波形分析:有图可以看出,数码管滚动显示功能得以正常实现。随着时钟的输入,数码管的输出进行着滚动式变化。电路图:
端口连接图:
Clk接18口,是时钟输入,en5-0是每个数码管各自的绑定,根据板子上的串口数字绑定,z6-0是数码管的每一个亮的部分,根据板子上的提示串口进行绑定,根据编程可以实现让数码管显示不同的数字。
五、故障及问题分析
实验一
在本次实验中,由于实验较为简单,只要认真听老师讲课,细心实验,基本没有大的故障出现。出现的问题主要为 当输入频率较高时,输出结果易受器件延迟时间影响。此外,对于多输入的电路,静态功能冒险还是会存在的,在某些情况下应该加入选通脉冲来消除静态功能冒险。实验二
1.注意VHDL文件名与实体名一致,会导致编译的错误。我在实验的过程中发生过这种错误。2.在仿真波形的时候,没有合适的取好输入信号的周期,导致最终的波形超过了一个半有效周期,经老师指出进行了修改。
3.下载到板子上程序之前需要绑定串口,绑定完串口之后需要二次编译,否则功能不能实现。实验三
1.每次实验中都应该注意到VHDL的文件名应与实体名一致,如果不一致编译会报错。我在实验过程中虽然原理图设计名与工程名相同,但在其后某程序名上犯了错误,导致出错。2.在仿真波形的观察中,一定要调节好zoom一选项,缩放出便于观察的波形。3.在命名过程一定要注意规范,不要出现非法字符。4.在做10进制计数器时,由于板的固有频率为晶振的频率50兆赫兹,所以当以微秒级的时钟去自动跳变太快根本无法看清,应该加一段程序令时钟在微秒级跳变25兆次时外部时钟输出,从而令外部时钟变为秒级的,才能看见自动跳变现象。实验四
1.注意VHDL文件名和各个名字一致否则会出现编译错误。
2.板子的固有频率是50m,所以需要进行分频,数码管的实验的时候频率的高低会导致数码管显示结果的不同,要根据实际情况适当的调高调低。我在做实验的时候频率选择不合适,数码管显示不好。
3.时钟信号是高频有效还是低频有效,需要注意,我实验的时候没有太搞清楚。
4.数码管的滚动显示的时候总是出错,经过检查,是下载之前绑定串口有误,还有分频并不合适。最终实验时候时间有限,验收的是数码管的串行。
六、总结和结论
总结:
实验一:实验一是进行了简单的图形连接来进行电路的实现,总体来说较为简单,但是要注意元器件的调用,还有连接的规范,使得连接出来的电路清晰明了,简单美观。仿真的时候注意总时间的选取和输入变量的周期。
实验二:实验二是第一次进行VHDL编程,需要注意的是文件名和各个实体名一致否则会导致编译的错误。然后在仿真的时候注意总时间的选取和输入变量的周期,还有就是要会看出来自己的仿真波形是否是正确的。在下载到板子上程序之前注意串口的绑定和绑定之后逇二次编译,这次实验让我们了解了VHDL语言以及其数字电路的实现。
实验三:实验三是十进制计数器和分频器,这两个实验较为简单,由于有之前的基础在,所以比较容易实现,就是注意文件名要一致,仿真的时候注意总时间的选择以及各个变量的周期。而最后的组合电路比较难,注意上层的设置。将三个分别得电路组合在一起注意连接函数PORT MAP,还有各个端口的连接,最后下载到板子上注意串口的绑定,还有绑定之后的二次编译。最后实现功能的时候要知道时钟信号的有效频率还有就是复位。
实验四:经过之前的基础,实验四比较难,代码需要更加用心的编写。还有频率的设定需要经过实验时候的情况进行调整。这次实验我做的并不是那么的顺利,经过反省,我了解数码管有关的知识,还有串行和滚动的代码,经过努力,可以实现实验的内容。在实验的时候注意文件名的一致,仿真时候的总时间和各个变量的周期,最后下载的时候注意串口的绑定还有绑定之后的二次编译。这次最终的实验收获良多,还要虚心进行学习。老师的指责也是正确的,要对实验严谨认真。
结论: 数电实验是有关于模块的链接,VHDL的编程能力的锻炼,经过这次试验,我了解了Quartus II的使用,图形工具的使用以及VHDL的编程能力得到了很好的历练。
在这个实验课程中,经过老师的悉心教导,我们学习到了软件的使用,经过四次的实验,我们可以较为熟练的运用Quartus II的图形和VHDL语言编程来设计电路,并可以通过仿真来验证我们的电路是否正确。我们通过绑定串口之后把程序下载到板子上可以实现我们的电路的功能,在下载之前注意要进行二次编译。而且在实验三里的第三个实验,我们在验收的时候,要熟练地可以拨动开关实现零到九的变换。
老师虽然对我们很严厉,但是我们这样才能学习到更多的东西,有了更多的进步空间。
第五篇:北邮信息门户
北邮信息门户
北邮信息门户
为庆祝新中国成立 71 周年,激发我校学生爱国热情,10 月 1 日上午,我校组织全体大一新生开展了“使命在肩,奋斗有我”庆祝新中国成立 71 周年升旗仪式。校党委副书记李杰,学工部、校团委及各学院学生工作负责人参加了仪式。
英姿飒爽的国旗护卫队队员们护卫着鲜艳的五星红旗走向国旗台,伴随着庄严的中华人民共和国国歌,五星红旗冉冉升起。在场师生向国旗行注目礼,表达对伟大祖国无限的热爱和崇高的敬意!
两名学生代表做国旗下演讲。退伍士兵代表、现代邮政学院(自动化学院)学生秦志斌表达了一名退伍士兵赤诚的爱国之情和“若有战,召必回”的坚定决心;电子工程学院 2019 级学生李润泽展示出青年学生的拳拳报国之心和殷殷赤子之情。
李杰指出,在新中国成立七十一周年这个特殊的日子,我们举行隆重的升国旗仪式,为伟大祖国庆生、向新中国致敬,同时也是缅怀为新中国诞生、建设发展英勇献身的革命先烈,希望同学们在心中许下为中华民族伟大复兴而奋斗的庄重誓言。李杰强调,在今年的新冠疫情防控中,在以习近平同志为核心的党中央坚强领导下,全国人民万众一心,取得了抗击疫情的重大阶段性胜利,再一次证明了中国特色社会主义制度的优越性,希望同学们树立远大理想、志存高远,秉承“将小我融入大我、青春告白祖国”的家国情怀,勇担时代使命,刻苦学习,把自己培养成学习成绩优秀、综合素质高、全面发展的社会主义建设者和接班人,为新时代中国特色社会主义建设贡献力量。
最后,全体师生合唱校歌《传邮万里》,表达对母校的热爱之情和勇担北邮人“传邮万里,国脉所系”使命的决心。