北邮小学期电路综合实验

  • 格式:doc
  • 大小:1.11 MB
  • 文档页数:26

北邮小学期串行口数据传输的仿真 及硬件实现

第*组 班级:********** 姓名:*** *** 指导老师:*** 一、 实验目的: 串行口数据传输是数字系统中常用的一种数据传输方式。本次课程设计要求学生综合数字逻辑电路和串行口通信的有关知识,用硬件独立设计完成一个简单的串行口数据传输系统,并用FPGA可编程逻辑器件进行仿真。 二、 实验仪器

1 双踪示波器 1台 2 直流稳压电源 1台 3 频率计 1台 4 数字万用表 1台 5 面包板 1台 三、 实验内容与设计:

1、实验内容: 一个简单的串行口数据传输系统的系统框图如下:

由图可见,系统分为发送端,接收端两部分。发送端主要是同步字符、结束字符、时钟电路和信息码发生器。 接收端包括串/并转换电路、字符检测电路、控制电路、锁存接收和显示电路。

2、各部分功能的端口设置: (1) 时钟电路: 晶振的时钟输入信号、通过分频后提供系统使用的输出信号。 (2) 信号发生电路:时钟电路发出的时钟信号输入端、生成的序列输出端。 (3) 串并转换电路:时钟信号输入、串行序列输入端、并行序列输出端。 (4) 字符检测电路:若采用并行检测,有并行数据输入端、检测信号输出端;

锁存接收 显示电路

控制电路 时钟电路 串/并转换 字符检测电路

同步字符 结束字符发生器 信息码 若采用串行检测,有串行数据接入端、时钟信号输入端、 检测信号输出端。 (5) 控制电路: 时钟信号输如端、检测信号输入端、控制信号输出端。 (6) 锁存电路: 控制信号输入端、并行数据输入端、并行数据输出端。 (7) 显示电路: 并行数据输入端。 3、各部分的逻辑设计: (1)时钟电路设计:

由于晶振产生的时钟频率为1MHz,而为了显示稳定,需要的时钟频率为2Hz以下,所以需要分频。本次设计采用的是同步计数器来进行分频,输出端为Qa~Qd,分频系数为2N(N为端口数)。每个74LS163最多为24=16分频,而需要的分频系数:106÷2=5×105≈219。所以需要5块~芯片用作分频。具体电路图如下:

所得的输出频率约为2Hz. (2)序列信号发生器设计:

本次实验需要产生的序列为15位循环码“111100010011010”,通过检验可知,此序列产生的15个4位序列不互相重复,因此可以用4个D触发器来构造序列发生器。此序列信号发生器的反馈电路可以通过“与”、“或”、“非”逻辑门或数据选择器实现。本次实验中,我们使用了数据选择器。 状态表及卡诺图如下所示: Q4 Q3 Q2 Q1 D

1 1 1 1 0 Q4Q3 Q2Q1 00 01 11 10

00 φ 1 0 1 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 为使系统能够自启动,令φ=1。 使用Q4Q3 作为数据选择器的输入,有 C0=,C1=1,C2=1,C3=0 故序列信号发生器的电路图设计如下所 仿真的波形图如下:

因为系统需要7位并行输出,所以串并转换电路可由两块移位寄存器74LS194级联构成。电路图如下:

(4)串行字符检测电路的设计: 串行字符检测实际就是依次对字符进行检测,符合同步码的输出1,否则输出0。但若对7位同步码都进行检测,需要的触发器较多,电路将非常复杂。通过观察发现同步码后4位1000在整个序列中是唯一的,因此实验中通过检测1000来达到检测同步码的效果。检测电路可通过状态机来实现。 状态转移图如下所示: 1/0 0/1 1/0 1/0 0/0

0/0 对A、B、C、D进行编码: A 00,B 01,C 11,D 10 X=0 X=1

00 00 01 01 11 01 11 10 01 10 00 01 卡诺图如下:

Q2Q1 D 00 01 11 10 0 0 1 1 0 1 0 0 0 0 Q2n+1

Q2Q1 D 00 01 11 10

A B D C

0/0 1/0

Z X=0 X=1 00 0 0 01 0 0

Q2Q1 D 00 01 11 10 0 0 0 0 1 1 0 0 0 0 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、串行代码: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;

entity cxing is --定义实体名为cxing port( clk_in:in std_logic; clk_out:buffer std_logic;

控制信号 锁存器输入

锁存器输出

原序列信号 串并转换输出 检测信号

控制信号 锁存器输入

锁存器输出 c_out:out std_logic_vector(6 downto 0)); end cxing;

architecture a of cxing is --定义结构体名为a signal tmp1:integer range 0 to 999999; signal tmp2:integer range 0 to 14; signal clk,f,q_out,q,cp_control,control:std_logic; type state_type is(s0,s1,s2,s3,s4); signal current_state,next_state:state_type; signal tmp:std_logic_vector(6 downto 0); begin p1:process(clk_in) --分频器1MHz分为2Hz begin if clk_in'event and clk_in='1' then if tmp1=999999 then tmp1<=0; else tmp1<=tmp1+1; end if; if tmp1=500000 then clk<='1'; else clk<='0'; end if; end if; end process p1; clk_out<=clk;

p2:process(clk) --函数信号发生器111100011011010 begin if clk'event and clk='1' then if tmp2=14 then tmp2<=0; else tmp2<=tmp2+1; end if; end if; end process p2; p3:process(tmp2) begin case tmp2 is when 4|5|6|8|9|12|14=>q_out<='0'; when others=>q_out<='1'; end case; end process p3;

p4:process(current_state,q_out) --串行检测 begin case current_state is when s0=>if(q_out='1')then next_state<=s1; else next_state<=s0; end if; when s1=>if(q_out='1')then next_state<=s2; else next_state<=s1; end if; when s2=>if(q_out='0')then next_state<=s3; else next_state<=s1; end if; when s3=>if(q_out='0')then next_state<=s4; else next_state<=s1; end if; when s4=>if(q_out='0')then next_state<=s0; else next_state<=s1; end if; end case; end process;