数字逻辑课程设计实验报告.docx
《数字逻辑课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《数字逻辑课程设计实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
数字逻辑课程设计实验报告
数字逻辑课程设计实验报告
课程名称:
数字逻辑课程设计
姓名:
学院:
计算机科学与技术
院系:
计算机科学与技术
专业:
计算机科学与技术
年级:
学号:
指导教师:
2009年9月10日
一.实验目的
通过硬件描述语言VHDL的编程,深入了解并掌握可编程芯片PLD的设计技术,加强学生对《数字逻辑》课程所学只是综合运用的能力。
培养学生创造性思维能力和独立解决实际问题的能力。
二.实验内容
1.利用VHDL语言完成实现红外线数据传输系统的设计任务,然后进行编译和仿真,保证设计的正确性.
2.生成熔丝图文件,下载到ispLSI1032芯片,通过实际线路进行验证.
红外线数据传输系统的具体设计要求如下:
a.通过开关K1-K8设定要传送的8bits信息,再通过置数按钮存放在系统内部,生成校验码同时送校验码指示灯显示。
置数按钮在系统发送信息期间无效。
b.按发送按钮进入发送态,发送灯亮,系统先发送最高位,通过寄存器循环一位再连续发送其他位,此时3个数码管上的信息也随着改变,最后还要传送一个校验码。
每按一次发送按钮,系统就发送一次信息。
c.接收端也是采用移位方式存入信息,在接受第一位时寄存器先清零。
接收时数码管上的信息随着寄存器内容的变化而变化,接受到校验码后立即设置校验码指示灯,同时按偶校验判定接受是否正确,将结果在接受错指示灯上显示。
d.传输的过程中,接收端的校验指示灯熄灭。
当接收端接收0个数据后(1位校验码和8位数据位),接收端根据相应的校验方式来判断所接收的数据是否正确。
接收端的校验指示灯亮,表示传输的数据正确;校验指示灯熄灭,表示传输的数据不正确。
三.实验环境介绍
1.软件平台介绍
本次实验采用ISP(在系统编程)技术。
在系统编程技术(In-SystemProgrammabile)技术是Lattice公司率先提出的一种先进的编程技术,是指对器件、电路板或整个逻辑系统的电子功能课随时进行修改或重构,这种修改或重构可以在产品设计、制造过程中的每个环节,甚至在交付用户之后进行。
采用了isp技术之后,硬件设计就可以变得像软件那样灵活而且易于修改。
这不仅扩展了器件的用途,缩短了系统的调试周期,也给目标设备的现场升级和维护工作带来了极大的方便。
DICE-SEM型实验箱可支持Lattice公司的CPLD芯片ispLSI1032,目前实验室提供的开发系统为ispLever5.0。
ispLEVER是Lattice公司推出的EDA软件,适用于所有Lattice公司的CPLD、SPLD、FPGA和FPSC可编程器件的设计,其设计可采用原理图、硬件描述语言以及混合输入三种方式,并能够对所设计的系统进行功能仿真和时序仿真。
2.硬件平台介绍
本次实验采用DICE-SEM型实验箱。
DICE-SEM型实验箱是用于《数字逻辑》课程教学实验的专用设备。
它提供了16位二档开关、16位发光二极管双色显示灯、IC插座、六个七段BCD码译码显示数码管、数字频率计、电子笔、可调电阻、模拟扩展区、PLD/CPLD扩展区等,另外还有一个Lattice1016E芯片提供了2个单脉冲开关、节拍信号、多种频率的时钟信号源等方面的功能。
CPLD扩展区包含了一个CPLD下载板、2个针式扩展插座,下载板上有一片CPLD芯片LatticeispLSI1032E和JTAG下载接口插座。
实验箱电源方面采用220V交流供电,在面板上提供了多个+5V和地的电源接线插孔。
本次实验主要用到可编程的ispLSI1032E芯片。
四.实验设计方案
1.设计方案说明
红外线传输系统包括发送方和接受方两端,都可以单独进行初始化清零处理。
在发送端可以设置准备发送的8bits的数据信息,连同一个奇偶校验位一起发送。
接收端接受到8bits的数据信息和一位奇偶校验信息后,显示收到的数据信息和校验信息,并根据偶校验判定接收到的信息是否出错。
实验时若无红外发送接收元件则可以用一根导线连接两端暂时代替。
2.程序模块图
整体模块设计图如下:
由于发送端和接收端可能属于两个独立的设备,即各自产生自己的工作CP,因此如何提高可靠性就成为设计时的一个关键问题,而两个CP也只能是相对接近,系统允许的误差越大,系统越可靠.在这里采用的策略是在工作CP的基础上分频以提高可靠性,如图中CP1和CP2都是采取在CP基础上16分频后的波形.可以设计为当计数器1记到8时CP1变为高电平,当计数器3记到8时CP2变为高电平。
3.程序流程图
a.发送模块流程图:
发送模块使用两个计数器,计数器1用来对外接CP进行16分频产生时钟CP1,在clear后进入“准备好态”可以置高set来置数,然后置高start使信号sending置1,进入固定高电平状态准备传输。
在此固定高电平时间段内,一旦出现低电平则接收端认为是噪音,不予接收。
当计数器2在固定高电平状态从0011计数到0110后状态变为发送有效数据状态,开始发送置数寄存器获得的数据。
发送过程中寄存器循环左移,发送8位后计数器2到1111状态,发送校验码信息,发送完后回到出示的“准备好态”,等待再次操作。
发送方置数只能在“准备好态”进行。
各标识符含义:
clr:
清零标志
set:
置数标志
start:
按发送按钮后进入“固定高电平态”
reg:
bufferstd_logic_vector(7downto0):
八位寄存器位
count1:
std_logic_vector(3downto0):
计数器1,对CP分频产生cp1
cp1:
计数器2的时钟
count2:
std_logic_vector(3downto0):
计数器2,控制固定高电平态及发送计数
sending:
发送状态标志,初始为0,开始发送后为1,发送完毕后置0
sendbit:
发送位,在固定高电平段为1,在发送有效数据态时为发送位电平
fengming:
标志是否成功发送的蜂鸣
clk1000:
频率为1000HZ的时钟
b.接收模块流程图:
接受模块的设计基本和发送端基本相同。
用计数器1对外接CP进行16分频产生时钟cp2,clear可以实现寄存器清零操作。
接收到高电平后计数器2开始计数,大于0110后接收到的字节依次移位存入寄存器中。
收到最后一位校验码后对接收到的数据作偶校验后根据校验结果显示“接受错”和蜂鸣。
各标识符含义:
clr:
清零标志
reg:
bufferstd_logic_vector(7downto0):
八位寄存器位
count1:
std_logic_vector(3downto0):
计数器1,对CP分频产生CP1
cp2:
计数器2的时钟
count2:
std_logic_vector(3downto0):
计数器2,控制固定高电平态及接受位计数
sending:
发送状态标志,初始为0,开始发送后为1
recbit:
接收位,初始为0,在固定高电平段接收到1,在发送有效数据态时为发送位电平
recwrong:
接受错误标志。
初始为0,为1时表示接受错。
checkcode:
校验位。
初始为0,传输后为接收到的校验位。
fengming:
标志是否成功发送的蜂鸣,接受正确时接clk1000,错误接clk500
clk500:
频率为500HZ的时钟
clk1000:
频率为1000HZ的时钟
五.实验步骤和观察记录
基本实验步骤:
1.根据实验要求编写VHDL程序,完成进程的设计和题目的要求。
2.编译成功后作出波形图进行仿真,通过仿真结果对源程序进行修改直至仿真结果正确。
3.对文本文件进行编译产生熔丝图文件。
4.设置引脚绑定。
5.将PC机和JTAG接口通过电缆相连,把熔丝图文件下载到芯片中。
6.按绑定的引脚连线,接好后开始实验验证。
实验观察记录:
1.发送位置成254,即“10101100”,先清零clr,再置数set,然后开始start,观察到发送校验码为0,当发送指示灯经过一段固定高电平态后开始发送有效数据,发送数码管和接收数码管依次经过254132252145312225
053126254,传输完成后接收校验位为0,接受错标志为0,发送端蜂鸣为clk1000,接收端蜂鸣为clk1000。
2.发送位置成133,即“01011011”,先清零clr,再置数set,然后开始start,观察到发送校验码为1,当发送指示灯经过一段固定高电平态后开始发送有效数据,发送数码管和接收数码管依次经过133266155332265153
326255133,传输完成后接收校验位为1,接受错标志为0,发送端蜂鸣为clk1000,接收端蜂鸣为clk1000。
3.发送位置成133,即“01011011”,先清零clr,再置数set,然后开始start,观察到发送校验码为1,当发送指示灯处在固定高电平态的过程中将发送位给一个低电平干扰,观察到接收端没有接收,蜂鸣和接收数码管皆无变化。
4.发送位置成133,即“01011011”,先清零clr,再置数set,然后开始start,观察到发送校验码为1,当发送指示灯经过一段固定高电平态后开始发送有效数据,在发送有效数据位的过程中给干扰,若干扰成功,可观察到报错灯亮,蜂鸣显示clk500。
六.对实验过程的分析、处理及讨论
实验过程中,在clear置高后,程序执行寄存器清零操作以及各标志位的初始化操作,发送端的计数器1用来产生CP1,通过发送位先发送一段固定高电平态来实现接收端和发送端的同步。
在接收端接收到发送位的高电平后接收端的计数器1开始计数。
这样就实现了同步。
在同步开始计数后如果接收端在此固定高电平态中接收到了低电平信号,则接收端认为是噪声,返回初态,不予接收。
实验程序设定的固定高电平态长度为3个半左右CP1周期,此间计数器2由0011计数到0110,当计数到0111时发送第一位数据,由于接收端的计数器与发送端计数器设计相同,故而在此时可以同步接受数据。
在发送8位有效数据后即经过8个CP2周期后,计数器2为1111时发送一位校验码位,然后一次发送结束。
回到初态等待下一次发送指令。
通过设计发送端和接收端的计数器1,在cp的基础上16分频后用于发送位的计数,这样扩大了时钟周期,也就增大了系统允许的误差,是一种增加系统可靠性的设计。
通过设计在发送有效数据前先发送一段固定高电平,不仅可以实现发送端和接收端的同步问题,而且在此期间如果接收端一旦接受到低电平,可以判定为噪音,这种设计可以提高系统的抗干扰性。
七.实验方案的改进意见
根据实验测试的结果,本次实验设计的结果能够正确完成传输任务,能正确显示校验码和报错功能以及蜂鸣,以及具有一定的报错功能,比较好的完成了实验任务,但仍存在一些不足:
1.由于是用VHDL语言编写,有些语句的使用会直接增加实现电路的逻辑门的数量,这时我们所不希望的,所以在优化程序方面,应尽量做到心中有原理图有电路,这样对程序进行优化后可以减少需要的逻辑门的数量。
2.如果能设置一个按钮,自动完成清零-置数-开始,这样传输的外部控制更简单,更有利于高效地完成传输功能。
八.心得体会
这次数电程序设计实验可以说获益非浅,首先最深的感受是:
哇,我们学的知识终于可以做出点东西来了!
我们都已经大三了,说实话一直感觉课本知识按照老师说都是基础,一定要好好掌握,我们也照做了,我们考了个80,90多分。
可是我们还是感到一种心虚,其实个人觉得好的学习应该在不断的有成就当中进行,当用自己所学的知道完成了任务的时候,那是一种成就感,是对自己学习的肯定,就会给自己带来无限的信心和继续学习的热情,我觉得不断地去实践并取得一定成果,这样学习是最好的。
这次数电实验给了我们一次真正展现自己能力的机会,我通过自己的不断努力,我也终于成功了!
第二点感受颇深的是自己发现课本上学的东西真的是纸上谈兵。
我们只能从书本上的字里行间看到说电路中会存在竞争存在险象,可是我们根本就没有办法真正体会到其重要性和如何预防等措施。
这次数电实验,通过自己动手,自己发现问题,我看到了竞争并解决了竞争。
我通过加长导线的办法成功避免了一处竞争,当我成功的时候,我发现实验的重要性。
还有个问题是越到后来,接线和芯片使用多起来,电路就难免变的不稳定,查起问题来又不方便,何况不是错误是不稳定问题,这些问题在课堂上只听老师讲讲是完全体会不到的。
但我知道我都做到这个地步了,我不能放弃,好多次我自己很是烦躁,直接去吃饭或者不去做实验来逃避问题,但我清醒的知道问题还是要解决的,我鼓起勇气,耐着性子,面对强大的困难,我不再退缩,我从检查线路开始,到检查芯片,到检查导线(有一次导线坏了的问题还真是存在),和我的搭档不懈的努力,终于问题还是迎刃而解。
我知道没有解决不了的问题,只有有信心,只有有勇气,只要有耐心,没有战胜不了的拦路虎!
!
!
!
我衷心的感谢这次数电实验,给我的启发是巨大的,给我的收获是无限的。
附录:
VHDL源码
--send.vhd
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitysendis
port(input:
instd_logic_vector(7downto0);
cp,clr,set,start,clk1000:
instd_logic;
reg:
bufferstd_logic_vector(7downto0);
sending:
bufferstd_logic;
sendbit,check,fengming:
outstd_logic);
endsend;
architecturefasongofsendis
signalcount2:
std_logic_vector(3downto0);
signalcp1:
std_logic;
begin
count1:
process(cp,clr,start)
variablecount1:
std_logic_vector(3downto0);
variablem:
std_logic;
begin
ifclr='1'then
count1:
="0000";
m:
='0';
elsifstart'eventandstart='1'andm='0'then
m:
='1';
elsifcp'eventandcp='1'andm='1'then
ifcount1="1111"then
count1:
="0000";
else
count1:
=n+1;
endif;
endif;
ifcount1<8then
cp1<='0';
else
cp1<='1';
endif;
endprocess;
count2:
process(cp1,clr,start)
begin
ifclr='1'then
count2<="0011";
sending<='0';
elsifstart'eventandstart='1'andsending='0'then
sending<='1';
elsifcp1'eventandcp1='1'andsending='1'then
ifcount2="1111"then
count2<="0011";
sending<='0';
else
count2<=count2+1;
endif;
endif;
endprocess;
shift8:
process(cp1,clr,k,sending,count2)
variablecheckcode,t:
std_logic;
begin
ifclr='1'then
reg<="00000000";
checkcode:
='0';
sendbit<='0';
elsifsending='0'then
ifset='1'then
reg(7downto0)<=input(7downto0);
checkcode:
=k(0)XORk
(1);
l1:
foriin2to7loop
checkcode:
=checkcodeXORk(i);
endloopl1;
check<=checkcode;
endif;
sendbit<='0';
elsifsending='1'then
ifcount2<"0110"then
sendbit<='1';
elsifcp1'eventandcp1='1'andcount2>"0101"andcount2<"1110"then
t:
=reg(7);
l2:
foriin6downto0loop
reg(i+1)<=reg(i);
endloopl2;
reg(0)<=t;
sendbit<=t;
elsifcp1'eventandcp1='1'andcount2="1110"then
sendbit<=checkcode;
endif;
endif;
endprocess;
p1:
process(clk1000,count2)
begin
ifcount2="1111"then
fengming<=clk1000;
elsifcount2="0100"then
fengming<='0';
endif;
endprocess;
endfasong;
--receive.vhd
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityreceiveis
port(cp,clr,recbit,clk1000:
instd_logic;
reg:
bufferstd_logic_vector(7downto0);
check,recwrong:
bufferstd_logic;
fengming:
outstd_logic);
endreceive;
architecturejieshouofreceiveis
signalcount2:
std_logic_vector(3downto0);
signalcp2,clk500:
std_logic;
begin
count3:
process(cp,clr,recbit)
variablecount1:
std_logic_vector(3downto0);
variablem:
std_logic;
begin
ifclr='1'then
count1:
="0000";
m:
='0';
elsifrecbit'eventandrecbit='1'andm='0'then
m:
='1';
elsifcp'eventandcp='1'andm='1'then
ifcount1="1111"then
count1:
="0000";
else
count1:
=count1+1;
endif;
endif;
ifcount1<8then
cp2<='0';
else
cp2<='1';
endif;
endprocess;
count4:
process(cp2,clr,recbit)
begin
ifclr='1'then
count2<="0011";
elsifcount2>="0011"andcount2<="0110"then
ifcp2'eventandcp2='1'then
ifregbit='0'then
count2<="0011";
else
count2<=count2+1;
endif;
endif;
elsifcount2>="0111"andcp2'eventandcp2='1'then
ifcount2="1111"then
count2<="0011";
else
count2<=count2+1;
endif;
endif;
endprocess;
shift8:
process(cp2,clr,recbit,count2)
variablecheckcode:
std_logic;
begin
ifclr='1'then
reg<="00000000";
checkcode:
='0';
check<='0';
recwrong<='0';
elsifcp2'eventandcp2='0'then
ifcount2>"0110"andcount2<"1111"then
l1:
foriin6downto0loop
reg(i+1)<=reg(i);
endloopl1;
reg(0)<=recbit;
elsifcount2="1111"then
checkcode:
=recbit;
check<=recbit;
l2:
foriin0to7loop
checkcode:
=checkcodeXORreg(i);
endloopl2;
ifcheckcode='1'then
recwrong<='1';
endif;
endif;
endif;
endprocess;
p2:
process(clk1000)
variablen:
std_logic;
begin
ifclk1000'eventandclk1000='0'then
ifn='1'then
n:
='0';
elsen:
='1';
endif;
endif;
ifn='0'then
clk500<=clk1000;
elseclk500<='0';
endif;
endprocess;
p1:
process(clk1000,clk500,count2,check)
variablea:
std_logic;
begin
ifclr='1'then
a:
='0';
fengming<='0';
elsifcount2="1111"thena:
='1';
elsifcount2>="0100"andcount2<"1110"then
fengming<='0';
elsifcount2="0011"anda='1'then
ifcheck='1'thenfengming<=clk500;
elsefengming<=clk1000;
endif;
endif;
endprocess;
end