西安交通大学电子系统设计专题实验.(DOC)
【西安交通大学】【数字逻辑实验】【实验分析方案】【参考样本】

实验报告的格式封面内容:标题:数字逻辑电路专题实验报告副标题:——<设计工程的名称)班级:姓名:学号:同组成员:(姓名>日期:联系电话:报告的内容:1.实验目的2.实验工程名称与实现的功能目标3.详细的系统设计方案:系统模块图、状态图、状态表、ASM图等;4.各功能模块说明:子模块电路原理图、状态图、状态表、ASM图等;各逻辑图、表达式、或HDL代码的分析及其相关说明等;输入、输出信号的时间图<时序图);6. 测试结果的分析:模拟仿真时各种输入、输出信号的时间图<时序图);实验的测试结果的讨论:包括实验中间结果、仿真的最终结果的分析,是否达到预期的目标与效果;遇到的问题及解决的方法。
7. 实验总结:对设计实现的工程进行评价,总结经验,尤其是对工程的进一步完善提出意见。
9.参考书或文献目录参考报告样本:数字逻辑电路专题实验报告——多功能数字钟设计班级:计算机71姓名:王三学号: 070552**同组者:孙一波日期:2009年6月30日联系电话:82670039目录一.实验目的3二.设计工程实现的目标4三.工程设计概要41. 工程整体设计概述:42. 工程设计特点:43. 个人任务说明:4四.系统设计方案51. 系统功能模块示意图:52. 功能模块说明:5总控电路5电子钟计时电路:8秒表计时电路:8电子钟、秒表显示电路:8 五.测试结果及分析91. 模拟仿真测试方案:92. 分频器模拟仿真测试波形图:93. 总控模块模拟仿真测试电路图:114. 总控模块模拟仿真测试波形图:11 六.工程总结12七.结束语12八.参考书13一.实验目的数字逻辑电路专题实验是对“数字逻辑”课程内容的全面、系统的总结、巩固和提高的一项课程实践活动。
根据数字逻辑的特点,选择相应的题目,在老师的指导下,由学生独立完成。
目的是通过实验使学生掌握数字逻辑电路设计的基本方法和技巧,正确运用MaxPlusⅡ软件及实验室多功能学习机硬件平台,完成所选题目的设计任务,并掌握数字逻辑电路测试的基本方法,训练学生的动手能力和思维方法。
西安交通大学数字电子技术实验报告

西安交通大学数字电子技术实验报告实验三、ISE基础实验预习:(1)安装ISE13.4软件。
(2)按照视频文件“Verilog语言输入法D_Flip_Flop.exe”进行演练。
实验内容和步骤:下载开发板相关器件的Datasheet,了解其性能。
按照P249附录A“FPGA实验预习报告模板”中的内容和步骤,完成D触发器的设计、综合、实现、仿真和下载全过程,熟悉ISE编程环境和用Adept下载编程文件的方法。
1.在G盘用自己的学号建立文件夹,进入用自己学号建立的文件夹后,再建立本次实验的文件夹,及本次实验所建工程的文件夹,文件夹名可以起名为:D_Flip_Flop、My_FirstISE、或Experiment_1、或Test_1,等等。
2.建立工程文件。
3.输入D触发器的Verilog程序。
4.编写D触发器的约束文件。
5.综合、实现及生成编程文件。
6.基于ISim的行为仿真。
7.采用Adept软件下载*.bit 程序到开发板。
8.测试D触发器的逻辑功能。
通过D触发器设计熟悉ISE软件后,自己设计一个门电路,例如与非门,重复以上ISE 软件的使用步骤。
验收:1.按照老师布置的逻辑门电路设计Verilog语言程序、约束文件、下载、仿真。
要能说明任一时刻输入输出的逻辑关系。
2.能够用开发板演示所设计的逻辑功能。
实验程序1.VERILOG工程文件module D_Flip_Flop(input clk,input set,input D,input clr,output reg q //注意:always模块中的输出必须是寄存器型变量);always @(posedge clk or posedge clr or posedge set)beginif(clr) q<=0;else if(set) q<=1;else q<=D;endendmodule2.约束文件NET "clk" LOC ="B8"; //时钟NET "D" LOC ="N3"; //SW7NET "set" LOC ="L3"; //SW1NET "clr" LOC ="P11"; //SW0NET "q" LOC ="G1"; //LD73.仿真文件module test_D_Flip_Flop;// Inputsreg clk;reg set;reg D;reg clr;// Outputswire q;// Instantiate the Unit Under Test (UUT) D_Flip_Flop uut (.clk(clk),.set(set),.D(D),.clr(clr),.q(q));initial begin// Initialize Inputsclk=0;set=1;D=0;clr=0;// Wait 100 ns for global reset to finish #100;// Add stimulus hereEndalways#10clk=~clk;always#12D=~D;always#33clk=~clk;always#42set=~set;endmodule仿真结果:实验四、组合逻辑电路实验Ⅰ(2学时)组合逻辑Ⅰ:(1)使用VERILOG设计一个新的逻辑功能(比如四输入或门、或非门、与或非门等等),并在开发板上验证,比如:进实验室前编写好VERILOG源文件、约束文件和仿真文件(见4.1.2,P101(2))。
西安交通大学电子专题实验实验报告

一:实验目的和要求
(1)了解完整的PCB板设计工序及方法;
(2)掌握制作元件原理图库、封装库的方法;
(3)掌握PCB板设计方法及其后处理;
(4)学习并掌握Protel DXP软件平台。
二:实验用仪器和软件环境
(1)微机(最低配置: Pentium 4 CPU, 128M内存);
(2)Protel DXP 2004软件;
(3)Windows XP环境
三:实验设计题目及实现的功能
本实验要求在Protel DXP软件平台上设计AVR单片机开发板电路的PCB板,根据学号分配任务,我要画的是RST、OSC、Power 、JTAG、LED、红外的电路图及对应的PCB板。
Protel DXP允许你从原理图直接运行一个大型电路仿真的阵列,通过仿真,可以显示它的波形。
四:实验步骤及结果
(1)创建一个新项目
(2)创建一个新的原理图图纸
电路图
显示器元件图
(3)设置项目选项
(4)创建一个新的PCB文件。
西安交通大学《数字逻辑电路》课内实验报告

西安交通大学电子技术实验报告——智力抢答器的设计班级:姓名:学号:日期:2015年6月30日联系电话:一、实验目的电子技术专题实验是对《数字逻辑电路》课程内容的全面、系统的总结、巩固和提高的一项课程实践活动。
通过智力抢答器的设计与分析实验,加强与巩固学对数字逻辑电路设计的基本方法和技巧的掌握,同时熟悉QuartusⅡ软件及实验室多功能学习机硬件平台,并掌握数字逻辑电路测试的基本方法,训练学生的动手能力和思维方法。
通过本实验,一方面提高学生运用数字逻辑电路解决实际问题的能力,另一方面使学生更深入的理解所学知识,将理论与实际问题相结合,为以后的计算机硬件课程的学习奠定良好的基础。
二、系统设计概要1、项目名称————智力抢答器的设计2、系统设计要求在许多比赛活动中,为了准确、公正、直观地判断出第一抢答者,通常设置一台抢答器,通过数显、灯光及音响等多种手段指示出第一抢答者。
同时,还可以设置计分、犯规及奖惩计录等多种功能。
本设计的具体要求是:(1) 设计制作一个可容纳四组参赛者的数字智力抢答器,每组设置一个抢答按钮供抢答者使用。
(2) 电路具有第一抢答信号的鉴别和锁存功能。
(3) 设置计分电路。
(4) 设置犯规电路。
三、系统设计方案1、总体概述根据系统设计要求可知,系统的输入信号有:各组的抢答按钮A、B、C、D,系统清零信号CLR,系统时钟信号CLK,计分复位端RST,加分按钮端ADD,计时预置控制端LDN,计时使能端EN,计时预置数据调整按钮TA、TB;系统的输出信号有:四个组抢答成功与否的指示灯控制信号输出口LEDA、LEDB、LEDC、LEDD,四个组抢答时的计时数码显示控制信号若干,抢答成功组别显示的控制信号若干,各组计分动态显示的控制信号若干。
根据以上的分析,我们可将整个系统分为三个主要模块:抢答鉴别模块QDJB;抢答计时模块JSQ;抢答计分模块JFQ。
对于需显示的信息,需增加或外接译码器YMQ,进行显示译码。
最新西安交通大学电子系统设计c51单片机数字钟实验

n单片机数字钟实验报告姓名:高航班级:信息43学号:2140502058PART 1 实验目的在单片机c51实验板上编程实现2017年日历和实时时钟:1.时-分-秒(2位-2位-2位)显示;2.可通过按键置入时间值(参照电子表设置时间工作模式);3.可通过按键控制在LED上从右向左滚动显示年_月_ 日3次,如:2013_01_20空空2013_01_20 ;4.实现每日闹铃提醒功能,闹铃时间可用按键设置。
闹铃采用提示音表示;5.实现秒表功能;6.实现定时器功能(预置定时时间,按键启动,倒计时,计到0响提示音;7.设计实现音乐提示音;8.能够在短时间按要求修改。
PART 2 实验流程图1.总流程图2.设置时间/日期/闹钟模块dis()3.音乐模块music()PART 3 实验代码代码使用资源:Program Size: data=102.0 xdata=0 code=2420 #include<reg51.h>#include<absacc.h>#define uint unsigned int#define uchar unsigned charuchar t0h,t0l,timeaaa;uchar code FREQH[] = {0x01, //0的时候没有音符0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音12345670xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音2345670xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音1234567 uchar code FREQL[] = {0x01, //0的时候没有音符0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音12345670x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音2345670x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音1234567 uchar code tiger[]={3,2,2, 6,2,2, 7,2,2, 5,2,2,3,2,2, 6,2,2, 7,2,2, 5,2,2,7,2,2, 1,3,2, 2,3,4,7,2,2, 1,3,2, 2,3,4,2,3,1, 3,3,1, 2,3,1, 1,3,1, 7,2,2, 5,2,2,2,3,1, 3,3,1, 2,3,1, 1,3,1, 7,2,2, 5,2,2,6,2,2, 2,2,2, 5,2,4, 6,2,2, 2,2,2, 5,2,4,0,0,0};sbit aa=P1^6;unsigned char time[]={0,0,0x08,0,0,0x08,0,0} ; //时间显示数组unsigned char timeZ[]={0,0,0x08,0,0,0x08,0,0} ;//闹钟显示数组unsigned char timeD[]={0,0,0x08,0,0,0x08,0,0} ;//倒计时显示数组unsigned char timeN[]={0,0,0x08,0,0,0x08,0,0} ;//秒表显示数组unsigned char dateset[]={0,0,0x08,0,0,0x08,0,0} ;//riqishezhi显示数组unsigned char code num[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数字unsigned char date[]={0,0,0,0,0,0,0,0,0,0,0,0,0x08,0,0,0x08,0,0,0,0,0,0,0,0};//日期显示unsigned char sec=0,min=0,hour=0,day=24,mon=10,j,t,a,p;int year=2017;unsigned char secZ=0,minZ=1,hourZ=0;unsigned char secD,minD,hourD;unsigned char tsec,secN,minN,tsecm;*****************************LED显示延时函数********************************void delay(unsigned char p){unsigned char i,j;for(;p>0;p--)for(i=5;i>0;i--)for(j=120;j>0;j--);}*******************************获取按键函数***********************************unsigned char getkeycode(void){unsigned char line=0x00; /*行码*/unsigned char col=0x00; /*列码*/unsigned char scancode=0x01; /*行扫描码*/unsigned char keycode; /*键号*/XBYTE[0x8000]=0xff;col=XBYTE[0x8000]&0x0f; /*从列端口读入四位列码*/if (col==0x00)keycode=0x00;else{while((scancode&0x0f)!=0) /*取scancode的低四位,没变为全0,循环*/{line=scancode; /*行号*/XBYTE[0x8000]=scancode; /*给行赋扫描码,第一行为0x01*/if((XBYTE[0x8000]&0x0f)==col) /*检测按键所在的行跳出循环*/break;scancode=scancode<<1; /*行扫描码左移一位,转下一行*/}col=col<<4; /*把列码移到高四位*/keycode=col|line;}return keycode;}*******************************时间显示函数***********************************void timedis(){XBYTE[0X9000]=0;for (j=0;j<8;j++){time[0]=num[sec%10];time[1]=num[sec/10];time[3]=num[min%10];time[4]=num[min/10];time[6]=num[hour%10];time[7]=num[hour/10];delay(1);XBYTE[0X8000] =0x01<<j;XBYTE[0X9000] =time[j];}} //time show*******************************闹钟显示函数***********************************void timedisZ(){XBYTE[0X9000]=0;for (j=0;j<8;j++){timeZ[0]=num[secZ%10];timeZ[1]=num[secZ/10];timeZ[3]=num[minZ%10];timeZ[4]=num[minZ/10];timeZ[6]=num[hourZ%10];timeZ[7]=num[hourZ/10];delay(1);XBYTE[0X8000] =0x01<<j;XBYTE[0X9000] =timeZ[j];}}*******************************秒表显示函数***********************************void timedisN(){while(1){for(;tsec==20;){tsec=0;secN++;if(secN==60){minN++;secN=0;}}if(getkeycode()==0x84)break;XBYTE[0X9000]=0;for (j=0;j<8;j++){timeN[0]=num[tsec%10];timeN[1]=num[tsec/10];timeN[3]=num[secN%10];timeN[4]=num[secN/10];timeN[6]=num[minN%10];timeN[7]=num[minN/10];delay(1);XBYTE[0X8000] =0x01<<j;XBYTE[0X9000] =timeN[j];//if(getkeycode()==0x84)break;}} } //秒表*****************************倒计时显示函数***********************************void timedisD(){while(1){if(minD==0&&secD==0)break;XBYTE[0X9000]=0;for (j=0;j<8;j++){timeD[0]=num[secD%10];timeD[1]=num[secD/10];timeD[3]=num[minD%10];timeD[4]=num[minD/10];timeD[6]=num[hourD%10];timeD[7]=num[hourD/10];delay(1);XBYTE[0X8000] =0x01<<j;XBYTE[0X9000] =timeD[j];}}}*******************************日期显示函数***********************************void datedis(){unsigned char i,j,k;for (i=0;i<17;i++){ for(k=0;k<20;k++)for (j=0;j<8;j++){ date[13]=num[day/10];date[14]=num[day%10];date[16]=num[mon/10];date[17]=num[mon%10];date[11]=num[year%10];date[10]=num[(year%100)/10];date[9]=num[(year%1000)/100];date[8]=num[year/1000];XBYTE[0X8000] = 0x80>>j;XBYTE[0X9000] = date[i+j];delay(1);}}} //date show//downto zero bibii****************************年月日设置显示函数*******************************void datedis1(){XBYTE[0X9000]=0;for (j=0;j<8;j++){dateset[6]=num[year%10];dateset[7]=num[(year%100)/10];dateset[3]=num[mon%10];dateset[4]=num[mon/10];dateset[0]=num[day%10];dateset[1]=num[day/10];delay(1);XBYTE[0X8000] =0x01<<j;XBYTE[0X9000] =dateset[j];}}*******************************时间设置函数***********************************void set(){unsigned char i=0;{for(i=0;i<3;){timedis();if (getkeycode()==0x11){ delay(100);i++;}if (getkeycode()==0x21){ delay(100);switch (i){case 0: sec++;if(sec==60){sec=0;}break;case 1: min++;if(min==60){min=0;}break;case 2: hour++;if(hour==24){hour=0;}break;default: break;} }} }} //时间设置//timeset*******************************闹钟设置函数***********************************void setZ(){unsigned char i=0;{for(i=0;i<3;){timedisZ();if (getkeycode()==0x11){ delay(100);i++;}if (getkeycode()==0x21){ delay(100);switch (i){case 0: secZ++;if(secZ==60){secZ=0;}break;case 1: minZ++;if(minZ==60){minZ=0;}break;case 2: hourZ++;if(hourZ==24){hourZ=0;}break;default: break;} }} }} //alarm set*******************************日期设置函数***********************************void setdate(){unsigned char i=0;{for(i=0;i<3;){datedis1();if (getkeycode()==0x11){ delay(100);i++;}if (getkeycode()==0x21){ delay(100);switch (i){case 0: day++;if(day==32){day=0;}break;case 1: mon++;if(mon==13){mon=0;}break;case 2: year++;break;default: break;} }} }}*****************************定时器0中断函数*********************************void timer() interrupt 1{t++; //计数溢出后t++if(getkeycode()==0x82){tsec=0;secN=0;minN=0;}if(getkeycode()!=0x22){tsec++;}if (t==20)//1s{if (getkeycode()==0x48){ while(1){set();break;}}//进入时间设置if (getkeycode()==0x14){ while(1){setdate();break;}}//日期设置sec++; t=0;secD--;if(secD==(-1)){secD=59;minD--;}if(minD==(-1)){minD=59;}if(sec==60){sec=0;min++;}if(min==60){min=0;hour++;}if(hour==24){hour=0;day++;}if((day==32)&&(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12)){d ay=1;mon++;}if((day==31)&&(mon==4||mon==6||mon==9||mon==11)){day=1;mon++;}if(year%4==0&&year%400!=0&&mon==2&&day>=30){day=1;mon++;}if(year%4!=0&&mon==2&&day>=29) {day=1;mon++;}}}void reset (void){t=0;TMOD=0x01; //模式选择TL0=0xb0;TH0=0x3c; // TH1=(65536-9216)/256; TL1=(65536-9216)%256;PT0=0; //定时器优先ET0=1; // 定时器中断允许TR0=1;//开始定时EA=1; //cpu允许stop} //time go on*****************************定时器1中断函数*********************************void t0int() interrupt 3 {TR1 = 0; //先关闭T0aa = ~aa; //输出方波, 发音TH1 = t0h; //下次的中断时间, 这个时间, 控制音调高低TL1 = t0l;TR1 = 1; //启动T0}void delayaaa(uchar t) {uchar a;while(t--) //四重循环, 共延时t个1/4拍{/* for(c=193;c>0;c--)for(b=114;b>0;b--) //114*/for(a=10;a>0;a--){timedis();}}//延时期间, 可进入T0中断去发音//timedis(); 没用TR1 = 0; //关闭T0, 停止发音}void singachar() {TR1=0;TH1 = t0h; //控制音调TL1 = t0l;TR1 = 1; //启动T0, 由T0输出方波去发音delayaaa(timeaaa);//控制时间长度即节拍}void song(uchar *str){uchar k,i;i = 0;timeaaa=1;while(timeaaa){k = str[i] + 7 * (str[i + 1]);//第i个是音符, 第i+1个是第几个八度t0h = FREQH[k]; //从数据表中读出频率数值t0l = FREQL[k]; //实际上, 是定时的时间长度timeaaa = str[i + 2]; //读出时间长度数值节拍时间i+= 3;singachar();if(getkeycode()==0x22)break;//stop noise}}void music(void){TMOD = 0x01; //置T0定时工作方式1ET1= 1; //开T0中断EA = 1; //开CPU中断while(1){song(tiger);aa=1;if(getkeycode()==0x22)break;delayaaa(20);//timedis();}}*********************************MAIN函数************************************ void main(){reset();while(1){timedis();if(getkeycode()==0x88){setZ();} //闹钟设置if(getkeycode()==0x28){for(p=0;p<3;p++){datedis();}} //日期if(getkeycode()==0x18){secD=20;minD=0;timedisD();if(minD==0&&secD==0){music();}}//倒计时if(getkeycode()==0x44){minN=0;tsec=0;secN=0;timedisN();}//秒表if(secZ==sec&&minZ==min&&hourZ==hour) {music();}}}************************************OVER**************************************PART 4 实验心得实验虽然已经验收完毕,但收获却是弥足珍贵。
杨鹏-1055102-计算机04-电子系统设计报告

uint8_t tmp1=hztab[12*(y+h)+tmpx+w]; uint8_t tmp2=arr[h*2+w]; tmp1>>=tmpy; tmp1<<=tmpy; tmp2>>=(6-tmpy); hztab[12*(y+h)+tmpx+w]=tmp1+tmp2; tmp1=hztab[12*(y+h)+tmpx+w+1]; tmp2=arr[h*2+w]; tmp1<<=(6-tmpy); tmp1>>=(6-tmpy); tmp2<<=(tmpy); hztab[24*(y+h)+tmpx+w+1]=tmp1|tmp2; } } //setBlack(); } void CHIP_Init() { DDRB = 0xFF; DDRC = 0xFF; DDRD = 0xFF; DDRE = 0xFF; DDRF = 0xFF; DDRG = 0xFF; PORTD = 0x00; PORTE = 0x08; PORTF = 0x00; PORTC |= 0x20; PORTB = 0xFF; PORTC = 0x02; PORTG |= 0x18; PORTB = 0x00; PORTG = 0x00; } void wait_free() { uint8_t retb; D_PORT = 0xFF; DDRB = 0x00;
电子系统设计 专题实验报告
姓名:杨鹏 学号:10055102 班级:计算机 04
西安交通大学 2013/5/15
1
实验一 基于 AVR ATmega 128 的硬件 PCB 设计
西安交通大学模电实验报告(2)

模拟电子技术实验实验报告西安交通大学电信学院计算机11班姓名:司默涵电话:187****7918学号:2110505018实验日期:2013年4月日报告完成日期:2013年4月日实验 2.2 含负反馈的多级晶体管放大电路预习报告一、实验目的1.构建多级共射极放大电路,对静态工作点、放大倍数进行调节,使其满足设计要求。
2.测量多级放大电路的放大倍数、输入电阻、输出电阻和频率特性。
3.在多级放大电路中引入电压串联负反馈。
4.测量负反馈电路的放大倍数、输入电阻、输出电阻和频率特性等,并与开环放大电路相应的技术指标进行比较。
二、实验原理本实验要求将2个共射极单管放大电路,按照阻容耦合方式进行级联,并在此基础上,由输出端引入电压串连负反馈。
对整个电路的要求,一般靠各个放大电路的指标体现。
因此,需要事先对单元电路的指标提出要求。
本实验中,我们首先构建一个多级的、开环放大倍数大于2000的放大电路,并在此基础上引入电压串联负反馈。
1.多级放大电路图2.2.1为一个2级共射极放大电路。
与图2.1.1所示电路的主要区别是,这个电路具有稳定静态工作点的作用。
第一级和第二级的静态工作点互不干扰,第一级放大电路的静态分析如下,第二级静态分析类推:根据晶体管微变等效电路,对放大电路的动态分析如下:当和相差较大时,为其中较大的。
当和接近时,根据电路参数和实际调试结果,在晶体管β大约为100左右时,整个放大电路的电压放大倍数约为几千倍,输入电阻约为2kΩ左右,输出电阻约为1kΩ左右,下限截止频率约为100Hz左右,上限截止频率约为30kHz左右。
当然,上述参数只是一个大致范围,具体指标将与各自电路参数有关。
电路调节过程如下:1) 首先按照图2.2.1在面包板上搭接电路;2) 在C2右端观察输出,按照实验2.1方法,对前级电路进行静态工作点调节;3) 从C2左端断开,按照实验2.1方法,对后级放大电路单独调节静态工作点;4) 重新连接电路,测试放大倍数,此时两个放大器都处于最佳的静态工作点,观察电压放大倍数是否满足大于2000的要求;如果满足,则调试结束;5) 如果不满足,则增加前级的R C,或者减小R W1,此时静态工作点开始向饱和区靠拢,就是牺牲了最佳静态工作点,获取满足要求的电压放大倍数。
电子系统设计实验报告

实验报告格式要求二.实验目的、任务和要求:本实验要求设计SCI串行接口芯片, 其功能包括串行及并行数据的接收和互相转换。
三.实验系统结构设计分析1.模块划分思想和方法:该芯片需根据功能分为串并转换电路和并串转换电路两部分。
实现串并转换的关键器件就是移位寄存器, 其功能可以使串行输入的数据先寄存到一个位矢量中, 等到一组数据全部输入完毕后再一起处理, 并行输出。
而实现并串转换的关键器件是锁存器, 它可以将并行输入的数据先锁存起来, 再一位一位的转化成串行数据。
计数器在这一芯片中也起到了重要作用, 因为计数器可以产生时间脉冲的分频, 用于配合时间脉冲控制各器件的工作。
2.各模块引脚定义和作用.串并电路:输入: rxd读入数据, clk系统时钟, reset计数器复位端, rd读入控制四进制计数器:C4四分频十进制计数器:Count_10计数分量, C10四十分频(c4的十分频)移位寄存器:Read读入数据, d0~d9并行输出(d0起始端, d1~d8数据端, d9校验位(本实验中不起作用))锁存器:K0~k7数据位状态发生器:RdST读入状态(0为读入, 1为寄存器已满)四.实验代码设计以及分析:1.给出模块层次图;2.按模块完成的代码及注释.USE IEEE.STD_LOGIC_1164.ALL;ENTITY SCI ISPORT(cs,rxd,clk,SCIrd,reset,SCIwr,in7,in6,in5,in4,in3,in2,in1,in0: IN STD_LOGIC;rdFULL,tdEMPTY,c4:buffer std_logic;e7,e6,e5,e4,e3,e2,e1,e0,wxd:OUT STD_LOGIC);END SCI;ARCHITECTURE WORK OF SCI ISSIGNAL wr,rd,read,c10,d9,d8,d7,d6,d5,d4,d3,d2,d1,d0,k7,k6,k5,k4,k3,k2,k1,k0,mid: STD_ULOGIC;SIGNAL wri : STD_LOGIC_vector(7 downto 0);SIGNAL count_10 ,counter_8:std_logic_vector(3 downto 0);BEGINPROCESS(cs)BEGINrd<=cs OR SCIrd;wr<=cs OR SCIwr;END PROCESS;//注释: 片选输入, cs=1时, 串入并出为“写”, 并入串出为“读”;cs=0时, 串入并出为“读”, 并入串出为“写”;PROCESS(rxd)BEGINread<=rxd;END PROCESS;PROCESS(clk)VARIABLE count_4 : STD_LOGIC_VECTOR(1 DOWNTO 0);BEGINIF(clk'EVENT AND clk='1')THENIF(count_4="00")THENcount_4 := "01";c4 <= '1';ELSIF(count_4="01")THENcount_4 := "11";c4 <= '1';ELSIF(count_4="11")THENcount_4 := "10";c4 <= '0';ELSIF(count_4="10")THENcount_4 := "00";c4 <= '0';END IF;END IF;END PROCESS;PROCESS(c4)BEGINIF(c4'EVENT AND c4='1')THENIF(rd='1')THENd0<=read;d1<=d0;d2<=d1;d3<=d2;d4<=d3;d5<=d4;d6<=d5;d7<=d6;d8<=d7;d9<=d8;END IF;END IF;END PROCESS;PROCESS(c4,reset,rd)BEGINIF(reset='0' OR rd='0')THEN count_10<="0000";c10 <= '0';ELSIF(c4'EVENT AND c4='1')THENIF(count_10="0000" AND rxd='1' AND rdFULL='0')THEN count_10 <= "0001";c10 <= '0';ELSIF(count_10="0001")THENcount_10 <= "0010";c10 <= '0';ELSIF(count_10="0010")THENcount_10 <= "0011";c10 <= '0';ELSIF(count_10="0011")THENcount_10 <= "0100";c10 <= '0';ELSIF(count_10="0100")THENcount_10 <= "0101";c10 <= '0';ELSIF(count_10="0101")THENcount_10 <= "0110";c10 <= '0';ELSIF(count_10="0110")THENcount_10 <= "0111";c10 <= '0';ELSIF(count_10="0111")THENcount_10 <= "1000";c10 <= '0';ELSIF(count_10="1000")THENcount_10 <= "1001";c10 <= '0';ELSIF(count_10="1001")THENcount_10 <= "1010";c10 <= '0';ELSIF(count_10="1010")THENcount_10 <= "1011";c10 <= '1'; END IF;END IF;END PROCESS;PROCESS(c10)BEGINIF(c10'EVENT AND c10='1')THENk7<=d8;k6<=d7;k5<=d6;k4<=d5;k3<=d4;k2<=d3;k1<=d2;k0<=d1;END IF;END PROCESS;PROCESS(rd)BEGINIF(rd='0')THENe7<=k7;e6<=k6;e5<=k5;e4<=k4;e3<=k3;e2<=k2;e1<=k1;e0<=k0;END IF;END PROCESS;PROCESS(rd,c10)BEGINIF(rd='0')THEN rdFULL<='0';ELSIF(c10='1')THENrdFULL<='1';ELSE rdFULL<='0';END IF;END PROCESS;process(wr)beginif(wr='0')thenwri(0)<=in0;wri(1)<=in1;wri(2)<=in2;wri(3)<=in3;wri(4)<=in4;wri(5)<=in5;wri(6)<=in6;wri(7)<=in7;end if;end process;process(c4)beginif(c4'event and c4='1')thenif(wr='0')thencounter_8<="0000";elsif(wr='1' and counter_8="0000")then counter_8<="0001"; elsif(counter_8="0001")then counter_8<="0010";elsif(counter_8="0010")then counter_8<="0011";elsif(counter_8="0011")then counter_8<="0100";elsif(counter_8="0100")then counter_8<="0101"; elsif(counter_8="0101")then counter_8<="0110";elsif(counter_8="0110")then counter_8<="0111";elsif(counter_8="0111")then counter_8<="1000";elsif(counter_8="1000")then counter_8<="1001";end if;end if;end process;process(wr,counter_8)beginif(wr='1' and counter_8="1001")thenmid<='1';tdEMPTY<='1';elsif(wr='0')thenmid<='0';tdEMPTY<='0';end if;end process;process(counter_8)beginif(wr='0' or mid='1')thenwxd<='0';elsif(wr='1' and mid='0')thenif(counter_8="0001")thenwxd<=wri(0);elsif(counter_8="0010")thenwxd<=wri(1);elsif(counter_8="0011")thenwxd<=wri(2);elsif(counter_8="0100")thenwxd<=wri(3);elsif(counter_8="0101")thenwxd<=wri(4);elsif(counter_8="0110")thenwxd<=wri(5);elsif(counter_8="0111")thenwxd<=wri(6);elsif(counter_8="1000" )thenwxd<=wri(7);end if;end if;end process;END WORK;五.仿真图(输入输出波形)以及分析:六.实验问题分析和经验总结:在该实验的设计中, 我们发现时序逻辑中最重要的部分就是时间信号对各进程的控制, 因为为了保持各进程在时间上的同步性和正确性, 需要用一个或几个相关联的时间信号来控制各进程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子系统设计专题实验报告实验一、基于 AVR ATMega128 的硬件(PCB)设计 一、 实验目的和要求目的: (1)掌握印制电路板设计的基本原则及印制电路板的设计制作流程。
(2)掌握 Protel DXP 2004 SP2 软件的基本功能。
(3)在 Protel DXP 2004 SP2 软件平台,完成电路图到 PCB 图的设计制作过 程。
要求: (1)根据实验要求, 完成原理图的设计,并在 Protel DXP 2004 SP2 软件平台 上设计制作出相应的 PCB 图。
(2)要求 PCB 图布局布线美观,抗干扰性能强。
图中所用到的元件封装必须 符合实际的元件尺寸。
二、 实验设备及设计开发环境操作系统: XP 软件:Protel DXP 2004 SP 2三、 实验内容根据 ATMega128 的电路图设计一个单片机电路板,其中包括基本电路、复位 电路、时钟振荡器(ISP、键盘、RT Clock)。
MCU 原理图如图四、 实验步骤1. 创建新的工程项目,并新建原理图图纸 2. 设置工程参数,包括基本原理图参数设置。
3. 绘制原理图:在元件库中查找所用元件,并进行必要说明,如标签、总线、 端口等。
4. 放置各个模块与图纸合适位置,方便之后端口的对接及导入。
5. 对原理图进行电气检查,编译查错时,直至消除后保存原理图。
6. 创建新的 PCB 文件,并对 PCB 进行正确合理的参数设置(注意:在设置尺 寸时,不宜设置太小,不利于元件布局及布线),保存文件。
7. 导入原理图,将元件合理放置,原则:组合功能的元件(键盘开关)有序放 置在一起,使得各个元件布线交叉尽可能的少。
8. 对电路板自动布线,进行规则检查,注意检查 PCB 有没有缺线、缺元件的 情况修改错误的地方,并注意印刷线路的宽度设置,不宜太宽。
9. 重复步骤 8,对电路板布局不断进行修改优化,直到 PCB 的规则检查没有警告、错误,电路板元件布局思路清晰,布线方式正确合理。
10. 对工程文件进行保存,完成整个硬件设计流程。
五、 实验结果1.整体电路原理图如图2.PCB 图如下图(手动放置元件位置,自动布线):六、 实验总结硬件是设计的基础,认真学习掌握硬件设计的原理有助于更好的在软件 层面进行设计。
同时一个正确标准的项目设计方案,方便设计人员阅读的同 时,可以更高效的实现加工。
将理论上的电路原理图真真实实的做成了可以加工生产的电路板, 又一 次真切的感受到了理论与实际的联系。
电路图不再仅仅是停留在纸面和考试中 的分析对象,更是可以加工成为电路板,是设计实现实际功能的基础。
布线过程中, 看着元件之间密密麻麻的线路,也深切体会到优秀的设计对 于实际生产的重要性,对于实现的难易程度,容错能力,产品性能等多方面都 有着重大的影响。
这就要求设计人员,不仅仅是能够实现产品的功能,而是尽 可能将设计做到最好。
这也对我们学习提出了更高的要求,做一件事情不难, 难的是做好一件事情。
实验二、按键灭灯软件程序设计 一. 实验目的和任务要求根据规则要求实现按键灭灯小游戏的基本功能, 演示游戏过程并计算显示最 终游戏结果。
规则: 1. LED 灯随机地出现;每次闪一个灯; 2. 在 1s 内按键可以把灯灭掉; 3. 超时没按键或按错键,则灯换一个位置; 4. 每灭一个灯,马上会闪亮另外一个灯; 5. 计算 10 次灯的分数。
比如 按错一次 -5;超时一次-3;及时灭一次 +1-3 分。
使用 timer 来计时比较准确。
显示结果。
二. 实验设备及软件开发环境1. 单片机平台:AVR ATmega128 实验开发板; 2. 开发环境平台: 计算机,Windows XP 操作系统,软件开发平台:AVR Studio 4.16 集成开 发软件;WinAVR(GCC) 20080610 C 语言编译器; 下载编程工具:JTAGICE mkII 在线仿真器;三. 实验的电路原理1.LED 指示灯的硬件电路连接如下图所示。
2.数码管硬件电路连接如下图所示。
3.矩阵键盘硬件电路连接如图 6-1 所示。
按键灭灯程序由以上三大部分构成,将 led 灯与键盘按键编码对应起来,实现按键对 led 灯的控制,最后将总得分显示在数码管上。
软件设计的难度不大,主要在于 led 灯与键盘按键端口的对应。
四. 软件设计及关键过程分析软件设计流程图 游戏开始: 蜂鸣器提示PORTE |= (1 << PE3); 使 PA3 输出高电平,使蜂鸣器鸣叫 延迟一段时间之后关闭蜂鸣器设置中断计时器的 参数,计时时间 1s中断计时函数 SIGNAL(SIG_OUTPUT_COMPARE1A)执行换灯程序 switchLed() No 亮灯计数 count<10Yes调用函数 ledkeepping(){ PORTB = ~random[number]; }执行亮灯程序有无按键按下No中断计时 1s,进入中断函数 grade=grade+2;Yes按键是否正确No按键不正确,不加分 grade=grade+0;Yes按键正确加分 grade=grade+5;游戏结束 显示游戏总得分 grade数码管显示 PORTB = code[calculate()(number)]; 其中,calculate 函数计算相应位码显示得分五. 程序运行结果1.根据随机数组 random[10]使得 led 灯“随机”亮起2.十次亮灯结束,数码管显示总得分六. 实验总结软件编程设计的难度不大,关键在于如何使得 led 灯与键盘按键端口对应, 并实现按键正确时将对应的 led 灯“灭掉”。
具体实现时,采取当按键正确就切 换到下一个随机 led 灯, 而不是去改变按键对应的 led 灯的端口值,一定程度上 使得问题简化。
程序采用将学过的知识模块联合, 主要由 led 灯, 键盘, 数码管三部分构成。
实验中也发现了一些问题: 当按键时间过长时,可能使得下一个 led 灯亮时也判断到了该按键已经按 下,错误的记录下该按键,得分记录不准确。
处理思路: 当下一个 led 灯亮起, 且判断到有按键按下时, 判断按键是否与之前按键编 码相同,如果不同,则为一次独立的按键;如果相同,则为上一个 led 灯的延迟 按键,需重新对键盘进行一次 scan。
附录 1 软件源代码#include <avr/io.h> #include <util/delay.h> #include <stdio.h> #include <avr/signal.h> #include "digitron.h" #define LINE1_SCAN() PORTC = (PORTC | _BV(PC7)) & ~_BV(PC6) #define MASK 0xFF #include "led.h" uint8_t code[10] = { 0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90 }; uint8_t random[11] = { 0x01,0x04,0x02,0x10,0x40,0x80,0x02,0x08, 0x80,0x20,0x40 }; uint8_t led_sel=0x01; int number=1,grade=0,count=0; int com = 1; void system_init() //系统初始化 { //关闭 8 个 LED 灯 DDRB = 0xff; //设置 PB 端口为输出 DDRC |= _BV(PC5); //设置 PC5 为输出 PORTC |= _BV(PC5); //置 PC5 为高电平,使能 led 锁存 PORTB = 0xff; PORTB = PB_MASK; DDRB = PB_MASK; PORTC |= _BV(LED_CS); DDRC |= _BV(LED_CS); //关闭数码管显示 DDRG |= _BV(PG3); //设置 PG3 为输出,PG3 控制数码管的位选择锁存器; DDRG |= _BV(PG4); //设置 PG4 为输出,PG4 控制数码管的段码锁存器; PORTG |= _BV(PG3); //使能数码管位选择锁存器 PORTG &= ~_BV(PG4); PORTB = 0x00; //关闭字型码锁存器 DDRB = 0xff; //设置端口 PB 为输出 //送数码管位码 //关闭 8 个 led 灯 PORTC &= ~_BV(PC5); //PC5 置低,关闭 led 锁存器器PORTG &= ~_BV(PG3); //关闭数码管位选择锁存器PORTG |= _BV(PG4); //使能段码锁存器PORTB = 0xff; //送段码PORTG &= ~_BV(PG4); //关闭段码锁存器//关闭蜂鸣器DDRE |= _BV(PE3);PORTE |= _BV(PE3); //喇叭电路断开,喇叭停止鸣响}void DIG_Init(){PORTB = ~PB_MASK;DDRB = PB_MASK;PORTG &= 0x00;DDRG |= _BV(DIG_CS1) | _BV(DIG_CS2);}void KP_Init(){// CHIP_Init();系统端口初始化DDRB = 0xFF;DDRC = 0xFF;DDRD = 0xFF;DDRE = 0xFF;DDRF = 0xFF;DDRG = 0xFF;PORTD = 0x00;PORTE = 0x08;PORTF = 0x00;PORTC |= 0x20;PORTB = 0xFF;PORTC = 0x02;PORTG |= 0x18;PORTB = 0x00;PORTG = 0x00;// 键盘端口初始化PORTC &= 0x3F;DDRC |= 0xC0;PORTB = 0xFF;DDRB = 0x00;uint8_t KP_read(){_delay_ms(10);asm("nop");uint8_t read = PINB;return read;}uint8_t KP_scan(){uint8_t code = MASK;uint8_t key = MASK;//scan the first lineLINE1_SCAN();LINE1_SCAN();code = KP_read();if(code != MASK){_delay_ms(10);code = KP_read();if(code != MASK){switch(code){case 0xFE:key = 0x01;break; case 0xFD:key = 0x02;break; case 0xFB:key = 0x04;break; case 0xF7:key = 0x08;break; case 0xEF:key = 0x10;break; case 0xDF:key = 0x20;break; case 0xBF:key = 0x40;break; case 0x7F:key = 0x80;break; }}}//if no key is pressed, return 0x00 return key;}void LED_Init(){PORTB = PB_MASK;DDRB = PB_MASK;PORTC |= _BV(LED_CS);DDRC |= _BV(LED_CS);}int calculate(int number){switch (number){case 0:return grade/10;break;case 1:return grade%10;break;default:return 10;}}//亮灯程序不变k;void ledkeepping(){LED_Init();PORTB = ~random[number];_delay_ms(5);}//亮灯程序void switchLed(){TCNT1H = 0x00; //T/C1计数值清零 TCNT1L = 0x00;LED_Init();PORTB = ~random[number];number=number+1;count=count+1;_delay_ms(5);if(number==10){number=1;}if(count>10){TCCR1B = 0x00;}}//中断程序SIGNAL(SIG_OUTPUT_COMPARE1A){TCNT1H = 0x00; //T/C1计数值清零TCNT1L = 0x00;grade=grade+2;switchLed();}void DIG_Dispaly();{com=1;for(number = 0; number < 2; number++){PORTG |= _BV(DIG_CS2);PORTG &= ~_BV(DIG_CS1);PORTB = code[calculate()(number)];PORTG |= _BV(DIG_CS1);PORTG &= ~_BV(DIG_CS2);PORTB = com;com *= 2;PORTG &= ~_BV(DIG_CS1);PORTG &= ~_BV(DIG_CS2);_delay_ms(2);}}int main(void){system_init(); //系统初始化PORTE |= (1 << PE3); //使PA3输出高电平,使蜂鸣器鸣叫_delay_ms(100);_delay_ms(100);PORTE |= (1 << PE3); //使PA3输出高电平,使蜂鸣器不响TCCR1B = 0x00; //中断控制寄存器清零,停止T/Cl计数OCR1AH = 0xAA; //设置8MHz、256分频、定时1s的比较值,OCR1AL = 0x12; //与TCNTl的计数值进行比较,若匹配产生中断 TCCR1A = 0x00; //T/C1普通端口模式TCCR1B = 0x04; //启动定时器T/C1,256分频TIMSK |= 0x10; //使能C/Tl比较匹配中断sei(); //允许全局中断while(1){if(count<10){KP_Init();uint8_t led_press,led_temp;led_press=KP_scan();ledkeepping();KP_Init();led_temp=KP_scan();if(led_press!=MASK){if(led_press!=led_temp){if(led_press==random[number]) {grade=grade+5;}else{grade=grade+0;}switchLed();_delay_ms(5);}}else{ledkeepping();_delay_ms(1);}}else{DIG_Init();//数码管初始化DIG_Dispaly();//数码管显示得分}}}。