串行口数据传输的仿真及硬件实现.docx
- 文档编号:8243475
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:21
- 大小:591.08KB
串行口数据传输的仿真及硬件实现.docx
《串行口数据传输的仿真及硬件实现.docx》由会员分享,可在线阅读,更多相关《串行口数据传输的仿真及硬件实现.docx(21页珍藏版)》请在冰豆网上搜索。
串行口数据传输的仿真及硬件实现
串行口数据传输的仿真及硬件实现
学院:
信息与通信工程学院
专业:
通信工程
班级:
姓名:
序号:
一、实验目的
综合数字逻辑电路和串行口通信的有关知识,用硬件独立设计完成一个简单的串行口数据传输系统,并用FPGA可编程逻辑器件进行仿真。
二、实验要求
1)发送信息码:
111100010011010;
2)用同步检测电路检测同步码:
1111000,并使电路板加电后首先显示同步码;
3)同步码及其他各组串行码要求在数码管上逐个显示;
4)字符检测电路中先用串行检测方法设计实现,再用并行检测方法设计实现。
三、总体方案框图
字符检测电路
控制电路
串并转换
锁存接收
显示电路
时钟电路
信息码发生器
电路总体分为7个模块:
时钟电路模块、字符发生器模块、串/并转换模块、字符检测电路模块、控制电路模块、锁存显示模块和显示电路模块。
各模块间的输入输出数据流如图所示。
四、各部分电路的数字逻辑设计过程和结果
1、时钟电路模块:
实验室所提供的晶振的时钟频率为1MHz,若直接使用人眼将无法正常观测出实验结果。
所以需要设计分频模块,将1MHz的时钟频率通过分频器降低到约2Hz,这样才可以正确显示结果。
本次实验使用74LS163四位同步计数器级联实现分频功能。
每个74LS163最多为2^4=16分频。
为了实现本实验分频的要求,分频系数应该达到:
10^6÷2=5×10^5≈2^19。
所以需要5块74LS163芯片级联实现分频,所得频率为1MHz/2^19=1.9Hz.具体电路图如下:
2、字符发生器模块:
本次试验要求发送端产生信息码为111100010011010这个15位循环码。
字符发生模块使用由D触发器构成移位寄存器的序列信号发生器。
由于循环码为15位,2^3<15<2^4,故至少应该使用4位D触发器。
经检查,此序列所构成的15个4位的序列不重复,刚好可以用4为D触发器来做次序列发生器,D触发器选用74LS175四D触发器。
状态转移表:
Q4
Q3
Q2
Q1
D
1
1
1
1
0
1
1
1
0
0
1
1
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
1
1
1
0
1
0
1
0
1
0
1
0
1
0
1
1
1
0
1
1
1
0
1
1
1
1
卡诺图:
由卡诺图得:
0000项为任意项,为了确保电路可以自启动,将其当1项圈入,得D=。
电路图如下:
3、串/并转换模块:
串并转化的实现可以通过移位寄存器来实现,因为需要7位并行输出,所以需要两块移位寄存器74LS194级联构成。
电路图如下:
4、串行字符检测模块:
串行字符检测需要一位一位检测,然后每位都符合才输出信号。
若每位都检测,将会使用较多触发器,使电路复杂化。
经过观察,同步码1111000中后四位1000在整个序列111100010011010中是唯一的,所以检测1000四位即可。
当连续有4位与1000相应匹配时,则输出信号。
状态转移图如下:
对A、B、C、D分别编码为00、01、11、10,则
状态转移表为:
D=0
D=1
00
00
01
01
11
01
11
10
00
10
00
00
输出为:
Z
D=0
D=1
00
0
0
01
0
0
11
0
0
10
1
0
卡诺图分别如下:
所以,由卡诺图可得:
D1=
D2=
Z=
由此可得到电路图:
5、并行字符检测模块:
由两个数据比较器74LS85级联可得7位数据比较器,当并行输入为1111000时输出高电平作为控制电路输入,实现并行字符检测。
具体电路图如下:
6、控制电路模块:
控制电路完成的功能比较复杂。
首先,控制电路要保证在检测到同步码之前,锁存器关闭,没有任何输出;其次,在检测到同步码之后,字符检测电路不能对后级有任何影响,而是由控制电路控制每个7位输出一次。
对于第一个功能可以使用一块D触发器74LS74接受字符检测电路的信号,再通过反馈电路使接收到同步码产生的高电平后D触发器的时钟信号恒为1,无触发沿,电路输出维持原状态,即恒为1,对锁存电路没有影响。
对于第二个功能,可以由一个7进制计数器实现,这里选用同步置位的计数器74LS161。
用进位信号的非作为预置信号,计数器的状态循环为:
10011010101111001101111011111001。
并用D触发器的输出和主时钟信号的与作为计数器的时钟,确保计数器从检测电路输出第一个高电平,即同步码1111000第一次出现的时刻起计数。
并行检测控制电路:
由于信息码经过串并转换电路时延迟了一个CP,所以并行检测的输出比同步码1111000的输出晚了一个CP,而计数器74LS161在时钟信号未到达时默认起始状态为0000,故须在15个CP之后才产生第一个预置信号,从而才开始7进制计数。
故7进制计数器输出的第一个高电平脉冲正好比第一个同步码1111000的输出迟了16个CP,从而正好对上了第二个同步码1111000的输出,从而达到使电路首先输出同步码1111000,再逐个显示其他各组串行码的目的。
具体见坐标纸所画波形图。
串行检测控制电路:
由于串行检测电路的信号输入直接由信号发生器接入,不需经过串并转换电路,故其输出比并行检测早一个时钟,为了共用控制电路,用一个D触发器将串行检测的输出延迟一个时钟再接入控制电路。
具体见坐标纸所画波形图。
7、锁存显示模块:
锁存电路只需一块74LS273锁存芯片,将串并转换的并行输出作为74LS273的数据输入,
七进制计数器的输出作为74LS273的时钟信号,控制电路D触发器输出作为74LS273的清零端,实现试验要求。
电路如下:
五:
总体硬件电路原理图
1)硬件串行检测原理图:
2)硬件并行检测原理图:
六、软件仿真
1)原理图仿真
由于软件仿真的计数器74LS161在时钟信号未到之前的默认起始状态为预置状态,时钟信号一到即开始7进制计数,与硬件的默认起始状态为0000不同。
故软件仿真的原理图与硬件的不同,而是根据信号沿的出现时刻作了相应调整。
串行检测仿真原理图:
在硬件串行检测原理图的基础上,将D触发器的输出延迟7个CP后再作为控制电路的一个输出,使计数器的第一个输出脉冲不起作用,从而使锁存显示电路从计数器的第二个输出脉冲开始输出,从而使电路首先输出同步码1111000,再逐个显示其他各组串行码。
串行检测仿真波形图:
a:
主时钟信号;
bcdefgh:
锁存显示电路输出;
s\x:
分频器输入\输出;
clk:
7进制计数器输出(锁存器273的clk);
clr:
延迟了7个CP的D触发器输出(锁存器273的clr);
signal:
信息码输出;cxjc:
串行检测信号输出;
q:
D触发器输出;dclk:
D触发器的时钟信号。
并行检测仿真原理图:
将检测电路的检测码从1111000改为0011010,从而将各输出信号提前7个CP,从而使得7进制计数器的第一个输出脉冲即对准1111000的输出。
并行检测仿真波形:
a:
主时钟信号;b:
信息码波形;c:
7进制计数器进位输出
d:
并行检测输出;e:
D触发器输出;
fghijkl:
锁存器输出;
2)VHDL仿真
1、分频器模块程序:
P0:
PROCESS(clk)
BEGIN
IFclk'eventANDclk='1'THEN
IFtmp=65535THEN
tmp<=0;
ELSEtmp<=tmp+1;
ENDIF;
IFtmp<32768THEN
clk_out<='0';
ELSEclk_out<='1';
ENDIF;
ENDIF;
ENDPROCESSp0;
2、串行检测程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYchuanis
PORT(
clk:
INSTD_LOGIC;//主时钟信号输入
ss:
OUTSTD_LOGIC;//序列信号发生器输出ss<=s;
testout:
OUTSTD_LOGIC;//串行检测模块输出
jc1:
OUTSTD_LOGIC;//控制模块输出jc1<=jc
bs1:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);//串并转换模块输出bs1<=bs
finalout:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));//所存显示模块输出
ENDchuan;
ARCHITECTUREaOFchuanIS
SIGNALtmp:
INTEGERRANGE0TO14;
SIGNALs:
STD_LOGIC;//序列信号发生器输出ss<=s;
TYPEstate_typeIS(s0,s1,s2,s3,s4,s5,s6);
SIGNALstate:
state_type;
SIGNALj_tmp:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALjc:
STD_LOGIC;//控制模块输出jc1<=jc
SIGNALbs:
STD_LOGIC_VECTOR(6DOWNTO0);//串并转换模块输出bs1<=bs
BEGIN
p1:
PROCESS(clk)//p1:
序列信号发生器模块
BEGIN
IF(clk'eventANDclk='1')THEN
IFtmp=14THEN
tmp<=0;
ELSE
tmp<=tmp+1;
ENDIF;
CASEtmpIS
WHEN4|5|6|8|9|12|14=>s<='0';
WHENOTHERS=>s<='1';
ENDCASE;
ss<=s;
ENDIF;
ENDPROCESSp1;
p2:
PROCESS(clk)//p2串行检测模块
BEGIN
IF(clk'EVENTANDclk='1')THEN
CASEstateIS
WHENs0=>IF(s='1')THENstate<=s1;
ELSEstate<=s0;ENDIF;
testout<='0';
WHENs1=>IF(s='1')THENstate<=s2;
ELSEstate<=s0;ENDIF;
testout<='0';
WHENs2=>IF(s='1')THENstate<=s3;
ELSEstate<=s0;ENDIF;
testout<='0';
WHENs3=>IF(s='1')THENstate<=s4;
ELSEstate<=s0;ENDIF;
testout<='0';
WHENs4=>IF(s='0')THENstate<=s5;
ELSEstate<=s4;ENDIF;
testout<='0';
WHENs5=>IF(s='0')THENstate<=s6;
ELSEstate<=s1;ENDIF;
testout<='0';
WHENs6=>IF(s='1')THENstate<=s0;
ELSEstate<=s1;ENDIF;
testout<='1';
ENDCASE;
ENDIF;
ENDPROCESSp2;
p3:
PROCESS(clk,jc)//p3控制模块
BEGIN
IF(clk'EVENTANDclk='1')THEN
IFj_tmp="0111"THEN
j_tmp<="0001";
ELSEj_tmp<=j_tmp+1;
ENDIF;
jc<=j_tmp
(1)andj_tmp
(2)andj_tmp(0);
ENDIF;
jc1<=jc;
ENDPROCESSp3;
p4:
PROCESS(clk,s,bs)//p4串并转换模块
BEGIN
IF(clk'EVENTANDclk='1')THEN
bs(6)<=bs(5);
bs(5)<=bs(4);
bs(4)<=bs(3);
bs(3)<=bs
(2);
bs
(2)<=bs
(1);
bs
(1)<=bs(0);
bs(0)<=s;
ENDIF;
bs1<=bs;
ENDPROCESSp4;
p5:
PROCESS(jc,bs)//p5所存显示模块
BEGIN
IF(jc'EVENTANDjc='1')THEN
finalout<=bs;ENDIF;
ENDPROCESSp5;
ENDa;
串行检测VHDL仿真波形图:
3并行检测程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYbingIS
PORT(
clk:
INSTD_LOGIC;//时钟信号
B:
OUTSTD_LOGIC;//并行检测模块输出
qc:
OUTSTD_LOGIC;//七进制计数器输出
XL:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);//串并转换模块输出
XS:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));//锁存器输出
ENDbing;
ARCHITECTUREpanOFbingIS
SIGNALtmp:
INTEGERRANGE0TO14;
SIGNALq_out:
STD_LOGIC;//串并转换
模块输出XL<=q;
SIGNALdi:
STD_LOGIC;
SIGNALtemp:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALq:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALqc_out:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALqc_tmp:
STD_LOGIC;
BEGIN
P1:
PROCESS(clk)
BEGIN
IFclk'eventANDclk='1'THEN
IFtmp=14THEN
tmp<=0;
ELSEtmp<=tmp+1;
ENDIF;
ENDIF;
ENDPROCESSp1;
P2:
PROCESS(tmp)
BEGIN
CASEtmpIS
WHEN4|5|6|8|9|12|14=>q_out<='0';
WHENOTHERS=>q_out<='1';
ENDCASE;
ENDPROCESSp2;//输出所需序列信号
P3:
PROCESS(clk)
BEGIN
IFclk'eventANDclk='1'THEN
di<=q_out;
temp(6)<=temp(5);
temp(5)<=temp(4);
temp(4)<=temp(3);
temp(3)<=temp
(2);
temp
(2)<=temp
(1);
temp
(1)<=temp(0);
temp(0)<=di;
q<=temp;
XL<=q;
ENDIF;
ENDPROCESSp3;//串并转换
P4:
PROCESS(q,clk)
BEGIN
IFclk'eventANDclk='1'THEN
IF(q="1111000")THENB<='1';
ELSEB<='0';
ENDIF;
ENDIF;
ENDPROCESSp4;//并行检测,当并行输出为
1111000时出1
P5:
PROCESS(clk)
BEGIN
IFclk'eventANDclk='1'THEN
IFqc_out="1000"THEN
qc_out<="0010";
qc_tmp<='1';
ELSEqc_out<=qc_out+1;
qc_tmp<='0';
ENDIF;
qc<=qc_tmp;
ENDIF;
ENDPROCESSp5;//控制模块:
七进制计数器输出,
每七个时钟输出一个高电平
P6:
PROCESS(qc_tmp)
BEGIN
IFqc_tmp'eventANDqc_tmp='1'THEN
XS<=q;
ENDIF;
ENDPROCESSp6;//以七进制计数器为时钟,将并
行输出输入锁存器(锁存显示)
ENDpan;
并行检测VHDL仿真输出波形:
五、实验总结
本次实验的内容为串行口数据传输,即产生一组周期序列111100010011010,并检测其中一组同步码1111000予以首先输出显示,再逐个显示其他串行码。
通过本次实验,复习巩固了有关的数字电路与逻辑设计的知识,如:
序列信号发生器的设计、状态机的设计、分频器的设计,还有各种移存器、锁存器、触发器的功能与使用。
而在硬件实现的过程中,不仅提高了整体布局、布线能力和对各种芯片的功能、引脚分布及使用的熟识度,而且,在后期查错纠错的过程中,使我们掌握了利用示波器的双踪显示数字电路的各输出波形进行查错的技巧,更使我们更加深刻的体会到各种触发沿的出现时刻对数字电路的正确运行的重要性,而我们也在实验中掌握了如何利用D触发器对触发沿进行时延调整,从而对在理论课上学到的知识有了更进一步的了解。
在对电路仿真的过程中,除了复习巩固对软件QuartusⅡ的以及VHDL语言的使用之外,最大的收获就是发现了软件仿真与硬件实现之间的不同:
即是软件仿真的计数器74LS161在时钟信号未到之前的默认起始状态为预置状态,而硬件的默认起始状态为0000。
在实验中不能凭想当然进行电路设计,而必须通过检测实际信号来做决定。
而通过编写VHDL语言进行仿真时,我们体会到了编写仿真程序与设计实际电路之间的思维转换与描述方式的转换,加深了对VHDL语言的理解。
此外,这次实验是我们第一次用分组的形式与同学合作进行的实验,实验时间较长,实验任务比较重,考验了我们与搭档之间的交流协作能力以及对整个实验过程的时间分配和进度安排,对我们除实验能力以外的综合能力也有了要求。
通过本次实验,提高了我们的动手能力以及独立思考、独立解决问题的能力,加深了我们对数字电路的理解,培养了我们对数字电路学习的兴趣。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 串行口 数据传输 仿真 硬件 实现