串行口数据传输的仿真和硬件实现实验Word下载.docx
《串行口数据传输的仿真和硬件实现实验Word下载.docx》由会员分享,可在线阅读,更多相关《串行口数据传输的仿真和硬件实现实验Word下载.docx(23页珍藏版)》请在冰豆网上搜索。
![串行口数据传输的仿真和硬件实现实验Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/30/aa3986d4-f7be-4c0a-b4a8-752f7b265bd3/aa3986d4-f7be-4c0a-b4a8-752f7b265bd31.gif)
假设采纳并行检测,有并行数据输入端、检测信号输出端;
假设采纳串行检测,有串行数据接入端、时钟信号输入端、
检测信号输出端。
(5)操纵电路:
时钟信号输如端、检测信号输入端、操纵信号输出端。
(6)锁存电路:
操纵信号输入端、并行数据输入端、并行数据输出端。
(7)显示电路:
并行数据输入端。
3、各部分的逻辑设计:
〔1〕时钟电路设计:
由于晶振产生的时钟频率为1MHz,而为了显示稳固,需要的时钟频率为2Hz以下,因此需要分频。
本次设计采纳的是同步计数器来进行分频,输出端为Qa~Qd,分频系数为2N〔N为端口数〕。
每个74LS163最多为24=16分频,而需要的分频系数:
106÷
2=5×
105≈219。
因此需要5块74LS163芯片用作分频。
具体电路图如下:
所得的输出频率约为2Hz.
〔2〕序列信号发生器设计:
本次实验需要产生的序列为15位循环码〝111100010011010〞,通过检验可知,此序列产生的15个4位序列不互相重复,因此能够用4个D触发器来构造序列发生器。
此序列信号发生器的反馈电路能够通过〝与〞、〝或〞、〝非〞逻辑门或数据选择器实现。
本次实验中,我们使用了数据选择器。
状态表及卡诺图如下所示:
Q4
Q3
Q2
Q1
Q4Q3
Q2Q1
00
01
11
10
φ
1
D
为使系统能够自启动,令φ=1。
使用Q4Q3作为数据选择器的输入,有
C0=
,C1=1,C2=1,C3=0
故序列信号发生器的电路图设计如下所
〔3〕串并转换电路的设计
因为系统需要7位并行输出,因此串并转换电路可由两块移位寄存器74LS194级联构成。
电路图如下:
〔4〕串行字符检测电路的设计:
串行字符检测实际确实是依次对字符进行检测,符合同步码的输出1,否那么输出0。
但假设对7位同步码都进行检测,需要的触发器较多,电路将专门复杂。
通过观看发觉同步码后4位1000在整个序列中是唯独的,因此实验中通过检测1000来达到检测同步码的成效。
检测电路可通过状态机来实现。
状态转移图如下所示:
1/0
0/11/01/00/0
0/0
对A、B、C、D进行编码:
A00,B01,C11,D10
X=0
Z
X=1
卡诺图如下:
Q2Q1
Q1n+1
Q2n+1
Z
由卡诺图可得:
D2=Q2n+1=Q1
D1=Q1n+1=
Q1+D
Z=Q2·
·
可用D触发器实现,电路图如下所示:
〔5〕并行字符检测电路的设计:
并行字符检测,立即原序列经串并转换电路后产生的并行信号与同步码1111000相比较,当与同步码相同时,即产生一个高电平。
此检测电路可通过两个比较器实现,比较时应由低位到高位依次进行。
本实验采纳了两个数据比较器74LS85级联的方式。
电路图如下所示:
〔6〕操纵电路的设计:
字符检测电路假设检测到同步码就会对操纵电路输出一个信号,操纵电路对此信号做出反应,以此来操纵锁存电路的开关。
检测信号通过操纵电路使锁存器开启,此后检测信号对锁存器的阻碍就不存在了。
电路图如下所示:
(7)锁存电路的设计:
锁存电路比较简单,只需要一块74LS273锁存芯片就能够。
只要把7个数据输入端分别连接到串并转换电路的并行输出端,再将操纵电路的输出端接到锁存器的时钟输入端即可。
电路如下所示:
(8)显示电路的设计:
将锁存器的7个输出端接到数码显示管的7个管脚即可实现显示电路。
要注意的是,数码管的abcdefg七个管脚分别对应数据的高位到低位。
3、总电路图:
〔1〕串行:
〔2〕并行:
四、波形仿真结果
1、
串行:
2、并行:
手绘示波器波形见坐标纸
五、VHDL程序代码及注释
1、串行代码:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycxingis--定义实体名为cxing
port(
clk_in:
instd_logic;
clk_out:
bufferstd_logic;
c_out:
outstd_logic_vector(6downto0));
endcxing;
architectureaofcxingis--定义结构体名为a
signaltmp1:
integerrange0to999999;
signaltmp2:
integerrange0to14;
signalclk,f,q_out,q,cp_control,control:
std_logic;
typestate_typeis(s0,s1,s2,s3,s4);
signalcurrent_state,next_state:
state_type;
signaltmp:
std_logic_vector(6downto0);
begin
p1:
process(clk_in)--分频器1MHz分为2Hz
ifclk_in'
eventandclk_in='
1'
then
iftmp1=999999then
tmp1<
=0;
else
=tmp1+1;
endif;
iftmp1=500000then
clk<
='
;
0'
endprocessp1;
clk_out<
=clk;
p2:
process(clk)--函数信号发生器111100*********
ifclk'
eventandclk='
iftmp2=14then
tmp2<
=tmp2+1;
endprocessp2;
p3:
process(tmp2)
casetmp2is
when4|5|6|8|9|12|14=>
q_out<
whenothers=>
endcase;
endprocessp3;
p4:
process(current_state,q_out)--串行检测
casecurrent_stateis
whens0=>
if(q_out='
)thennext_state<
=s1;
elsenext_state<
=s0;
endif;
whens1=>
=s2;
whens2=>
=s3;
whens3=>
=s4;
whens4=>
endcase;
endprocess;
p5:
process(clk)
if(clk'
)then
current_state<
=next_state;
p6:
process(current_state)
casecurrent_stateis
whens0=>
f<
whens1=>
whens2=>
whens3=>
whens4=>
endprocess;
cp_control<
=clkorq;
p7:
process--操纵信号
waituntilcp_control='
q<
=f;
control<
=qandclk;
p8:
process(clk)--串并转换
begin
ifclk'
tmp(6)<
=tmp(5);
tmp(5)<
=tmp(4);
tmp(4)<
=tmp(3);
tmp(3)<
=tmp
(2);
tmp
(2)<
=tmp
(1);
tmp
(1)<
=tmp(0);
tmp(0)<
=q_out;
p9:
process(control)--锁存器输出
ifcontrol'
eventandcontrol='
c_out(6)<
=nottmp(6);
c_out(5)<
=nottmp(5);
c_out(4)<
=nottmp(4);
c_out(3)<
=nottmp(3);
c_out
(2)<
=nottmp
(2);
c_out
(1)<
=nottmp
(1);
c_out(0)<
=nottmp(0);
enda;
2、并行代码
entitybxingis--定义实体名为bxing
endbxing;
architecturebofbxingis--定义结构体名为b
signalclk,f,q_out,q,cp_control,control,a,b,c,d:
std_logic_vector(7downto0);
tmp(7)<
=tmp(6);
process(tmp(0),tmp
(1),tmp
(2),tmp(3))--并行检测
if(tmp(0)='
a<
elsea<
if(tmp
(1)='
b<
elseb<
if(tmp
(2)='
c<
elsec<
if(tmp(3)='
d<
elsed<
=aandbandcandd;
cp_control<
ifcontrol'
=nottmp(7);
endb;
串并行的仿真图一样,皆如下:
六、选做部分:
纠错电路的设计与实现
错码发生器,即序列信号发生器,我们的错码序列为〝111100*********〞,假设使用触发器,那么至少需要6个,因此我们能够通过一个74LS163计数器和由74LS153级联构成的16选1数据选择器构成序列信号发生器。
纠错电路设计的另一个关键在于,如何定位错误的码。
与之前同步检测的原理类似,我们要找到以错码为结尾同时始终没有重复的码形作为检测的目标。
本次实验我们的错码为〝111100*********〞,因此,以〝0011〞作为检测码,通过时序电路实现。
状态机的设计如下。
0/00/0
1/1
对状态机的四个状态进行编码,A00,B01,C11,D10
Q2nQ1n
X=0
X=1
Q2n+1Q1n+1
Z
01
0
00
11
10
1
由状态表可绘出卡诺图如下所示:
X
Q2nQ1n
X
由卡诺图可得,
Q2n+1=Q1n
+Q2nQ1n
Q1n+1=
Z=Q2n
在数字逻辑电路课上我们明白,任何数跟1异或能够得到与之相反的数,因此检测到错码后检测电路输出1,此1跟原序列该位置的码相异或,得到正确码。
综上所述,错码发生电路如下所示:
波形仿真:
七、实验分析及总结
1、本次实验综合性较强,既考查了数字电路知识,也锤炼了动手操作能力,我们从中获益良多。
通过对序列信号发生器、串并转换电路、检测电路等电路的设计,我们〝温故而知新〞,对计数器、移位寄存器、数据选择器、比较器等中规模集成电路的实际应用有了更深刻的明白得。
另外,由于此次实验电路较为繁琐、芯片数量较大,我们在连接电路上花费了较多的精力,也遇到过重重困难,但我们将这些问题各个击破,并在那个过程中学到了许多东西。
2、本次实验遇到的问题较多,在此总结如下:
(1)串行电路刚刚完成时,接通电源之后数码显示管的预热时期总是不能显示完整的〝8〞字,同时也不是每一次差不多上从〝倒c〞开始循环显示。
后来才发觉是电源线与板子接触不良,有的插孔较为稳固,有的插孔那么不是。
我们最后找到了一个能够使电源与板子接触良好的插孔,使得数码显示管预热时期显示完整的〝8〞,同时码形从〝倒c〞开始。
(2)在并行电路的连接中,我们发觉锁存器的输出与串行时相比延迟了一个脉冲,这是由并行检测电路中使用的两个74LS85比较器级联而产生的。
我们解决的方法是,将串并转换电路的输出全部向高位平移一位再接入锁存器,从而抵消了检测电路的延时。
(3)在纠错电路中,专门关键的一点确实是正确码与错误码的同步。
我们对两个信号采纳了相同的串并转换电路、同步检测电路和操纵电路,但在测试时发觉正确码所对应的数码管总是会发生间歇的全部熄灭,通过认真检查后才发觉,锁存器74LS273的清零端没有接高电平。
通过修改后,我们实现了正确码与错误码的同步显示。
(4)连接电路的过程中有时会遇到跨线的问题,这就容易产生干扰。
因此,在以后的实验学习中,我们会更加合理的安排芯片的布局与绕线,尽量减免这种干扰。
3、此次实验让我们对数字电路与逻辑设计的知识,专门是序列信号发生器以及状态机的设计,有了更进一步的了解。
同时,那个实验过程也让我们认识到坚持不懈的精神、严谨求实的态度在科学工作中的重要性。
我们应该连续以良好的态度,在以后的实验学习中,不断培养自己提出问题、分析问题、解决问题的能力,真正去领会科学知识中的精髓。