北邮 数字逻辑实验报告.docx

上传人:b****5 文档编号:7544688 上传时间:2023-01-24 格式:DOCX 页数:39 大小:315.16KB
下载 相关 举报
北邮 数字逻辑实验报告.docx_第1页
第1页 / 共39页
北邮 数字逻辑实验报告.docx_第2页
第2页 / 共39页
北邮 数字逻辑实验报告.docx_第3页
第3页 / 共39页
北邮 数字逻辑实验报告.docx_第4页
第4页 / 共39页
北邮 数字逻辑实验报告.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

北邮 数字逻辑实验报告.docx

《北邮 数字逻辑实验报告.docx》由会员分享,可在线阅读,更多相关《北邮 数字逻辑实验报告.docx(39页珍藏版)》请在冰豆网上搜索。

北邮 数字逻辑实验报告.docx

北邮数字逻辑实验报告

北京邮电大学课程设计报告

课程设计

名称

数字逻辑

学院

计算机

指导教师

班级

班内序号

学号

学生姓名

成绩

--

--

--

杨杨

--

--

--

陈陈

--

--

--

金金

教学目的:

掌握ispLEVER软件的使用方法,掌握isp器件的使用方法,用VHDL进行较复杂逻辑电路的设计和调试,熟练掌握isp器件的下载方法。

基本内容:

1.交通灯控制2.电子钟显示

3.药片装瓶系统

实验方法:

先用VHDL进行软件编程,然后下载到ISP器件,进行硬件仿真实验。

组员分工:

详见各实验报告实验分工。

学生

课程设计

报告

(附页)

遵照实践教学大纲并根据以下四方面综合评定成绩:

1、课程设计目的任务明确,选题符合教学要求,份量及难易程度

2、团队分工是否恰当与合理

3、综合运用所学知识,提高分析问题、解决问题及实践动手能力的效果

4、是否认真、独立完成属于自己的课程设计内容,课程设计报告是否思路清晰、文字通顺、书写规范

评语:

 

成绩:

指导教师签名:

年月日

注:

评语要体现每个学生的工作情况,可以加页。

实验一:

交通灯控制器设计

一、实验目的

①学习采用状态机方法设计时序逻辑电路。

②掌握ispLEVER软件的使用方法。

③掌握用VHDL语言设计数字逻辑电路。

④掌握ISP器件的使用。

二、实验所用器件和设备

在系统可编程逻辑器件ISP1032

一片

示波器

一台

万用表或逻辑笔

一只

TEC-5实验系统,或TDS-2B数字电路实验系统

一台

三、实验内容

以实验台上的4个红色电平指示灯,4个绿色电平指示灯模仿路口的东南西北4个方向的红,绿,黄交通灯。

控制这些交通灯,使它们按下列规律亮,灭。

(1)初始状态为4个方向的红灯全亮,时间1s。

(2)东,西方向绿灯亮,南,北方向红灯亮。

东,西方向通车,时间5s。

(3)东,西方向黄灯闪烁,南,北方向红灯,时间2s。

(4)东,西方向红灯亮,南,北方向绿灯亮。

南,北方向通车,时间5s。

(5)东,西方向红灯闪烁,南,北方向黄灯闪烁,时间2s。

(6)返回

(2),继续运行。

(7)如果发生紧急事件,例如救护车,警车通过,则按下单脉冲按钮,使得东,南,西,北四个方向红灯亮。

紧急事件结束后,松开单脉冲按钮,将恢复到被打断的状态继续运行。

四、设计思路

(1)将本实验分为分频,状态计数器,led输出三大模块;

(2)分频模块需要注意到占空比,采用when-else语句;

(3)状态计数器都分为5s,2s,5s,2s,四个状态时间,通过计数器作状

态转移;

(5)led输出模块的黄灯闪烁可通过2HZ的方波信号实现。

(6)选择实验台上的5kHz频率时钟,作为设计中分频的初始时钟。

(5)紧急事件发生时,要注意保存必要的信息,已被紧急事件结束后,恢复到原状态继续运行使用。

 

 

五、设计方案

模块图

1、tralight(顶层模块代码)

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitytralightis

port(clk,emg:

instd_logic;--5KHZ时钟输入,紧急输入

tout:

outstd_logic_vector(11downto0);--12盏led灯输出

tout2,tout1:

outstd_logic_vector(3downto0));--倒计时

endtralight;

architecturetopoftralightis

componentfenpin--分频模块

port(clkin:

instd_logic;--5KHZ时钟输入

clkout1:

outstd_logic;--1HZ时钟

clkout2:

outstd_logic);--2HZ时钟

endcomponent;

componentztjishuqi--状态计数器模块

port(emg1,clk1:

instd_logic;--紧急输入,1HZ时钟输入

stateout:

outstd_logic_vector(1downto0);--2位状态输出

daoout2,daoout1:

outstd_logic_vector(3downto0));--倒计时

endcomponent;

componentled--led交通灯显示模块

port(emg2,clk2:

instd_logic;--紧急输入,2HZ时钟输入(方波闪烁)

statein:

instd_logic_vector(1downto0);--2位状态输入

ledout:

outstd_logic_vector(11downto0));--12盏led灯输出

endcomponent;

signalfenpin1:

std_logic;

signalfenpin2:

std_logic;

signalstate:

std_logic_vector(1downto0);

begin

u1:

fenpinPORTMAP(clkin=>clk,clkout1=>fenpin1,clkout2=>fenpin2);

u2:

ztjishuqiPORTMAP(emg1=>emg,clk1=>fenpin1,stateout=>state,daoout2=>tout2,

daoout1=>tout1);

u3:

ledPORTMAP(emg2=>emg,clk2=>fenpin2,statein=>state,ledout=>tout);

end;

2、fenpin(底层分频模块)

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityfenpinis

port(clkin:

instd_logic;--5KHZ时钟输入

clkout1:

outstd_logic;--1HZ时钟

clkout2:

outstd_logic);--2HZ时钟

endfenpin;

architectureartoffenpinis

signaltemp:

integerrange0to4999;

begin

process(clkin)

begin

if(clkin'eventandclkin='1')then

if(temp=4999)then

temp<=0;

else

temp<=temp+1;

endif;

endif;

endprocess;

clkout1<='1'when(temp<2500)else'0';

clkout2<='1'when(temp<1250or(temp>=2500andtemp<3750))else'0';

endart;

3、ztjishuqi(底层状态计数器模块)

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityztjishuqiis

port(emg1,clk1:

instd_logic;--紧急输入,1HZ时钟输入

stateout:

outstd_logic_vector(1downto0);--2位状态输出

daoout2,daoout1:

outstd_logic_vector(3downto0));--倒计时

endztjishuqi;

architectureartofztjishuqiis

signaltemp:

integerrange0to13;

typeStateIS(s0,s1,s2,s3);

signalcurrent_state,next_state:

State;

begin

process(emg1,clk1)

begin

if(emg1='0')then

if(clk1'eventandclk1='1')then

if(temp=0)then

stateout<="00";temp<=temp+1;daoout2<="0100";daoout1<="0110";

elsif(temp>0andtemp<=4)then

stateout<="00";temp<=temp+1;daoout2<=daoout2-1;

daoout1<=daoout1-1;

elsif(temp=5ortemp=6)then

stateout<="01";temp<=temp+1;daoout1<=daoout1-1;

elsif(temp=7)then

stateout<="10";temp<=temp+1;daoout2<="0110";daoout1<="0100";

elsif(temp>7andtemp<=11)then

stateout<="10";temp<=temp+1;daoout2<=daoout2-1;

daoout1<=daoout1-1;

elsif(temp=12)then

stateout<="11";temp<=temp+1;daoout2<=daoout2-1;

elsif(temp=13)then

stateout<="11";temp<=0;daoout2<=daoout2-1;

endif;

endif;

endif;

endprocess;

endart;

4、led(底层led输出模块)

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityledis

port(emg2,clk2:

instd_logic;--紧急输入,2HZ时钟输入(方波闪烁),1HZ时钟输入

statein:

instd_logic_vector(1downto0);--2位状态输入

ledout:

outstd_logic_vector(11downto0));--12盏led灯输出

endled;

architectureartofledis

begin

process(emg2,statein,clk2)

begin

if(emg2='1')then

ledout<="001001001001";

else

casestateinis

when"00"=>ledout<="100100001001";

when"01"=>caseclk2is

when'1'=>ledout<="010010001001";

whenothers=>ledout<="000000001001";

endcase;

when"10"=>ledout<="001001100100";

whenothers=>caseclk2is

when'1'=>ledout<="001001010010";

whenothers=>ledout<="001001000000";

endcase;

endcase;

endif;

endprocess;

endart;

 

六、调试中出现的问题及解决方法

在编写交通的的程序的时候,本人没有碰到太大的技术上的问题(因为本身程序的要求比较简单,模块数也不多)。

主要的一些碰到挫折的地方有1、方波闪烁问题:

在编译成功连上线之后,发现红绿灯正常,但是黄灯不出现闪烁也不亮。

经分析代码后发现,黄灯的信号输入并没有产生方波,而只是一个一个的脉冲,要产生方波需要信号具有一定的占空比。

改进代码后此问题迎刃而解。

clkout1<='1'when(temp<2500)else'0';

clkout2<='1'when(temp<1250or(temp>=2500andtemp<3750))else'0';

2、警报使能无效:

黄灯问题解决后,我发现在警报情况下,红灯全亮,但是状态计数器并没有暂停,警报解除后状态不能回到警报之前的状态。

后发现是if语句的条件关系。

时钟上升沿信号和警报使能信号不能“与”在一个if里,需要将他们已嵌套的方式放在两个if语句里当条件。

在经过一天的编写和调试,交通灯的模型已经达到了老师及课本上的要求。

因为其他两名组员暂时还没有碰到什么问题,我开始着手增加功能的事情。

我给交通灯增加了一个倒计时功能,这并不难实现,只需在状态计数器的后面增加相应的语句,利用七段译码器实现倒计时的实现。

七、层次设计的体会

实验思路比较简单,我们没有采用元件例化的方法,但是模块划分仍然很清晰。

程序可分为分频,状态计数器,led输出三大模块(控制灯亮灭)。

层次设计将大问题分解为较小的问题,可以提高效率,使思路清晰。

八、比较不同种描述方式的心得

实验中结构体的三种描述方式都用到了:

数据流描述、结构描述、行为描述。

数据流描述逻辑清晰、描述简单。

结构描述使程序模块划分清晰,便于从宏观上把握程序功能,便于整体设计。

行为描述更容易把握程序对于不同输入或者信号所做的动作。

根据不同情况选择不同描述方法可以使程序得到优化。

九、本次设计的收获和不足

程序中多个进程同时进行,使我们更加理解了硬件的执行方式,什么是并行执行。

本次是实验小组成员共同讨论的成果,一些问题的调试,每个人都提出了自己的看法,使得程序更加完善,效率更高。

同时,提高了我们的团队合作意识,在实验设计过程中,我们得到了很多工作经验。

在状态计数器模块中,大量采用了if-else语句,幸好本实验规模不大,其实这是比较危险的。

如果能够采用标准的current-state,next-state,进行状态转移可以显得更规范。

十、实验分工

本实验由金金主编,调试及记录文档。

改进功能由金金完成。

实验二:

电子钟设计

一、实验目的

(1)掌握复杂的逻辑设计和调试

(2)学习用原理图+VHDL语言设计逻辑电路。

(3)学习数字电路模块层次设计。

(4)掌握ispLEVER软件的只用方法。

(5)熟悉ISP器件的使用

二、实验所用器件和设备

在系统可编程逻辑器件ISP1032

一片

示波器

一台

万用表或逻辑笔

一只

TEC-5实验系统,或TDS-2B数字电路实验系统

一台

三、实验内容

(1)设计并用ISP1032实现一个电子钟。

电子钟具有下述功能:

a)试验台上的6个数码管显示时、分、秒。

b)能使电子钟复位(清零)。

c)能启动或者停止电子钟运行。

d)再电子钟停止运行状态下,能够修改时、分、秒的值。

e)具有报时功能,整点时喇叭鸣叫。

(2)要求整个设计分为若干模块。

顶层模块用原理图设计,底层模块用VHDL语言设计。

(3)在试验台上调试设计。

电子钟设计框图

四、设计思路

实验要求以VHDL和原理图两种方式设计。

时钟用一个模24的计数器来实现;分钟和秒钟则分别用一个模60的计数器来实现;要实现自动计时,则需要连上实验台的5KHz提供脉冲,还需要一个分频的模块dclk,使其吻合时钟速度;整点报时则用一个ring的模块实现,分钟进位时开始计数从而实现报时5秒。

clock24(时钟计数)

clock(顶层模块)clock60(分钟和秒钟计数

dclk(分频,提供1Hz的时钟脉冲)

ring(实现整点报时)

五、代码实现

原理图设计

 

顶层模块,用于整合整个时钟系统

libraryieee;

useieee.std_logic_unsigned.all;

useieee.std_logic_1164.all;

entityclockis

port(clr,clk,tclk,timing:

instd_logic;--清零,5KHz,QD,暂停

con:

instd_logic_vector(2downto0);--校时时选择时,分,秒

h0,m1,m0,s1,s0:

outstd_logic_vector(3downto0);--分别对应时钟,分钟,秒钟

h1:

outstd_logic_vector(6downto0);

c,speaker,light:

outstd_logic);--时钟进位,响铃,上下午灯

endclock;

architecturearcofclockis

componentclock60--模60计数器

Port(clks,sclr,sclk,stiming:

instd_logic;

v1,v0:

outstd_logic_vector(3downto0);

co:

outstd_logic);

ENDcomponent;

componentdclk--分频,提供1Hz脉冲

port(high,con1:

instd_logic;--con1表示校时按钮

low:

outstd_logic);

endcomponent;

componentclock24--模24计数器

port(clkh,hclr,hclk,htiming:

instd_logic;

y0:

outstd_logic_vector(3downto0);

Y:

outstd_logic_vector(6downto0);

co,noon:

outstd_logic);

endcomponent;

componentringis--实现响铃

port(cclk,cc1,cc2:

instd_logic;

loud:

outstd_logic);

endcomponent;

signalc1,c2,clk1:

std_logic;

begin

u1:

dclkportmap(high=>clk,low=>clk1,con1=>timing);--提供脉冲(校时时不提供)

u2:

clock60portmap(sclr=>clr,stiming=>con(0),sclk=>tclk,clks=>clk1,v0=>s0,v1=>s1,co=>c1);

u3:

clock60portmap(sclr=>clr,stiming=>con

(1),sclk=>tclk,clks=>c1,v0=>m0,v1=>m1,co=>c2);

u4:

clock24portmap(hclr=>clr,htiming=>con

(2),hclk=>tclk,clkh=>c2,y0=>h0,Y=>h1,co=>c,noon=>light);

u5:

ringportmap(cclk=>clk1,cc1=>c1,cc2=>c2,loud=>speaker);

endarc;

底层模块clock24,用于时钟计时、校时及显示

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityclock24is

port(clkh,hclr,hclk,htiming:

instd_logic;

y0:

outstd_logic_vector(3downto0);--个位

Y:

outstd_logic_vector(6downto0);--十位

co,noon:

outstd_logic);--进位,上下午灯

endclock24;

architecturearc2ofclock24is

signalt1,t0:

std_logic_vector(3downto0);

signalbibibi:

std_logic;

begin

bibibi<=clkhwhen(htiming='0')elsehclk;--判断是否处于校时状态

process(bibibi,hclr)

begin

if(hclr='1')then--清零

t0<="0000";

t1<="0000";

elsif(bibibi'eventandbibibi='1')then

if(t1=2andt0=3andhtiming='0')then--模24进位

co<='1';

else

co<='0';

endif;

--计数器

if(t0=9)then

t0<="0000";

t1<=t1+1;

elsif(t1=2andt0=3)then

t0<="0000";

t1<="0000";

else

t0<=t0+1;

endif;

--计数器

ENDIF;

endprocess;

y0<=t0;

noon<='1'when(t1<1or(t1=1andt0<3))else'0';--上午亮灯,下午灯灭

Y<="1111110"whent1="0000"else--0

"0110000"whent1="0001"else--1

"1101101"whent1="0010"else--2

"0000000";

endarc2;

底层模块clock60,用于分钟、秒钟的计时与校时

libraryIEEE;

useIEEE.STD_LOGIC_1164.ALL;

useIEEE.STD_LOGIC_UNSIGNED.ALL;

entityclock60is

Port(clks,sclr,sclk,stiming:

instd_logic;

v0,v1:

outstd_logic_vector(3downto0);--个位,十位

co:

outstd_logic);--进位

endclock60;

architecturearc1ofc

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 哲学历史

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1