串行口数据传输的仿真及硬件实现.docx
《串行口数据传输的仿真及硬件实现.docx》由会员分享,可在线阅读,更多相关《串行口数据传输的仿真及硬件实现.docx(20页珍藏版)》请在冰豆网上搜索。
串行口数据传输的仿真及硬件实现
串行口数据传输的仿真及硬件实现
学院:
信息与通信工程学院
专业:
通信工程
班级:
姓名:
潘东阳、王澎涛
序号:
12
一、总体方案框图
电路总体分为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.字符发生器模块:
本次试验要求发送端产生信息码为1010这个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
卡诺图:
由卡诺图得:
D=Q4⊕Q3,但经过检查,通过此反馈是无法自启动的。
通过增加自由项,得D=
。
经过检查,此此反馈可以自启动。
电路图如下:
3.串/并转换模块:
串并转化的实现可以通过移位寄存器来实现,因为需要7位并行输出,所以需要两块移位寄存器74LS194级联构成。
电路图如下:
4.并行字符检测电路模块:
相比于串行字符检测电路,并行字符检测电路相对容易。
并行字符检测电路只需要15位数据比较器即可,而该比较器可以由两个数据比较器74LS85级联得到。
具体电路图如下:
当检测到字符时,输出一个高电平,作为控制电路的时钟信号。
5.控制电路模块:
控制电路完成的功能比较复杂。
首先,控制电路要保证在检测到同步码之前,锁存器关闭,没有任何输出;其次,在检测到同步码之后,字符检测电路不能对后级有任何影响,而是由控制电路控制每个7位输出一次。
对于第一个功能可以使用一块D触发器74LS74接受字符检测电路的信号,再通过组合逻辑电路使接收到同步码产生的高电平后此部分电路输出恒定,对锁存电路没有影响;对于第二个功能,可以由一个7进制计数器实现,这里选用同步置位的计数器74LS163。
具体如下:
6.锁存显示模块:
锁存电路比较简单,只需要一块74LS273锁存芯片就可以。
只要把数据的七个输入端分别连到串并转换的并行输出端,在把控制电路输出的控制电路接到时钟输入端即可。
具体电路图如下:
7.显示电路模块:
只要把锁存器的七个输出端接到数码管相对应的a~g管脚就可以。
8.串行字符检测模块:
串行字符检测需要一位一位检测,然后每位都符合才输出信号。
若每位都检测,将会使用较多触发器,使电路复杂化。
经过观察,同步码中后四位1000在整个序列1010中是唯一的,所以检测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
卡诺图分别如下:
所以,由卡诺图可得:
D2=
D1=
Z=
由此可得到电路图:
9.纠错模块:
纠错模块应该包含错码发生器、检错模块和纠错模块。
实验中错码发生器产生的错码为:
1010,通过类似序列发生器设计中的方法可以设计出其电路,此处使用同步计数器与数据选择器构成的信号发生器。
检错模块通过D触发器加逻辑门电路可以检测出是否有错码,若有,则输出1。
纠错部分接收到检测部分输出的1后,与原信号同一位进行异或运算,可以将其改为正确码。
此部分电路的难点是同步问题。
由于各部分之间的延时不一定相同,所以最终修改的码的位置不一定就是错码的位置。
这种问题只能在具体连接电路时通过加门电路来不断尝试来取得同步。
具体电路原理图如下:
三、总体电路原理图
四、用坐标纸画出下列波形(见坐标纸)
五、VHDL程序代码及注释
串行检测:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitychuanis
port(
vcc,clk:
instd_logic;
output:
outstd_logic_vector(6downto0));
endchuan;
architecturetaoofchuanis
signalsignalout:
std_logic;
signalsignalcomposer:
integerrange0to14;
signalsignalaccept:
std_logic_vector(6downto0);
signaltmp:
integerrange0to;
signalsignaltest:
std_logic;
signalos:
std_logic;
signaltestout:
std_logic;
signalcontrolcout:
std_logic;
signalfinalout:
std_logic_vector(6downto0);
typestate_typeis(s0,s1,s2,s3,s4);
signalstate:
state_type;
--signaltest:
std_logic_vector(6downto0);
begin
p0:
process(clk)
begin
ifclk'eventandclk='1'then
iftmp=then
tmp<=0;
else
tmp<=tmp+1;
endif;
endif;
endprocessp0;
p7:
process(tmp)
begin
iftmp=then
os<='1';
elseos<='0';
endif;
endprocessp7;
--p0andp7shifenpinmokuai
p1:
process(os)
begin
ifos'eventandos='1'then
ifsignalcomposer=14then
signalcomposer<=0;
else
signalcomposer<=signalcomposer+1;
endif;
endif;
casesignalcomposeris
when4|5|6|8|9|12|14=>signalout<='0';
whenothers=>signalout<='1';
endcase;
endprocessp1;
--youjishiqishixiandexuliefashengqi
p2:
process(signalout)
begin
ifos'eventandos='1'then
signalaccept(6)<=signalaccept(5);
signalaccept(5)<=signalaccept(4);
signalaccept(4)<=signalaccept(3);
signalaccept(3)<=signalaccept
(2);
signalaccept
(2)<=signalaccept
(1);
signalaccept
(1)<=signalaccept(0);
signalaccept(0)<=signalout;
endif;
endprocessp2;
--yicunqishixianchuanbingzhuanhuan
p3:
process(signalaccept)
begin
--ifclk'eventandclk='1'then
finalout<=signalaccept;
--endif;
endprocessp3;
--shuchu
p4:
process(signalaccept)
begin
iftestout='1'then
signaltest<=vcc;
controlcout<=vcc;
endif;
endprocessp4;
--kongzhishuchu
p6:
process(os)
begin
if(os'eventandos='1')then
casestateis
whens0=>if(signalout='1')thenstate<=s1;
elsestate<=s0;endif;
testout<='0';
whens1=>if(signalout='1')thenstate<=s2;
elsestate<=s0;endif;
testout<='0';
whens2=>if(signalout='0')thenstate<=s3;
elsestate<=s2;endif;
testout<='0';
whens3=>if(signalout='0')thenstate<=s4;
elsestate<=s2;endif;
testout<='0';
whens4=>if(signalout='0')thenstate<=s0;
elsestate<=s2;endif;
testout<='1';
endcase;
endif;
endprocessp6;
--chuanxinjiance11000
p5:
process(signaltest,signalaccept)
begin
if(signaltest='1')then
output<=notsignalaccept;
endif;
endprocessp5;
--jiucuo
--p6:
process(signalaccept)
--begin
--casesignalacceptis
--when""=>testout<='1';
--whenothers=>testout<='0';
--endcase;
--endprocessp6;
endtao;
并行检测:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitybingis
port(
vcc,clk:
instd_logic;
--clear:
instd_logic;
--signalout:
outstd_logic;
--testout:
outstd_logic;
--signaltest:
outstd_logic;
--testout,controlcout:
outstd_logic;
--finalout:
outstd_logic_vector(6downto0);
output:
outstd_logic_vector(6downto0));
endbing;
architecturepanofbingis
signalsignalout:
std_logic;
signalsignalcomposer:
integerrange0to14;
signalsignalaccept:
std_logic_vector(6downto0);
signaltmp:
integerrange0to;
signalsignaltest:
std_logic;
signalos:
std_logic;
signaltestout:
std_logic;
signalcontrolcout:
std_logic;
signalfinalout:
std_logic_vector(6downto0);
typestate_typeis(s0,s1,s2,s3,s4);
signalstate:
state_type;
--signaltest:
std_logic_vector(6downto0);
begin
p0:
process(clk)
begin
ifclk'eventandclk='1'then
iftmp=then
tmp<=0;
else
tmp<=tmp+1;
endif;
endif;
endprocessp0;
p7:
process(tmp)
begin
iftmp=then
os<='1';
elseos<='0';
endif;
endprocessp7;
--fenpinmokuai
p1:
process(os)
begin
ifos'eventandos='1'then
ifsignalcomposer=14then
signalcomposer<=0;
else
signalcomposer<=signalcomposer+1;
endif;
endif;
casesignalcomposeris
when4|5|6|8|9|12|14=>signalout<='0';
whenothers=>signalout<='1';
endcase;
endprocessp1;
--xuliefashengqi
p2:
process(signalout)
begin
ifos'eventandos='1'then
signalaccept(6)<=signalaccept(5);
signalaccept(5)<=signalaccept(4);
signalaccept(4)<=signalaccept(3);
signalaccept(3)<=signalaccept
(2);
signalaccept
(2)<=signalaccept
(1);
signalaccept
(1)<=signalaccept(0);
signalaccept(0)<=signalout;
endif;
endprocessp2;
--yicunqishixianchuanbingzhuanhuan
p3:
process(signalaccept)
begin
--ifclk'eventandclk='1'then
finalout<=signalaccept;
--endif;
endprocessp3;
--output
p5:
process(signalaccept)
begin
casesignalacceptis
when""=>testout<='1';
whenothers=>testout<='0';
endcase;
endprocessp5;
--bingxinjiancetongbuma
p4:
process(testout)
begin
iftestout='1'then
signaltest<=vcc;
controlcout<=vcc;
endif;
endprocessp4;
--kongzhishuchu
p6:
process(signaltest,signalaccept)
begin
if(signaltest='1')then
output<=notsignalaccept;
endif;
endprocessp6;
--jiucuo
endpan;
六、实验分析及总结
通过本次实验,我加深了对数字电路的硬件连接及VHDL语言的理解,进一步了解了组合电路和时序电路的工作特点,并且初步掌握了实际电路的设计思路方法,提高了独立设计电路和验证实验的能力。
具体说有以下几点:
(1)我领会到了电路仿真这种研究方法的重要性。
虽然仿真并不能够完全与实际切合,但是它能在一定程度上方便我们在较少误差下设计电路,并且能够在检查电路故障时候提供便利。
(2)我理解到实验所需要的严谨性。
例如布线,布线方式不正确会对实验产生干扰,引起误差。
(3)实验培养了我的耐心和细心。
连接电路需要足够的耐心和细心,一个小小的错误可能就会导致无法正常输出波形,甚至烧毁器件。
而查错十分枯燥,一定要耐住性子。
不能着急,盲目改电路,应该分析造成原因后再改进。
(4)实验中深刻体会到了同步在电路设计中的重要地位。
本次试验中的纠错电路,其难点其实就是正确码和错码的同步问题。
这些问题只能通过添加与非门在实践中不断调试来消除。
(5)实验中设计电路时培养了自己自顶向下逐层分解的设计思想,通过模块化设计,简化了问题,找到了设计思路。
通过本次实验,提高了我的动手能力以及独立思考、独立解决问题的能力,加深了我对电子电路的理解,培养了我对电子电路学习的兴趣。
最后真心感谢老师这些天耐心的指导!