江苏大学VHDL课程设计报告.docx
- 文档编号:26559100
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:17
- 大小:279.31KB
江苏大学VHDL课程设计报告.docx
《江苏大学VHDL课程设计报告.docx》由会员分享,可在线阅读,更多相关《江苏大学VHDL课程设计报告.docx(17页珍藏版)》请在冰豆网上搜索。
江苏大学VHDL课程设计报告
VHDL课程设计报告
学院:
电气学院
班级:
0000
指导老师:
00
学号:
0000000
姓名:
000000
一、并行接口电路8255的设计
结构设计
1.可编程并行接口的‘0’工作模式即基本的输入输出方式。
模块应由3种逻辑电路构成锁存器、组合逻辑电路、和三态缓冲器。
2.各模块的设计与实现
可编程8255并行接口的各模块由6个进程描述它们别是读写的进程和形成pa、pb、pc三态输出的三个进程。
a)构造体中各信号定义1)内部总线
在构造体中定义了两条内部总线interal_bus_out和internal_bus_in所有8位.
2)锁存器和寄存器输出构造体中信号pa_latch,pb_latch和pc_latch是8255模块中A口、B口及C口锁存器的输出。
信号ctrreg是方式控制寄存器的输出.
b)写进程8255模块在方式0下写进程的流程图如图5.1所示。
写的进程最前面是将写8255
时的最高数据位送标志寄存器保存以便以后在判别是方式控制字还是位控制字时使用。
这里的标志寄存器采用的是变量ctrregf而没有采用信号量。
当复位信号有效时(reset='1'),对8255芯片进行初始化。
前面提到8255模块复.位后所有端口都处于输入方式故方式控制字寄存器初始化的值为9BH,其它均设置为"0"。
c)读进程读进程的工作过程是当片选信号有效(cs=‘0’)和读信号有效(rd=‘0)时从A口或B口或C口读入外部设备提供的数据。
需要注意的是在本设计中所有端口输入的信号都是不锁存的。
流程图:
源程序:
LIBRARYieee;
USEieee.std_logic_1164.ALL;
entitycheng_8255is
port(
reset:
instd_logic;--复位信号
rd:
instd_logic;--读信号
wr:
instd_logic;--写信号
cs:
instd_logic;--片选信号
a0:
instd_logic;--选择端口
a1:
instd_logic;--选择端口
pa:
inoutstd_logic_vector(7downto0);--A口
pb:
inoutstd_logic_vector(7downto0);--B口
pcl:
inoutstd_logic_vector(3downto0);--C口低四位
pch:
inoutstd_logic_vector(3downto0);--C口高四位
databus:
inoutstd_logic_vector(7downto0)--与CPU数据接口
);
endcheng_8255;
architecturemode0ofcheng_8255is
signalinternal_bus_out:
std_logic_vector(7downto0);--数据写入缓冲
signalinternal_bus_in:
std_logic_vector(7downto0);--数据读入缓冲
signalst,port_no:
std_logic_vector(1downto0);
signalctrl_reg:
std_logic_vector(7downto0);--控制寄存器
signalpa_latch,pb_latch,pc_latch:
std_logic_vector(7downto0);
signalctrl_reg_func:
std_logic;--控制寄存器的功能控制位
begin
port_no<=a1&a0;--选择端口号A口B口C口或控制寄存器
st<=ctrl_reg(3)&ctrl_reg(0);--C口高四位低四位或8位
read:
process(rd,cs)--读进程
begin
if(cs='0'andrd='0')then
if(port_no="00"andctrl_reg(4)='1')then
internal_bus_in<=pa;--将A口数据读入到8255
elsif(port_no="01"andctrl_reg
(1)='1')then
internal_bus_in<=pb;--将B口数据读入到8255
elsif(port_no="10"andst="01")then
internal_bus_in(3downto0)<=pcl(3downto0);--C口低四位
elsif(port_no="10"andst="10")then
internal_bus_in(7downto4)<=pch(3downto0);--C口高四位
elsif(port_no="10"andst="11"andctrl_reg(7)='1')then
internal_bus_in(3downto0)<=pcl(3downto0);
internal_bus_in(7downto4)<=pch(3downto0);
endif;
elseinternal_bus_in<="ZZZZZZZZ";--高阻
endif;
databus<=internal_bus_in;--将输入到8255的数据送往CPU
endprocess;
write1:
process(cs,wr,reset)--写进程1
begin
if(reset='1')thenctrl_reg_func<='0';--位操作控制位置0位操作
elsif(cs='0'andwr='0')then
ctrl_reg_func<=databus(7);
internal_bus_out<=databus;--数据写入到内部寄存器
endif;
endprocess;
write2:
process(reset,wr)--写进程2
begin
if(reset='1')then--异步复位
pa_latch<="00000000";
pb_latch<="00000000";
pc_latch<="00000000";
ctrl_reg<="10011011";--控制寄存器
elsif(wr'eventandwr='1')then
if(ctrl_reg_func='1'andport_no="11"andcs='0')then
ctrl_reg<=internal_bus_out;--数据送控制寄存器
elsif(ctrl_reg(7)='1'andcs='0'andport_no="00")then
pa_latch<=internal_bus_out;--数据送至A口锁存器
elsif(ctrl_reg(7)='1'andcs='0'andport_no="01")then
pb_latch<=internal_bus_out;--数据送至B口锁存器
elsif(ctrl_reg(7)='1'andcs='0'andport_no="10")then
pc_latch<=internal_bus_out;--数据送至C口锁存器
endif;
if(ctrl_reg_func='0'andcs='0'andport_no="11")then
caseinternal_bus_out(3downto0)is--位操作
when"0000"=>pc_latch(0)<='0';
when"0010"=>pc_latch
(1)<='0';
when"0100"=>pc_latch
(2)<='0';
when"0110"=>pc_latch(3)<='0';
when"1000"=>pc_latch(4)<='0';
when"1010"=>pc_latch(5)<='0';
when"1100"=>pc_latch(6)<='0';
when"1110"=>pc_latch(7)<='0';
when"0001"=>pc_latch(0)<='1';
when"0011"=>pc_latch
(1)<='1';
when"0101"=>pc_latch
(2)<='1';
when"0111"=>pc_latch(3)<='1';
when"1001"=>pc_latch(4)<='1';
when"1011"=>pc_latch(5)<='1';
when"1101"=>pc_latch(6)<='1';
when"1111"=>pc_latch(7)<='1';
whenothers=>null;
endcase;
endif;
endif;
endprocess;
pa_out:
process(pa_latch)--A口锁存器数据输出到A口
begin
if(ctrl_reg(4)='0')thenpa<=pa_latch;
elsepa<="ZZZZZZZZ";
endif;
endprocess;
pb_out:
process(pb_latch)--B口锁存器数据输出到B口
begin
if(ctrl_reg
(1)='0')thenpb<=pb_latch;
elsepb<="ZZZZZZZZ";
endif;
endprocess;
pcl_out:
process(pc_latch)--C口低四位
begin
if(ctrl_reg(0)='0')thenpcl<=pc_latch(3downto0);
elsepcl<="ZZZZ";
endif;
endprocess;
pch_out:
process(pc_latch)--C口高四位
begin
if(ctrl_reg(3)='0')thenpch<=pc_latch(7downto4);
elsepch<="ZZZZ";
endif;endprocess;
endmode0;
结果是:
输入输出结果是一致的;
例如输入pa,pb为37和38时的波形如下
小结:
8255并行接口电路在微机课上学的,仅仅是了解他的部分功能,然而通过用vhdl语言描述后绝得它更透明,根据控制寄存器的状态来处理端口选择,数据输入输出,不再像以前那样模糊,vhdl更加直观,这个程序非常复杂,开始很晦涩难懂,真正熟络了就是有条有理了
自动售货机
内容和要求:
①3种产品的绿茶1元/瓶,可乐4元/瓶,果汁6元/瓶货物不限量
②3个投币口1元5元10元
③交易时间一分钟系统有复位键1次只能买1种商品但数量不限
流程图:
源程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSHJ_chengIS
PORT(CLK:
INSTD_LOGIC;
num:
INinteger;
COIN1:
INSTD_LOGIC;--1元输入
COIN2:
INSTD_LOGIC;--5元输入
COIN3:
INSTD_LOGIC;--10输入
PRICE1:
INSTD_LOGIC;--1元绿茶
PRICE2:
INSTD_LOGIC;--4元可乐
PRICE3:
INSTD_LOGIC;--6元果汁
Y0:
OUTSTD_LOGIC;--购买成功信号
Y1:
OUTSTD_LOGIC;--退币信号
MONEY:
OUTinteger;
PAYBACK:
OUTinteger);
ENDSHJ_cheng;
ARCHITECTUREBEHAVOFSHJ_chengIS
SIGNALCOIN:
integer;--保存钱数
SIGNALCOUT:
integer;--保存找零
BEGIN
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCOIN1='1'THENCOIN<=COIN+1;Y0<='0';Y1<='0';
ELSIFCOIN2='1'THENCOIN<=COIN+5;Y0<='0';Y1<='0';
ELSIFCOIN3='1'THENCOIN<=COIN+10;Y0<='0';Y1<='0';
ELSIFPRICE1='1'THEN
IFCOIN>=numTHENY0<='1';Y1<='0';COUT<=COIN-num;
ELSEY0<='0';Y1<='1';COUT<=COIN;
ENDIF;
ELSIFPRICE2='1'THEN
IFCOIN>=num*4THENY0<='1';Y1<='0';COUT<=COIN-num*4;
ELSEY0<='0';Y1<='1';COUT<=COIN;
ENDIF;
ELSIFPRICE3='1'THEN
IFCOIN>=num*6THENY0<='1';Y1<='0';COUT<=COIN-num*6;
ELSEY0<='0';Y1<='1';COUT<=COIN;
ENDIF;
ENDIF;
ENDIF;
MONEY<=COIN;--输入的钱数
PAYBACK<=COUT;--找零
ENDPROCESS;
ENDBEHAV;
仿真图:
顾客投入15元钱,购买两瓶果汁,系统提示购物成功,并找零3元;
顾客投入10元钱,购买两瓶可乐,系统提示购物失败,显示警告;
小节:
顾客投入钱币后系统开始数钱,当然只认三种,通过三种信号控制实现,然后在进行买卖处理,程序很简单,一眼明了,但是在调试时感触最多的是每个时钟只处理一种进程,而且实际情况是首先顾客先投入钱币,然后输入物品种类,再输入物品数量,这个顺序很重要,但是在开始不易发现,其他觉得在现实生活中遇到的实物自己能用vhdl语言来仿真实现,感觉不可思议
卡式电话计费器:
①插入电话卡后自动读出余额
②并显示通话后剩余费用及时间
③市话3毛/分钟,长话6毛/分钟,特殊电话不收费(110、120、119.)
④卡上余额不足1元时提示警告并显示,余额为0时自动停止
流程图:
源程序
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_arith.all;
Useieee.std_logic_unsigned.all;
Entityjfqis
Port(
clk,reset,read:
instd_logic;
cut:
bufferstd_logic;
k1k2:
instd_logic_vector(1downto0);
initialml:
inintegerrange0to9;
initialmh:
inintegerrange0to9;
miaol,miaoh,fenl,fenh:
outintegerrange0to9;
warn:
bufferstd_logic;
moneyl,moneyh:
outintegerrange0to9
);
Endjfq;
architecturebhvofjfqis
Signaltime2,time3,time4:
integerrange0to9;
Signaltime1:
integerrange0to9:
=1;
Signalmoneya,moneyb:
integerrange0to9;
signala:
std_logic:
='0';
begin
Process(clk,cut)
Begin
ifcut='1'thenTime1<=time1;Time2<=time2;Time3<=time3;Time4<=time4;--电话切断,显示时间
else
if(clk'eventandclk='1')then
iftime1=9thentime1<=0;--计时模块
iftime2=5thentime2<=0;
iftime3=9thentime3<=0;
iftime4=5thentime4<=0;
Elsetime4<=time4+1;
Endif;
Elsetime3<=time3+1;
Endif;
Elsetime2<=time2+1;
Endif;
Elsetime1<=time1+1;
Endif;
Else
Time1<=time1;Time2<=time2;Time3<=time3;Time4<=time4;
endif;
endif;
endprocess;
process(time1,time2,cut,clk)
begin
ifcut='1'thena<='1';--电话切断,a持续高电平
elseif(time1=0andtime2=0)thena<='0';
elsea<='1';
endif;
endif;
endprocess;
Process(k1k2,a,read,clk)
Begin
ifread='1'then
moneya<=initialml;moneyb<=initialmh;
elseifa'eventanda='1'then--a上升沿开始计费
ifmoneyb>=1thenwarn<='0';--大于1元,不警告
ifk1k2="01"then--市话,每分钟3毛
ifmoneya=2thenmoneya<=9;moneyb<=moneyb-1;
elsifmoneya=1thenmoneya<=8;moneyb<=moneyb-1;
Elsifmoneya=0thenmoneya<=7;moneyb<=moneyb-1;
Elsemoneya<=moneya-3;moneyb<=moneyb;
Endif;
elsifk1k2="10"then--长话,每分钟6毛
ifmoneya=5thenmoneya<=9;moneyb<=moneyb-1;
Elsifmoneya=4thenmoneya<=8;moneyb<=moneyb-1;
Elsifmoneya=3thenmoneya<=7;moneyb<=moneyb-1;
Elsifmoneya=2thenmoneya<=6;moneyb<=moneyb-1;
Elsifmoneya=1thenmoneya<=5;moneyb<=moneyb-1;
Elsifmoneya=0thenmoneya<=4;moneyb<=moneyb-1;
Elsemoneya<=moneya-6;moneyb<=moneyb;
Endif;
elsemoneya<=moneya;moneyb<=moneyb;--其余情况,不扣钱
endif;
elsewarn<='1';moneya<=moneya;moneyb<=moneyb;--小于一元,警告
endif;
elsewarn<=warn;
endif;
endif;
endprocess;
Process(reset,clk,warn)
begin
if(reset='1')thencut<='1';--复位,信号切断
elseifclk'eventandclk='1'then
ifwarn='1'thencut<='1';
elsecut<='0';
endif;
elsecut<=cut;
endif;
endif;
Endprocess;
process(cut)
begin
ifcut'eventandcut='1'then--电话切断显示余额以及时间
moneyl<=moneya;moneyh<=moneyb;
miaol<=time1;miaoh<=time2;fenl<=time3;fenh<=time4;
endif;
endprocess;
Endbhv;
波形是
用户卡内余额是1块3毛,然后打国际长途波形如下
小结
这些天的EDA课程设计让我学会如何去熟练的使用MAX+plusII软件编程仿真,调试出理想的波形,深深地体会到vhdl语言的精髓,虽然我仍可能只接触到他的皮毛,但是明显感觉到他的功能的强大。
并且我也深刻意识理论与实际的紧密结合,现实中的通话计费系统原理可以按照我的思想来实现,但是思维要严谨,考虑要全面
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 江苏 大学 VHDL 课程设计 报告