EDN首页   博客首页

最新日志

发表于:2008/5/8 16:05:27
标签:电子设计  华南理工大学  

1

2008年华南理工大学广东北电杯电子设计大赛题目

2008年华南理工大学广东北电杯电子设计大赛题目

A    数控电压源

一、任务

设计并制作一个简易数控稳压电源。 点击下载


二、要求

(一)基本要求
1、在输入直流电压变化范围+3V~+12V 的条件下

1)输出要求:

a. 输出电压:0V+10V/DC可调,步进为0.1V,误差的绝对值小于1%

b. 最大输出电流:1A

c. 电压调整率小于1%(输入电压变化范围+3V~+12V,满载);

d. 负载调整率小于1%(输出电压为+9V,负载电流变化范围0.1A~1A);

e. 纹波电压(峰-峰值)小于输出电压的0.5%(满载时);

2 电路效率大于70%(满载时)

二)发挥部分

1 电路效率大于85%,纹波电压(峰-峰值)小于输出电压的0.2%

2 增加输出过载保护(大于1.2A)、输入过压保护(大于+13V),均提供报警指示;

3 设计并制作一个输出电压、输出电流的测量电路,并能实时显示测量值,要求测量误差的绝对值小于1%

4 其它特色与创新。

 

三、评分标准

 

应包括的主要内容或考核要点

设计

报告

方案论证

DC-DC主电路的拓扑结构;

控制方法及实现方案;

提高效率的方法及实现方案

8 

电路设计

与参数计算

 

主电路器件的选择及参数计算;

控制电路设计;

效率的分析及计算;

保护电路设计与参数计算;

人机接口的设计

20 

测试方法与数据

测试方法;测试仪器;测试数据

(着重考查方法的正确性以及数据是否全面、准确)

10 

测试结果分析

与设计指标进行比较、分析,并提出改进方法

5 

电路图及设计文件

重点考查完整性、规范性

7 

总分

50 

基本要求

实际制作完成情况

50 

发挥

部分

完成第(1)项

15

完成第(2)项

15 

完成第(3)项

15 

其他特色与创新

5 

总分

50 

 

四、说明

基本要求b中输出电流的测量以10欧负载为准,在满电压10V的输出情况,10欧负载下,输出的电流为1A

需要测量仪器:高频交流毫伏表(测量纹波电压)、电流表(测量输出电流)、10欧电阻负载(基本要求b测量);测量负载调整率需要一个功率10W以上,阻值为100欧可调的滑动电阻器或者电阻箱。


B 简易数字示波器

一、任务:

设计一个简易数字示波器

 

二、要求

(一)基本要求:

1、单通道,输入电压范围05V,波形显示无明显失真。

2、能够显示电压峰值,电压测量误差≤10%,示波器带宽≥10KHz

3LCD显示,垂直显示像素不少于50点。

4、能显示周期信号的频率。

5、支持边沿触发(上升沿、下降沿)和电平触发(触发电平在输入电压范围内可设置)。

6、存储深度不低于512字节,单个记录不少于256个点,可显示记录的波形。

7、提供基本的操作按钮。

(二)扩展功能(实现其中一项即可,两项实现按照较高一项评分)

1、双通道,实时采样频率不低于400KHz,等效采样频率不低于1MHz,最大存储深度不低于2M字节,彩色LCD显示,能够同时两个通道波形,显示分辨率不低于基本要求项中的参数,具备多种可选扫描时间设置。

2、双通道,不要求LCD显示,实时采样频率不低于200KHz,等效采样频率不低于1MHz,编写PC机虚拟示波器软件,支持把采集数据发送到PC机上显示,显示分辨率8bit,在PC机上能操作示波器,在PC机上能够保存记录。要求自编的PC机软件运行稳定,不发生死机,蓝屏现象。

 

三、评分标准

设计

报告

 

应包括的主要内容

分数

系统方案

比较与选择

方案描述

6

理论分析与计算

垂直灵敏度

频率测量设计

触发方式设计

12

电路与程序设计

电路设计

程序设计

12

测试方案与测试结果

测试方案及测试条件

测试结果完整性

测试结果分析

12

设计报告结构及规范性

摘要

设计报告正文的结构

图表的规范性

8

总分

50

基本要求

实际制作完成情况

50

发挥部分

完成第一项

50

(完成其一)

完成第二项

 

四、说明

1、示波器的存储功能,允许把数据存储在易失性存储器如RAM或者非易失性存储器如FLASH中。

2、所有测试波形若未经声明均为正弦波和方波。

3、基本功能第4点(显示信号的频率)的测试波形只需要为简单的周期信号(正弦波,三角波,方波),允许一定程度的误差(+5%以内)。


C 电子防丢器

一、基本要求

1、制作无线发射、接收装置各一个,其中一个置于钱包(或手机)(假设为A部分),另一个随身携带(假设为B部分)。正常条件下,不报警。当发射接收模块相距大于某范围(35)时,表示钱包或手机已经被人偷走,另一半装置报警,在该范围内则不报警。

2AB部分工作电压不大于5V,工作电流不超过20mA

3、天线长度不超过25cm

4、发射功率不得超过20mW

 

二、扩展功能

1、制作多套装置(实际制作两套),要求不同的发射模块能唯一识别对应的接收模块,而不受其它模块干扰。

2、采用3V纽扣电池供电。

3、报警距离可调。

4、提出论证并实现低功耗方案。(要求方案合理可行。例如采用间歇工作方式,就需要提出有效的同步措施和握手规范等)。

 

三、评分标准

设计报告

 

主要内容

满分

系统方案

总体方案设计

6

理论分析与计算

收发电路的通讯方式

发射电路分析

接收电路分析

9

电路与程序设计

发射电路设计计算

接收电路设计计算

总体电路图

通讯协议和工作模式设计

19

测试方案与测试结果

调试方法与仪器

测试方法和步骤

测试结果分析

8

设计报告结构及规范性

摘要

设计报告正文的结构

图表的规范性

8

总分

50

基本要求

实际制作完成情况

50

发挥部分

完成第(1)项

10

完成第(2)项

10

完成第(3)项

10

完成第(4)项

10

其他特色和创新

10

总分

50

 

四、说明

1、验收时需要测量电流,请在电源处预留出测试端。

2、发射功率在50欧假负载上测定。

3、扩展功能第一部分要求识别ID可变,即:假设目前装置甲的发射模块A能识别接收模块B,装置乙的发射模块能C别接收模块D;要求通过按键或者其它设定能使模块D能识别模块A,模块B能识别模块C

4、不得采用现成的无线发射接收的模块。

 


D 双向测距的电子超声尺

一、任务

设计并制作一个具有前后两对超声换能器,能完成双向测距,并显示各种参数的超声电子尺,用于测量房间相对两墙壁之间的距离。

 

二、要求

(一)基本要求

1.        设计并制作一个双向超声尺,能实现双向测距,要求提出合理的测量方案,避免超声信号的相互干扰;

2.        声速的温度自动补偿;

3.        设计并制作一个人机界面,分别显示前后距离值、当前温度值以及经过必要处理(求和、误差校正等)的总距离;

4.        要求电池供电(312V,除蓄电池外电池规格不限),提出低功耗措施;

5.        测距距离要求:测距装置离前后两墙(或天花板与地板)的距离介于0.5m5m之间,在该测量范围内测量误差<1+3cm,显示的两墙间距值测量误差<1+5cm

(二)扩展要求

1.        设计制作大动态AGC(自动增益控制)电路或者程控增益放大电路,将测距的有效距离提高至10m以上;

2.        提出并实现减少盲区的措施;

3.        提高测量精度,要求单独一个方向的测量误差<0.5+2cm,显示的两墙间距值测量误差<0.5+3cm

 

三、评分标准

设计报告

 

主要内容

满分

系统方案

总体方案设计

6

理论分析与计算

超声测距的理论分析

测量方法分析

信号处理电路与方法分析

9

电路与程序设计

基本电路的设计

补偿电路设计和关键技术应用

总体电路图

控制方法和信号处理流程

19

测试方案与测试结果

测试方法和步骤

测试结果分析

8

设计报告结构及规范性

摘要

设计报告正文的结构

图表的规范性

8

总分

50

基本要求

完成第(1)项

10

完成第(2)项

10

完成第(3)项

10

完成第(4)项

10

完成第(5)项

10

总分

50

发挥部分

完成第(1)项

15

完成第(2)项

10

完成第(3)项

15

其他特色和创新

10

总分

50

 

四、说明

1.        带有具体指标的项目需按照具体指标是否达到作为评分标准;

2.        不带具体指标的项目,如基本要求第(2)项人机界面以及扩展功能,按照实现的程度和创新程度评分。


E 基于加速度传感器的运动检测

 

一、            任务

设计一个基于加速度传感器的应用系统,该系统能检测出基本的运动方向和简单的运动轨迹。它由手持设备(含传感器)、显示终端组成。

 

手持设备(加速度传感器)

显示终端

 

数据接收模块

显示模块

1 运动检测系统框图

 

二、            要求

1.基本要求

1)      能识别水平和竖直方向运动,对轨迹长度进行量化,通过点亮的LED个数体现出来。(用LCD的话,可通过LCD的点数体现)。

2)        指示运动的方向性,在LEDLCD)上动态显示。如传感器是由左到右移动,则LED要从左向右依次点亮。

3)        操作开始和结束检测,可通过声或者光报警示意。如当需要进行距离测量时,设法通过一定手段(按钮或者自动识别特定动作)告知设备需要开始操作。要求运动开始时,点亮状态指示灯;运动结束后,指示灯熄灭。

 

2.发挥部分

1)        手持设备与显示终端通过无线通讯进行数据传输,传输距离在3以上。

2)        能在LCD或者LED上显示运动的实际距离,运动方式只需判别为水平运动和垂直运动;

例如:手拿设备,向右水平移动1,运动停止后,可以显示出当前运动的距离(根据误差范围进行评分,详见评分说明);提示:比赛过程提供长度测试基准进行测试,测试长度在1以下;

3)        通过手势识别(比如前后运动),实现基本要求(3)的功能

4)        创新应用,利用加速度传感器做些有趣的应用,比如“贪食蛇”游戏、画图程序等!说明:在显示终端扩展PS/2接口,通过手持终端的相关动作控制PC机上面的游戏操作。

5)        其他

 

三、            评分意见

31测试环境

室内常温下测试

32测试工具

提供水平和垂直的测试基准进行实际测试,基准长度不大于100cm

33作弊处理

手持设备上各按键的功能需向评分专家作出详细的功能解释;

在测试过程中,如发现作弊现象,立即取消参赛资格,并作出公开批评。

 

设计

报告

 

主要内容

分数

系统方案

实现方法

方案论证

系统设计

结构框图

12

理论分析与计算

测量与控制方法

理论计算

13

电路与程序设计

检测与驱动电路设计

总体电路图

软件设计与工作流程图

12

结果分析

创新发挥

结果分析

8

设计报告结构

及规范性

摘要

设计报告结构

图表的规范性

5

总分

50

基本

要求

实际制作完成情况

50

发挥

部分

完成第(1)项

10

完成第(2)项

10

完成第(3)项

10

完成第(4)项

15

其他

5

总分

50

 

34基本要求和发挥部分详细指标评分标准

 

要求

各项内容

分数

未完成(0分)

完成效果

得分

一般(50%

较好

80%

100%

基本要求

水平、垂直运动识别

20

不能识别

能识别,但没有体现量化距离,看不出长短

能识别,量化效果一般,看得出长短

能识别,量化效果好,长短进一步细化

 

方向识别

15

不能识别

有依次点亮或显示,但不明显(长度不够,速度太快等)

有明显的方向显示

 

操作开始和结束检测

15

不能识别

有声音或者指示灯识别

声、光都有识别

 

发挥部分

无线传输

10

3以下

3以上

4以上

 

运动距离显示

10

不能显示

或误差大于50%

误差30%~40%

误差10%~30%

误差小于10%

 

手势识别

10

未完成

通过其它二维移动完成

通过三维的前后移动完成

 

有趣游戏

15

未完成

有游戏的界面,但操作不灵活

游戏基本

能操作完成

有创意,控制精确

 

其他

5

未完成

有创意,但不好使用

有创意,控制精确

 

 

 

 

 

 

 

 

总分

 

 

 

 

 

 

 

 

四、            说明:

一、在“水平、垂直运动识别” “方向识别” “运动距离显示”这3项功能需要测试三次

三次都不能实现的,该功能没有完成,得0分;

有一次实现功能,得“一般”;

有两次实现功能,并能达到上表的相应完成效果,得“较好”;

三次全部实现功能,并能达到上表的相应完成效果,得“好”,该项的满分。

二、为了公平起见和验收时标准统一,比赛用的加速度传感器统一使用我们提供的传感器,初定每队可凭参赛的题目报名表拿一个传感器,调试时弄坏了可以换一个传感器,若再弄坏了,参赛队自行解决。

三、验收测试平台可以是水平桌面、竖直墙面,圆的铁线等,我们只定量要求长度和圆的大小,如果参赛队想用自己的测试平台,可以连同作品一起带到测试现场验收。

 

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(0) | 阅读(1851)
发表于:2008/1/19 17:22:28
标签:全国电子设计大赛  

2

全国电子设计大赛一等奖的论文下载

            这是我和队友参加2007年全国电子设计大赛一等奖的比赛论文,题目是音频信 号分  析仪(A题),需要的就下吧:

                     doc

 

 

    

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(5) | 阅读(8546)
发表于:2007/10/2 9:06:48
标签:FFT  

4

全国电子设计大赛FFT的实现

    第八届全国大学生电子设计大赛终于落下帷幕了.经过半年的努力,总算有了回报,拿了个全国一等奖.经过这段时间的历练,懂得了很多事和某些人,我觉得这是远远超过技术本身的收获.

     我们做的是A题音频信号分析仪.主要核心是快速傅立叶算法(FFT)的实现.下面就把我们用到的一些有关FFT的资料公布出来.

    一,美信公司的技术文档,针对MAXQ2000系列中的一款16位、低功耗µCC语言编写的定点FFT.

    rar

   二,嵌入式系统中的FFT算法,这里用到的是浮点计算.

     doc

   ,以下是我们写的实现1,2,4,8,16,32,64,128,256,512,1024,2048点的浮点FFT计算代码,利用查表的方法.

     doc--fft.c

     doc--table.h

 

 

 

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(12) | 阅读(2999)
发表于:2007/8/19 9:14:16
标签:FIFO  FPGA  

1

FIFO(转)


1.什么是FIFO?
FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。

2.什么情况下用FIFO?
FIFO一般用于不同时钟域之间的数据传输,比如FIFO的一端时AD数据采集,另一端时计算机的PCI总线,假设其AD采集的速率为16位 100K SPS,那么每秒的数据量为100K×16bit=1.6Mbps,而PCI总线的速度为33MHz,总线宽度32bit,其最大传输速率为1056Mbps,在两个不同的时钟域间就可以采用FIFO来作为数据缓冲。另外对于不同宽度的数据接口也可以用FIFO,例如单片机位8位数据输出,而DSP可能是16位数据输入,在单片机与DSP连接时就可以使用FIFO来达到数据匹配的目的。

3.FIFO的一些重要参数
FIFO的宽度:也就是英文资料里常看到的THE WIDTH,它只的是FIFO一次读写操作的数据位,就像MCU有8位和16位,ARM 32位等等,FIFO的宽度在单片成品IC中是固定的,也有可选择的,如果用FPGA自己实现一个FIFO,其数据位,也就是宽度是可以自己定义的。

FIFO的深度:THE DEEPTH,它指的是FIFO可以存储多少个N位的数据(如果宽度为N)。如一个8位的FIFO,若深度为8,它可以存储8个8位的数据,深度为12 ,就可以存储12个8位的数据,FIFO的深度可大可小,个人认为FIFO深度的计算并无一个固定的公式。在FIFO实际工作中,其数据的满/空标志可以控制数据的继续写入或读出。在一个具体的应用中也不可能由一些参数算数精确的所需FIFO深度为多少,这在写速度大于读速度的理想状态下是可行的,但在实际中用到的FIFO深度往往要大于计算值。一般来说根据电路的具体情况,在兼顾系统性能和FIFO成本的情况下估算一个大概的宽度和深度就可以了。而对于写速度慢于读速度的应用,FIFO的深度要根据读出的数据结构和读出数据的由那些具体的要求来确定。
满标志:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。
空标志:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。
读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。
写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。
读指针:指向下一个读出地址。读完后自动加1。
写指针:指向下一个要写入的地址的,写完自动加1。
读写指针其实就是读写的地址,只不过这个地址不能任意选择,而是连续的。

4.FIFO的分类
根均FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟。在时钟沿来临时同时发生读写操作。异步FIFO是指读写时钟不一致,读写时钟是互相独立的。

5.FIFO设计的难点
FIFO设计的难点在于怎样判断FIFO的空/满状态。为了保证数据正确的写入或读出,而不发生益处或读空的状态出现,必须保证FIFO在满的情况下,不能进行写操作。在空的状态下不能进行读操作。怎样判断FIFO的满/空就成了FIFO设计的核心问题。由于同步FIFO几乎很少用到,这里只描述异步FIFO的空/满标志产生问题。
在用到触发器的设计中,不可避免的会遇到亚稳态的问题(关于亚稳态这里不作介绍,可查看相关资料)。在涉及到触发器的电路中,亚稳态无法彻底消除,只能想办法将其发生的概率将到最低。其中的一个方法就是使用格雷码。格雷码在相邻的两个码元之间只由一位变换(二进制码在很多情况下是很多码元在同时变化)。这就会避免计数器与时钟同步的时候发生亚稳态现象。但是格雷码有个缺点就是只能定义2^n的深度,而不能像二进制码那样随意的定义FIFO的深度,因为格雷码必须循环一个2^n,否则就不能保证两个相邻码元之间相差一位的条件,因此也就不是真正的各雷码了。第二就是使用冗余的触发器,假设一个触发器发生亚稳态的概率为P,那么两个及联的触发器发生亚稳态的概率就为P的平方。但这回导致延时的增加。亚稳态的发生会使得FIFO出现错误,读/写时钟采样的地址指针会与真实的值之间不同,这就导致写入或读出的地址错误。由于考虑延时的作用,空/满标志的产生并不一定出现在FIFO真的空/满时才出现。可能FIFO还未空/满时就出现了空/满标志。这并没有什么不好,只要保证FIFO不出现overflow or underflow 就OK了。
很多关于FIFO的文章其实讨论的都是空/满标志的不同算法问题。
在Vijay A. Nebhrajani的《异步FIFO结构》一文中,作者提出了两个关于FIFO空/满标志的算法。
第一个算法:构造一个指针宽度为N+1,深度为2^N字节的FIFO(为便方比较将格雷码指针转换为二进制指针)。当指针的二进制码中最高位不一致而其它N位都相等时,FIFO为满(在Clifford E. Cummings的文章中以格雷码表示是前两位均不相同,而后两位LSB相同为满,这与换成二进制表示的MSB不同其他相同为满是一样的)。当指针完全相等时,FIFO为空。这也许不容易看出,举个例子说明一下:一个深度为8字节的FIFO怎样工作(使用已转换为二进制的指针)。FIFO_WIDTH=8,FIFO_DEPTH= 2^N = 8,N = 3,指针宽度为N+1=4。起初rd_ptr_bin和wr_ptr_bin均为“0000”。此时FIFO中写入8个字节的数据。wr_ptr_bin =“1000”,rd_ptr_bin=“0000”。当然,这就是满条件。现在,假设执行了8次的读操作,使得rd_ptr_bin =“1000”,这就是空条件。另外的8次写操作将使wr_ptr_bin 等于“0000”,但rd_ptr_bin 仍然等于“1000”,因此FIFO为满条件。
显然起始指针无需为“0000”。假设它为“0100”,并且FIFO为空,那么8个字节会使wr_ptr_bin =“1100”,, rd_ptr_bin 仍然为“0100”。这又说明FIFO为满。
在Vijay A. Nebhrajani的这篇《异步FIFO结构》文章中说明了怎样运用格雷码来设置空满的条件,但没有说清为什么深度为8的FIFO其读写指针要用3+1位的格雷码来实现,而3+1位的格雷码可以表示16位的深度,而真实的FIFO只有8位,这是怎么回事?而这个问题在Clifford E. Cummings的文章中得以解释。三位格雷码可表示8位的深度,若在加一位最为MSB,则这一位加其他三位组成的格雷码并不代表新的地址,也就是说格雷码的0100表示表示7,而1100仍然表示7,只不过格雷码在经过一个以0位MSB的循环后进入一个以1为MSB的循环,然后又进入一个以0位MSB的循环,其他的三位码仍然是格雷码,但这就带来一个问题,在0100的循环完成后,进入1000,他们之间有两位发生了变换,而不是1位,所以增加一位MSB的做法使得该码在两处:0100~1000,1100~0000有两位码元发生变化,故该码以不是真正的格雷码。增加的MSB是为了实现空满标志的计算。Vijay A. Nebhrajani的文章用格雷码转二进制,再转格雷码的情况下提出空满条件,仅过两次转换,而Clifford E. Cummings的文章中直接在格雷码条件下得出空满条件。其实二者是一样的,只是实现方式不同罢了。

第二种算法:Clifford E. Cummings的文章中提到的STYLE #2。它将FIFO地址分成了4部分,每部分分别用高两位的MSB 00 、01、 11、 10决定FIFO是否为going full 或going empty (即将满或空)。如果写指针的高两位MSB小于读指针的高两位MSB则FIFO为“几乎满”,

若写指针的高两位MSB大于读指针的高两位MSB则FIFO为“几乎空”。


在Vijay A. Nebhrajani的《异步FIFO结构》第三部分的文章中也提到了一种方法,那就是方向标志与门限。设定了FIFO容量的75%作为上限,设定FIFO容量的25%为下限。当方向标志超过门限便输出满/空标志,这与Clifford E. Cummings的文章中提到的STYLE #2可谓是异曲同工。他们都属于保守的空满判断。其实这时输出空满标志FIFO并不一定真的空/满。
说到此,我们已经清楚地看到,FIFO设计最关键的就是产生空/满标志的算法的不同产生了不同的FIFO。但无论是精确的空满还是保守的空满都是为了保证FIFO工作的可靠。

6.关于FIFO的一点的思考

关于FIFO丢数据的问题,其实各位对同一个问题的理解有偏差,才造成了相互误解。如果在理想状况下(时钟同步不回出现错码),FIFO由读写指针控制是不会丢数的,(这不是废话吗,现实中哪来的理想状况!)且慢,我的意思是说丢数据并不是读写谁快谁慢造成的,在正确的设置空满标志算法的情况下,数据的overflow 和underflow 是不会发生的。而往往现实中因为亚稳态的存在,才出现了丢数的情况,也就是说是只要读写时钟不同步,在采样的过程中采样出错,使得本该是0100的变成了1101等等,就会出现读写的错误,我们称其为丢数,其原因就是在时钟同步指针的时候出现亚稳态,由于二进制码加1的时候很多位同时变化,所以很容易出现亚稳态。因此才用格雷码将此问题发生的概率比降到最小,其次用多余的触发器使其概率进一步降低,也就是说错误难免,但我们可以将其发生的概率降到最低,并且在出现错误时也不会错的态离谱(详见Vijay A. Nebhrajani的《异步FIFO结构》第二篇)。
    二进制码指针并非不好用,在前面也提到了它有自身的优势,由于通过设置握手信号,指针可以有多位同时变化,二进制指针每次移动可以跳跃过任意的长度,这样给FIFO的某些功能的实现带来了方便(例如,硬件直接控制FIFO从缓存的数据流中丢弃一个出错的包);而格雷码指针一般只能做递增或递减的移动。设置握手信号虽然可以保证指针不出错,但这样你来我往的经过三四个回合才能开始传数据,所以对于高速的场合就不适用了。



参考文献:
Vijay A. Nebhrajani的《异步FIFO结构》

Clifford E. Cummings的《Simulation and Synthesis Techniques for Asynchronous FIFO design》和

《Simulation and Synthesis Techniques for Asynchronous FIFO Design with Asynchronous Pointer Comparisons》

系统分类: CPLD/FPGA   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(1825)
发表于:2007/7/27 17:37:44
标签:数字钟  VerilogHDL  

4

数字钟VerilogHDL代码

// *********************************************************************
// 数字钟VerilogHDL代码
//2007.7.27 by Levension @SCUT

//参考网上范例修改的
// *********************************************************************

module clock_main(clk_4Hz,mode,sel,add,alert,hour,min,sec,msec,LD);

input clk_4Hz;
input mode,sel,add;
output alert;
output [7:0] hour,min,sec,msec;
output [2:0] LD;

reg[7:0] hour,min,sec,msec,thour,tmin,tsec,ahour,amin,asec;
reg ath,atm,ats,aah,aam,aas;


reg [2:0]LD;

reg clk_1Hz,start,m_clk,h_clk;
reg [1:0] cnt,Nmode,Bsel;

wire ct1,ct2,ct3,cta,ctb,ctc;

parameter TIMER="2"'b00,
    SETTM="2"'b01,
    ALERT="2"'b10;

always @(posedge clk_4Hz)   //产生1Hz
   begin
   cnt<=cnt==3?0:cnt+1;
   if(cnt<2) clk_1Hz=0;
     else    clk_1Hz=1;
   end

always @(negedge mode)      //模式选择
  begin
  if(Nmode==2'd2) Nmode<=2'd0;
  else Nmode<=Nmode+1;
  end


always
  case(Nmode)                //发光二极管指示模式
   TIMER:LD<=3'b110;
    SETTM:LD<=3'b101;
    ALERT:LD<=3'b011;
  endcase


always @(negedge sel)         //调整位置选择 
  if(Nmode==SETTM||Nmode==ALERT)
       begin
       if(Bsel==2'd2) Bsel<=2'd0;
       else Bsel<=Bsel+1;
       end


always                       //add调整信号
begin
 case(Nmode)
 SETTM:                       //设置时间
  begin
   case(Bsel)
    2'd0:ath <=~add;
    2'd1:atm <=~add;
    2'd2:ats <=~add;
    endcase
   {aah,aam,aas}<=0;
  end
 ALERT:                         //设置闹鳞
  begin
  case(Bsel)
   2'd0:aah <=~add;
   2'd1:aam <=~add;
   2'd2:aas <=~add;
  endcase
  {ath,atm,ats} <=0;
  end
 default:
  {aah,aam,aas,ath,atm,ats}<=0;
 endcase
end


assign ct1=(ats&clk_4Hz)|(!ats&clk_1Hz); //ct1 用于计时、校时中的秒计数
assign ct2=(atm&clk_4Hz)|(!atm&m_clk);  //ct2 用于计时、校时中的分计数
assign ct3=(ath&clk_4Hz)|(!ath&h_clk);  //ct3用于计时、校时中的时计数

assign cta=(aas&clk_4Hz);              //cta用于闹铃秒计数
assign ctb=(aam&clk_4Hz);              //ctb用于闹铃分计数
assign ctc=(aah&clk_4Hz);             //ctc用于闹铃时计数

always @(posedge ct1)                  //秒计时和秒调整进程
begin
 if(tsec==8'h59)
    begin
    tsec<=0;
    m_clk<=1;
    end
 else
 begin
 if(tsec[3:0]==4'b1001)
   begin
   tsec[3:0]<=4'b0000;
   tsec[7:4]<=tsec[7:4]+1;
   end
 else tsec[3:0]<=tsec[3:0]+1;
    m_clk<=0;
 end
end

always @(posedge ct2) //分计时和分调整进程
begin
 if(tmin==8'h59)
  begin
  tmin <=0;
  h_clk <=1;
  end
  else
  begin
  if(tmin[3:0]==9)
  begin
  tmin[3:0]<=0;
  tmin[7:4]<=tmin[7:4]+1;
  end
  else tmin[3:0]<=tmin[3:0]+1;
  h_clk<=0;
  end
end


always @(posedge ct3)   //小时计时和小时调整进程
if(thour==8'h23) thour<=0;
else if(thour[3:0]==9)
begin
thour[7:4]<=thour[7:4]+1;
thour[3:0]<=0;
end
else thour[3:0]<=thour[3:0]+1;

always @(posedge cta)       //闹铃秒调整进程
begin
 if(asec==8'h59)
    asec<=0;
 else
 begin
 if(asec[3:0]==4'b1001)
   begin
   asec[3:0]<=4'b0000;
   asec[7:4]<=asec[7:4]+1;
   end
  else asec[3:0]<=asec[3:0]+1;
 end
end

always @(posedge ctb)        //闹铃分调整进程
begin
 if(amin==8'h59)
  amin <=0;
  else
  begin
  if(amin[3:0]==9)
  begin
  amin[3:0]<=0;
  amin[7:4]<=amin[7:4]+1;
  end
  else amin[3:0]<=amin[3:0]+1;
  end
end


always @(posedge ctc)                    //闹铃时调整进程
if(ahour==8'h23) ahour<=0;
else if(ahour[3:0]==9)
begin
ahour[7:4]<=ahour[7:4]+1;
ahour[3:0]<=0;
end
else ahour[3:0]<=ahour[3:0]+1;

assign alert=((ahour==thour)&&(amin==tmin)&&(Nmode==TIMER))?1:0;   //闹铃功能

always   //显示控制
case(Nmode)
TIMER: begin hour<=thour; min<=tmin; sec<=tsec; msec<=0; end
SETTM: begin hour<=thour; min<=tmin; sec<=tsec; msec<=0; end
ALERT: begin hour<=ahour; min<=amin; sec<=asec; msec<=0; end
endcase

endmodule

系统分类: CPLD/FPGA   |    用户分类:    |    来源: 原创

评论(0) | 阅读(2039)
发表于:2007/7/26 21:24:45
标签:verilog  

4

LED动态扫描verilog代码

//************************************************************
//LED动态扫描verilog 代码,D1~8为数码管输入
//2007.07.26 By levension @SCUT
//************************************************************
module LED(clk,segout,bitout,D1,D2,D3,D4,D5,D6,D7,D8);

input clk;
input [3:0] D1,D2,D3,D4,D5,D6,D7,D8;
output [3:0] segout;
output [7:0] bitout;

reg [3:0] segout;
reg [7:0] bitout;

parameter S0=3'd0,            //采用状态机的方法
          S1=3'd1,
    S2=3'd2,
    S3=3'd3,
    S4=3'd4,
    S5=3'd5,
    S6=3'd6,
    S7=3'd7;

reg [2:0] state;
 
always @(posedge clk)
 begin
 case(state)
    S0:                                    //第1个数码管
  begin
  segout <=D1;
  bitout <=8'b0000_0001;
  state=S1;
  end
    S1:                                  //第2个数码管
  begin
  segout <=D2;
  bitout <=8'b0000_0010;
  state=S2;
  end
    S2:                                  //第3个数码管
  begin
  segout <=D3;
  bitout <=8'b0000_0100;
  state=S3;
  end
    S3:                                  //第4个数码管
  begin
  segout <=D4;
  bitout <=8'b0000_1000;
  state=S4;
  end
    S4:                                  //第5个数码管
  begin
  segout <=D5;
  bitout <=8'b0001_0000;
  state=S5;
  end
    S5:                                   //第6个数码管
  begin
  segout <=D6;
  bitout <=8'b0010_0000;
  state=S6;
  end
    S6:                                     //第7个数码管
  begin
  segout <=D7;
  bitout <=8'b0100_0000;
  state=S7;
  end
    S7:                                    //第8个数码管
  begin
  segout <=D8;
  bitout <=8'b1000_0000;
  state=S0;
  end
 endcase
 end
endmodule

系统分类: CPLD/FPGA   |    用户分类:    |    来源: 原创

评论(0) | 阅读(2046)
发表于:2007/7/26 14:55:01
标签:verilog  

4

键盘扫描verilog代码

今天,第一次在CPLD板上实现了第一个数字电路4×4键盘扫描的verilog 代码,欢迎大家讨论。

// *********************************************************************
// 键盘扫描VerilogHDL代码
//2007.7.26 by Levension @SCUT
// *********************************************************************

module keypad(keyval,y,x,clk);
   
    output [4:0] keyval; //返回的键值
    output [3:0] x;     //输出,列坐标
    input  [3:0] y;     //输入,行坐标
    input  clk;         //时钟源
   
    reg [4:0] keyval;
    reg [3:0] x;
   
    parameter clkdiv="2048"; 
    parameter S0=4'd0,      //状态机
              S1=4'd1,
              S2=4'd2,
              Wait="4"'d3,
              R0=4'd8,
              R0Temp=4'd9,
              R1=4'd10,
              R1Temp=4'd11,
              R2=4'd12,
              R2Temp=4'd13,
              R3=4'd14,
              R3Temp=4'd15;
             
    reg [3:0] state;
   
    reg [11:0] cnt;                        //2.048MHz,分频因子,分为1000Hz
    always @(posedge clk)
      cnt <= cnt==clkdiv ? 0 : cnt+1;
   
    reg clken;
    always @(posedge clk)
      clken <= cnt==clkdiv;
   
     always @(posedge clk)                 //键盘扫描部分
     if(clken)
       begin
       case(state)
           S0:              //判断是否按键按下
             begin
             x<=4'b0000;
             state="S1";
             end
            S1:
             begin
             if(y==4'b1111)  //无按键,返回
             state="S0";
             else
             x<=4'b0000;
             repeat(204800) @(posedge clk);  //延时100ms,消抖    
             state="S2";            
             end
            S2:
             begin
             if(y==4'b1111)
             state="S0";
             else
             state="R0Temp";                    
             end
            R0Temp:                              //扫描第一列
             begin
             x<=4'b1110;
             state="R0";
             end
            R0:
              case(y)
                  4'b1111:
                     state="R1Temp";
                  4'b0111:
                     begin
                     keyval<=5'd1;
                     state="Wait";
                     end
                  4'b1011:
                     begin
                     keyval<=5'd5;
                     state="Wait";
                     end
                  4'b1101:
                     begin
                     keyval<=5'd9;
                     state="Wait";
                     end
                  4'b1110:
                     begin
                     keyval<=5'd13;
                     state="Wait";
                     end
                   default:
                      state="Wait";  
                   endcase
               R1Temp:                              //扫描第二列
                begin
                x<=4'b1101;
                state="R1";
                end
               R1:
                 case(y)
                  4'b1111:
                     state="R2Temp";
                  4'b0111:
                     begin
                     keyval<=5'd2;
                     state="Wait";
                     end
                  4'b1011:
                     begin
                     keyval<=5'd6;
                     state="Wait";
                     end
                  4'b1101:
                     begin
                     keyval<=5'd10;
                     state="Wait";
                     end
                  4'b1110:
                     begin
                     keyval<=5'd14;
                     state="Wait";
                     end
                   default:
                      state="Wait";  
                    endcase
              R2Temp:                                   //扫描第三列
               begin
               x<=4'b1011;
               state="R2";
               end
               R2:
               case(y)
                  4'b1111:
                     state="R3Temp";
                  4'b0111:
                     begin
                     keyval<=5'd3;
                     state="Wait";
                     end
                  4'b1011:
                     begin
                     keyval<=5'd7;
                     state="Wait";
                     end
                  4'b1101:
                     begin
                     keyval<=5'd11;
                     state="Wait";
                     end
                  4'b1110:
                     begin
                     keyval<=5'd15;
                     state="Wait";
                     end
                   default:
                     state="Wait";  
                   endcase
             R3Temp:                                //扫描第四列
               begin
               x<=4'b0111;
               state="R3";
               end
             R3:
               case(y)
                  4'b1111:
                     state="Wait";
                  4'b0111:
                     begin
                     keyval<=5'd4;
                     state="Wait";
                     end
                  4'b1011:
                     begin
                     keyval<=5'd8;
                     state="Wait";
                     end
                  4'b1101:
                     begin
                     keyval<=5'd12;
                     state="Wait";
                     end
                  4'b1110:
                     begin
                     keyval<=5'd16;
                     state="Wait";
                     end
                   default:
                      state="Wait";
                   endcase
                Wait:                                      //返回S0状态
                   state="S0"; 
                endcase
           end
       
endmodule

系统分类: CPLD/FPGA   |    用户分类:    |    来源: 原创

评论(5) | 阅读(2351)
发表于:2007/5/17 10:37:33
标签:ucosii  

6

UCOSII在凌阳61单片机上移植

UCOSII2.80在凌阳61单片机上移植.

            rar

希望对你有用!

系统分类: 嵌入式   |    用户分类:    |    来源: 整理

评论(0) | 阅读(1295)
发表于:2007/5/17 10:17:36
标签:ucosii  

5

UCOSII在KEILC51上的移植

UCOSII在KEILC51上的移植,这里有两个版本:

一个是杨屹先生移植的,采用64K,large模式编译的.

                          rar

一个是李章林先生移植的,采用64K,small模式编译的.

                          rar

希望对大家有用!

 

系统分类: 单片机   |    用户分类:    |    来源: 整理

评论(0) | 阅读(1246)
发表于:2007/5/1 16:22:59
标签:linux  

6

推荐不错的linux设备驱动教程

linux设备驱动教程(天极网)

linux设备驱动程序设计入门:http://soft.yesky.com/lesson/1/2648001.shtml

为系统处理器编写Linux设备驱动程序:http://os.yesky.com/lin/361/2608361.shtml

lux设备驱动程序设计入门
l

系统分类: 软件开发   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(1627)
23456Next >Total , Page /