1、5.1 5.1 存储器程序设计存储器程序设计 5.2 5.2 串行接口程序设计串行接口程序设计 5.3 5.3 频率发生器设计频率发生器设计 5.4 5.4 信号检测与调制电路设计信号检测与调制电路设计 第第5 5章章 通信系统中的应用设计通信系统中的应用设计 15.1 5.1 存储器程序设计存储器程序设计 5.1.1 5.1.1 只读存储器设计只读存储器设计 5.1.2 5.1.2 随机存储器设计随机存储器设计 5.1.3 5.1.3 先入先出存储器设计先入先出存储器设计 2共同特点是数据存放结构一致性好,具有地址总线和共同特点是数据存放结构一致性好,具有地址总线和数据总线。数据总线。存储器
2、可以由锁存器或寄存器构成,差别存储器可以由锁存器或寄存器构成,差别在于在于锁存器是电平起作用锁存器是电平起作用,寄存器是时钟边沿起作用寄存器是时钟边沿起作用。存存储储器器RAMRAM动态随机存取存储器(动态随机存取存储器(DRAMDRAM)静态随机存取存储器(静态随机存取存储器(SRAMSRAM)同步动态随机存取存储器(同步动态随机存取存储器(SDRAMSDRAM)同步链环动态随机存取存储器(同步链环动态随机存取存储器(SLDRAMSLDRAM)同步缓存动态随机存取存储器(同步缓存动态随机存取存储器(CDRAMCDRAM)掩模型只读存储器(掩模型只读存储器(ROMROM)可编程只读存储器(可编
3、程只读存储器(PROMPROM)可擦可编程只读存储器(可擦可编程只读存储器(EPROMEPROM)快闪存储器(快闪存储器(Flash MemoryFlash Memory)ROMROM35.1.1 5.1.1 只读存储器设计只读存储器设计 设计一个设计一个ROMROM存储器时,要注意几个要点:存储器时,要注意几个要点:对存储器结构的组织对存储器结构的组织每个存储单元为一个字,存储单元的多少、字长的长每个存储单元为一个字,存储单元的多少、字长的长度具有相同的结构特点,可以用数组类型来描述。度具有相同的结构特点,可以用数组类型来描述。每个存储单元或数据的一个位就是数组中的一个元素。每个存储单元或数
4、据的一个位就是数组中的一个元素。对存储器数组大小的描述格式为:对存储器数组大小的描述格式为:type memory is array type memory is array(0 to 20 to 2*w-1w-1)of wordof word;用户定义存用户定义存储器类型储器类型数组数组每个元素每个元素的类型的类型存储器大小存储器大小4存储器中每个字采用了存储器中每个字采用了wordword类型,类型,这也是一个用户定这也是一个用户定义的类型。义的类型。wordword的位数可用位矢量来描述的位数可用位矢量来描述,其格式为:,其格式为:subtype wrod is std_logic_ve
5、ctorsubtype wrod is std_logic_vector(k-1 downtok-1 downto 0 0););其中的其中的k k表示存储单元中二进制数据的位数表示存储单元中二进制数据的位数,可由,可由内属参数给出或进行修改,这种表示具有通用性。内属参数给出或进行修改,这种表示具有通用性。当常数当常数k k为为8 8时,所设计的存储器就是时,所设计的存储器就是8 8位存储器,位存储器,当当k k为为1616时就表示时就表示1616位存储器。位存储器。5只读存储器中数据的获取只读存储器中数据的获取只读存储器中的数据不能通过随机的方式写入,而只读存储器中的数据不能通过随机的方式写
6、入,而是通过文本文件一次性批量地写入。是通过文本文件一次性批量地写入。因此要建立一个因此要建立一个ASICASIC格式的文本文件,文件中存格式的文本文件,文件中存放用二进制表示的按行存放的数据。放用二进制表示的按行存放的数据。要读取文件中的数据需要用到要读取文件中的数据需要用到IEEEIEEE库和库和STDSTD库中的程库中的程序包序包std_logic_textiostd_logic_textio和和textiotextio。用用readlinereadline()函数读取文件中的一行数据,再通()函数读取文件中的一行数据,再通过过read()read()函数将读取到的列数据写入到函数将读取
7、到的列数据写入到ROMROM中的各单中的各单元。元。ROMROM单元的编号为整数类型,故需要用到单元的编号为整数类型,故需要用到std_logic_unsignedstd_logic_unsigned程序包中的数据类型转换函数,程序包中的数据类型转换函数,将地址输入端口给出的矢量型数据转换为整数类型地将地址输入端口给出的矢量型数据转换为整数类型地址数据。址数据。6librarylibrary IEEE IEEE;useuse IEEE.std_logic_1164.IEEE.std_logic_1164.allall;useuse IEEE.std_logic_unsigned.IEEE.st
8、d_logic_unsigned.allall;useuse IEEE.std_logic_textio.IEEE.std_logic_textio.allall;useuse STD.textio.STD.textio.allall;entityentity myrom myrom isis generic generic(k(k:integerinteger:=8=8;w w:integerinteger:=4)=4);portport(g1(g1,g2g2:inin std_logicstd_logic;adradr:inin std_logic_vectorstd_logic_vect
9、or(0(0 toto w-1)w-1);doutdout:outout std_logic_vectorstd_logic_vector(k-1)(k-1)downtodownto 0)0);endend myrom myrom;定义存储器字长定义存储器字长定义存储器大小定义存储器大小7architecturearchitecture behav behav ofof myrom myrom isis subtypesubtype word word isis std_logic_vectorstd_logic_vector(k-1)(k-1)downtodownto 0)0);typety
10、pe memory memory isis array(0 array(0 toto 2 2*w-1)w-1)ofof word word;signalsignal adr_in adr_in:integerinteger rangerange 0 0 toto 2 2*w-1w-1;filefile romin romin:texttext is in is in“romin.“romin.inin”;begin begin processprocess(g1(g1,g2g2,adradr)variable variable rom rom:memorymemory;variablevari
11、able startup startup:booleanboolean:=truetrue;variablevariable l l:lineline;定义存储器结构定义存储器结构8 beginbegin if if(startup)(startup)thenthen forfor j j inin rom romrangerange looploop readline(romin readline(romin,l)l);read(lread(l,rom(jrom(j);end loopend loop;startupstartup:=false=false;end ifend if;adr_
12、in=conv_integer(adradr_in=conv_integer(adr);ifif(g1=1 (g1=1 andand g2=1)g2=1)thenthen dout=rom(adr_in dout=rom(adr_in);elseelse dout dout=“ZZZZZZZZ”=“ZZZZZZZZ”;end ifend if;end processend process;endend behav behav;初始化初始化ROMROM读读ROMROM数据数据9图图5 51 ROM1 ROM外观与下级电路及仿真波形和外观与下级电路及仿真波形和romin.inromin.in文件内
13、容文件内容105.1.2 5.1.2 随机存储器设计随机存储器设计 随机存储器中的数据是由数据总线上的数据提供的,随机存储器中的数据是由数据总线上的数据提供的,其数据由地址总线指定将其存放在存储器的哪个单元。其数据由地址总线指定将其存放在存储器的哪个单元。为了控制数据传输方向,采用读写信号线来控制。如果为了控制数据传输方向,采用读写信号线来控制。如果数据输入与给出用同一组总线完成,则数据总线为双向数据输入与给出用同一组总线完成,则数据总线为双向数据总线。数据总线。例例5-25-2:设计一个:设计一个2 2*w wk k随机存储器(随机存储器(RAMRAM)。其中)。其中adradr(0 0:2
14、 2*w-1w-1)为)为w w条地址总线、条地址总线、dindin(k-1k-1:0 0)为)为k k条条数据输入总线,数据输入总线,doutdout(k-1k-1:0 0)为)为k k条数据输出总线,条数据输出总线,cscs为片选控制线,为片选控制线,rwrw为读写控制线。当为读写控制线。当cscs=1=1,rwrw=1=1时,从时,从adradr(0 0:2 2*w-1w-1)所选中)所选中RAMRAM单元中读取单元中读取k k位数据到位数据到doutdout(k-1k-1:0 0)输出;当)输出;当cscs=1=1,rwrw=0=0时,将时,将dindin(k-1k-1:0 0)的的k
15、 k条数据输入总线上的信号写入由条数据输入总线上的信号写入由adradr(0 0:2 2*w-1w-1)所)所选中的选中的RAMRAM单元。当单元。当cscs=0=0时,时,doutdout(k-1k-1:0 0)将呈现高阻)将呈现高阻状态。程序中通过类属参数设状态。程序中通过类属参数设w w为为4 4,k k为为8 8。11library library IEEEIEEE;useuse IEEE.std_logic_1164.IEEE.std_logic_1164.allall;useuse IEEE.std_logic_unsigned.IEEE.std_logic_unsigned.al
16、lall;entityentity mysram mysram is is generic generic(k(k:integerinteger:=8=8;w w:integerinteger:=4)=4);portport(rw(rw,cscs:in in std_logicstd_logic;adradr:inin std_logic_vectorstd_logic_vector(0(0 toto w-1)w-1);dindin:inin std_logic_vectorstd_logic_vector(k-1(k-1 downtodownto 0)0);doutdout:outout s
17、td_logic_vectostd_logic_vector(k-1 r(k-1 downtodownto 0)0);endend mysram mysram;architecturearchitecture behav behav ofof mysram mysram is is subtypesubtype word word isis std_logic_vectorstd_logic_vector(k-1(k-1 downtodownto 0)0);typetype memory memory is arrayis array(0 (0 toto 2 2*w-1)w-1)ofof wo
18、rd word;signalsignal adr_in adr_in:integer rangeinteger range 0 0 toto 2 2*w-1w-1;signalsignal sram sram:memorymemory;定义存储器字长定义存储器字长定义存储器大小定义存储器大小定义存储器结构定义存储器结构12begin begin adr_in=conv_integer(adr adr_in=conv_integer(adr);processprocess(rw(rw,cscs,dindin,adr_inadr_in)beginbegin ifif(cs(cs=0)=0)then
19、then dout dout=“ZZZZZZZZ”=“ZZZZZZZZ”;else else if if(rw(rw=1)=1)thenthen dout=sram(adr_in dout=sram(adr_in);elsifelsif(rw(rw=0)=0)thenthen sram(adr_in sram(adr_in)=din)=din;end ifend if;end ifend if;end processend process;endend behav behav;读读写写135.1.3 5.1.3 先入先出存储器设计先入先出存储器设计 先入先出存储器先入先出存储器(FIFO)(F
20、IFO)是一个环形数据结构的同步是一个环形数据结构的同步RAMRAM存储体。存储体。这种存储器的存储器单元通常较少。这种存储器的存储器单元通常较少。特点:特点:数据按先来先进的方式顺序写入存储器中地址相数据按先来先进的方式顺序写入存储器中地址相邻接的单元,邻接的单元,数据存放的地址从低地址向高地址方向增加,达数据存放的地址从低地址向高地址方向增加,达到顶端后再折回低地址并不断循环。到顶端后再折回低地址并不断循环。当读取数据时,也是从低地址往高地址方向增加。当读取数据时,也是从低地址往高地址方向增加。这样,先存入的数据将先被读出,后存入的数据这样,先存入的数据将先被读出,后存入的数据后被读出,这
21、就是后被读出,这就是FIFOFIFO存储器名字的由来。存储器名字的由来。14例例5-35-3设计一个设计一个2 2*w wk k位位RAMRAM结构的结构的FIFOFIFO。FIFOFIFO组成组成存储体存储体RAMRAM写地址指针写地址指针wpwp控制电路控制电路读地址指针读地址指针rprp控制电路控制电路写满写满fullctrfullctr标志设置电路标志设置电路读空读空emptyctremptyctr标志设置电路标志设置电路15dindin(k-1k-1:0 0)为)为k k条数据输入总线,条数据输入总线,doutdout(k-1k-1:0 0)为)为k k条数据输出总线,条数据输出总线
22、,rdrd为读控制线,为读控制线,wrwr为写控为写控制线,制线,clkclk为时钟输入端,为时钟输入端,rstrst为复位控制信号,为复位控制信号,fullfull为写满状态信号输出端,为写满状态信号输出端,emptyempty为读空状态信为读空状态信号输出端。写入数据时,在时钟上沿作用下,当号输出端。写入数据时,在时钟上沿作用下,当wrwr=1=1,fullctrfullctr=0=0,dindin的数据被写入的数据被写入wpwp所指定的所指定的FIFOFIFO单元;当单元;当rd=1rd=1,emptyctremptyctr=0=0时,数据从时,数据从rprp所指所指定的定的FIFOFI
23、FO单元读出到输出数据总线单元读出到输出数据总线doutdout,并且,并且doutdout总线上始终有一个数据输出,不能有三态输出。总线上始终有一个数据输出,不能有三态输出。16由于由于FIFOFIFO存储器中的数据读写是独立进行的,这存储器中的数据读写是独立进行的,这就可能出现写入的速度与读出数据的速度不一致的就可能出现写入的速度与读出数据的速度不一致的情况。当写入的速度大于读出的速度时,会导致新情况。当写入的速度大于读出的速度时,会导致新写入的数据重复写在尚未被读出的数据单元;反之,写入的数据重复写在尚未被读出的数据单元;反之,当读出的速度大于写入的速度时,会导致读空存储当读出的速度大于
24、写入的速度时,会导致读空存储器单元的读取错误。因此设计器单元的读取错误。因此设计FIFOFIFO存储器时需要对存储器时需要对读写控制进行特殊处理。读写控制进行特殊处理。利用读写地址指针控制数据的读写利用读写地址指针控制数据的读写 wpwp为写数据地址指针,为写数据地址指针,rprp为读数据地址指针。为读数据地址指针。rprp总是指向已读出数据的单元地址,总是指向已读出数据的单元地址,wpwp总是指向总是指向下一个要写入的数据单元的地址,先写而后读。下一个要写入的数据单元的地址,先写而后读。17利用存储器满和空标志防止读写冲突利用存储器满和空标志防止读写冲突 当复位信号当复位信号rstrst为高
25、电平时,为高电平时,FIFOFIFO复位,复位,wpwp=0=0,rprp2 2*w-1w-1。此时。此时FIFOFIFO处于空状态,数据第一次写入处于空状态,数据第一次写入的单元为的单元为0 0单元,以后每写入一个数据写数据地址单元,以后每写入一个数据写数据地址指针指针wpwp加加1 1。当当FIFOFIFO未满,可以写入数据时,写满状态信号未满,可以写入数据时,写满状态信号fullctrfullctr和输出端和输出端full=0full=0,写满,写满2 2*w-1w-1个数据后个数据后fullctrfullctr和和full=1full=1;同样,同样,FIFOFIFO未空可以读出未空可
26、以读出数据时,数据时,emptyctremptyctr和输出端和输出端empty=0empty=0,读空,读空FIFOFIFO后,读后,读空状态信号空状态信号emptyctremptyctr和输出和输出端端empty=1empty=1。18由于要先写进才能有数据读出,故在复位后应有由于要先写进才能有数据读出,故在复位后应有rprp=wp-1=wp-1。由于写数据地址指针由于写数据地址指针wpwp、读数据地址指针、读数据地址指针rprp都是都是循环计数,计满循环计数,计满2 2*w-1w-1后,读、写地址指针都会回后,读、写地址指针都会回到最初位置,并重新增加计数值。到最初位置,并重新增加计数值
27、。当读出数据的速度比写入的速度慢时,就会出现当读出数据的速度比写入的速度慢时,就会出现fullctrfullctr=1=1的写满情况;而当读出数据的速度比写的写满情况;而当读出数据的速度比写入的速度快时,就会出现读空的情况,此时入的速度快时,就会出现读空的情况,此时emptyctremptyctr=1=1。在设置写满标志时在设置写满标志时fullctrfullctr,如果,如果rp=wprp=wp再写一个再写一个就满,且现在处于只写不读情况,就应有满标志信就满,且现在处于只写不读情况,就应有满标志信号为号为1 1,表示存储器不能再写入,再写就复盖未读,表示存储器不能再写入,再写就复盖未读出单元
28、中的数据。出单元中的数据。1920rpwp写写空写满的前一状态rpwp空写空读空的前一状态rpwp写写空写满的前一状态rpwp空写空读空的前一状态20如果写满标志信号虽然已满,但现在有数据读出,如果写满标志信号虽然已满,但现在有数据读出,读后就会空出单元,故此时写满标志信号应为读后就会空出单元,故此时写满标志信号应为0 0。在进行读空标志信号在进行读空标志信号emptyctremptyctr设置时,如果目前处设置时,如果目前处于只读不写状态,并且处于再读一个数据就空于只读不写状态,并且处于再读一个数据就空rprp=wp-2=wp-2的状态,或已读到的状态,或已读到ramram顶部但正在写顶部但
29、正在写1 1号单元,号单元,再读就读到再读就读到0 0号单元的状态,或已读到号单元的状态,或已读到ramram顶部前一顶部前一单元但没有写状态的状态,设置读空标志信号为单元但没有写状态的状态,设置读空标志信号为1 1,表示存储器不能再读出,否则就读空存储器。表示存储器不能再读出,否则就读空存储器。如果读空标志信号虽已被置为空,但现在有数据写如果读空标志信号虽已被置为空,但现在有数据写入,写入后就不再为空,故应设入,写入后就不再为空,故应设emptyctremptyctr=0=0。程序中通过类属参数设程序中通过类属参数设w w为为4 4,k k为为8 8。21begin begin dout=r
30、am(rp dout=ram(rp);full=fullctrfull=fullctr;empty=emptyctrempty=emptyctr;writedatawritedata:processprocess(clk(clk)begin begin ifif(clkevent(clkevent andand clk clk=1)=1)thenthen ifif(fullctr(fullctr=0=0 andand wr wr=1)=1)thenthen ram(wp ram(wp)=din)=din;end ifend if;end ifend if;end processend proc
31、ess writedata writedata;写数据操作写数据操作22 wpmodifywpmodify:process(clkprocess(clk,rstrst)beginbegin if if(rst(rst=1)=1)thenthen wp wp=0=0;elsifelsif(clkevent(clkevent andand clk clk=1)=1)thenthen if if(fullctr(fullctr=0=0 and and wr wr=1)=1)then then if if(wp(wp=2=2*w-1)w-1)then then wp wp=0=0;elseelse w
32、p wp=wp+1=wp+1;end ifend if;end ifend if;end ifend if;end processend process wpmodify wpmodify;写数据指针设计写数据指针设计23 rpmodifyrpmodify:processprocess(clk(clk,rstrst)beginbegin ifif(rst(rst=1)=1)thenthen rp rp=2=2*w-1w-1;elsifelsif(clkevent(clkevent andand clk clk=1)=1)then then ifif(emptyctr(emptyctr=0=0
33、andand rd=1)rd=1)ifif(rp(rp=2=2*w-1)w-1)thenthen rp rp=0=0;elseelse rp rp=rp+1=rp+1;end ifend if;end ifend if;end ifend if;end processend process rpmodify rpmodify;读数据指针设计读数据指针设计24 fullmodifyfullmodify:processprocess(clk(clk,rstrst)beginbegin ifif(rst(rst=1)=1)thenthen fullctr fullctr=0=0;elsifelsif
34、(clkevent(clkevent andand clk clk=1)=1)thenthen ifif(rp=wp(rp=wp andand wr wr=1=1andand rd=0)rd=0)thenthen fullctr fullctr=1=1;elsifelsif fullctr fullctr=1=1 and and rd=1 rd=1 thenthen fullctr fullctr=0=0;end ifend if;end ifend if;end process fullmodifyend process fullmodify;满状态标志设计满状态标志设计25 emptymo
35、difyemptymodify:processprocess(clk,rst(clk,rst)beginbegin ifif(rst(rst=1)=1)thenthen emptyctr emptyctr=1=1;elsifelsif(clkevent(clkevent andand clk clk=1)=1)thenthen ifif(rd=1 (rd=1 andand wr wr=0)=0)andand (rp (rp=wp-2=wp-2 oror(rp(rp=2=2*w-1 w-1 andand wp wp=1)=1)or or(rp(rp=2=2*w-2 w-2 andand wp w
36、p=0)=0)thenthen emptyctr emptyctr=1=1;elsifelsif(emptyctr(emptyctr=1=1 andand wr wr=1)=1)thenthen emptyctr emptyctr=0=0;end ifend if;end ifend if;end processend process emptymodify emptymodify;endend behav behav;空状态标志设计空状态标志设计26运行程序得图运行程序得图5-45-4所示所示FIFOFIFO顶层模块和仿真波形。当复位信号顶层模块和仿真波形。当复位信号rstrst为高电平时为
37、高电平时FIFOFIFO复位,复位,emptyempty为高,表示读空状态,为高,表示读空状态,fullfull为低,表示可写状态。此后写控制信号为低,表示可写状态。此后写控制信号wrwr为为3 3个周期的高,将个周期的高,将dindin输入的输入的2 2、3 3、4 4三个数据写入三个数据写入FIFOFIFO。在读数据控制信号。在读数据控制信号rdrd为高的三个周期将这三个数据读出到为高的三个周期将这三个数据读出到doutdout输出总线上。此时输出总线上。此时数据已读空,故数据已读空,故emptyempty为高电平,表示读空状态。接下来连续为高电平,表示读空状态。接下来连续写入写入8 8个
38、数据而未进行读操作,故写满信号个数据而未进行读操作,故写满信号fullfull为高。为高。275.2 5.2 串行接口程序设计串行接口程序设计 5.2.1 RS2325.2.1 RS232串行接口设计串行接口设计 5.2.2 SPI5.2.2 SPI串行接口设计串行接口设计 28按电气标准及协议来分,串行接口包括按电气标准及协议来分,串行接口包括RS-232CRS-232C、RS-422RS-422、RS485RS485、USBUSB、PCIPCI、PS/2PS/2等。等。信号信号传输传输方式方式一个数字系统的功能通常需要多个器件或设备共一个数字系统的功能通常需要多个器件或设备共同来完成,他们
39、相互之间通过导线相连进行通信同来完成,他们相互之间通过导线相连进行通信并行传输并行传输串行传输串行传输多连线,单周多连线,单周期传完各位期传完各位单连线,多周单连线,多周期传完各位期传完各位特点特点295.2.1 RS2325.2.1 RS232串行接口设计串行接口设计 目前目前EIA-232EIA-232是是PCPC机与通信工业中应用最广泛的一种机与通信工业中应用最广泛的一种串行接口。串行接口。EIA-232EIA-232常称的常称的RS232RS232或或UARTUART,被定义为一,被定义为一种在低速率串行通信中增加通信距离的单端标准。种在低速率串行通信中增加通信距离的单端标准。(1)U
40、ART(1)UART物理层协议物理层协议 RS232RS232物理层协议采取不平衡物理层协议采取不平衡传输的单端通信方式。传输的单端通信方式。UARTUART物理层标准规定物理层标准规定RS232RS232的传的传送距离要求可达约送距离要求可达约1515米,用米,用-5V-5V-15V-15V之间的任意电平之间的任意电平表示逻辑表示逻辑11;用;用+5V+5V+15V+15V电平表示逻辑电平表示逻辑00,这,这里采用的是负逻辑。里采用的是负逻辑。+E+E-E-E0 01100RS232RS232协议协议30(2)UART(2)UART链路层协议的帧格式链路层协议的帧格式 RS232RS232串
41、行发送数据的串行发送数据的帧格式如图帧格式如图5-55-5所示。在线路空闲时,主设备发送所示。在线路空闲时,主设备发送11。在通信时,主设备需要先发一个起始位在通信时,主设备需要先发一个起始位00,以表示,以表示通信的开始,然后先从最低位开始传送有效数据,数据通信的开始,然后先从最低位开始传送有效数据,数据传输结束后再传送一比特的奇偶校验值,最后发送停止传输结束后再传送一比特的奇偶校验值,最后发送停止位位11,以表示当前通信的完成。此外还可安排一个,以表示当前通信的完成。此外还可安排一个空闲位,如果没有空闲位,此时异步传送的效率为最高。空闲位,如果没有空闲位,此时异步传送的效率为最高。其中,数
42、据位数可以事先约定为其中,数据位数可以事先约定为5 5位、位、6 6位、位、7 7位或者位或者8 8位;位;奇偶校验位根据事先约定由对数据位按位进行异或运算奇偶校验位根据事先约定由对数据位按位进行异或运算或者同或运算而得到,它不是必须的。或者同或运算而得到,它不是必须的。图图5 55 RS2325 RS232帧格式帧格式31(3)UART(3)UART链路层协议的波特率链路层协议的波特率 国际上规定的一个串国际上规定的一个串行通信波特率标准系列是行通信波特率标准系列是:110:110、300300、600600、12001200、18001800、24002400、48004800、96009
43、600、1920019200。计算机中常用的波。计算机中常用的波特率是:特率是:110110、300300、600600、12001200、24002400、48004800、96009600、1920019200、2880028800、3360033600、5600056000、115200bits/s115200bits/s。(4)(4)收发两端波特率的匹配收发两端波特率的匹配 串行通信分为同步通信串行通信分为同步通信方式和异步通信方式两种类型。方式和异步通信方式两种类型。当当RS232RS232按同步通信方式工作,要求串行数据传输的按同步通信方式工作,要求串行数据传输的驱动时钟驱动时钟f
44、 fs s为数据传输的时钟为数据传输的时钟f fb b。同步通信方式工作的。同步通信方式工作的优点是驱动时钟设计较为简单,但缺点是不能很好地解优点是驱动时钟设计较为简单,但缺点是不能很好地解决收发信两端的相位同步问题,相位的不同步可能导致决收发信两端的相位同步问题,相位的不同步可能导致接收端错误检测线路上传来的数据。因此接收端错误检测线路上传来的数据。因此RS232RS232更多地更多地是采用异步通信方式以解决相位同步问题。是采用异步通信方式以解决相位同步问题。32在异步通信方式中,通信双方各自具有独立的时钟,在异步通信方式中,通信双方各自具有独立的时钟,传输的速率由双方约定。传输的速率由双方
45、约定。RS232RS232串行驱动时钟的频率串行驱动时钟的频率f fs s不是标准波特率不是标准波特率f fb b,而是波特率时钟频率的,而是波特率时钟频率的M M倍,目的倍,目的是为在接收时进行精确采样,以提取异步的串行数据。是为在接收时进行精确采样,以提取异步的串行数据。此时串行驱动时钟的频率此时串行驱动时钟的频率f fs s可按公式可按公式(5-1)(5-1)来计算:来计算:f fs s=Mf=Mfb b (5-1)(5-1)通常通常M M取值为取值为1616。如果系统驱动时钟频率为。如果系统驱动时钟频率为f fm m,假定为,假定为25MHz25MHz,将此频率变为标准波特率,将此频率
46、变为标准波特率f fb b的分频系数为的分频系数为N N,则,则此时串行驱动时钟频率此时串行驱动时钟频率f fs s与系统驱动时钟频率与系统驱动时钟频率f fm m之间的之间的关系可用公式关系可用公式(5-2)(5-2)来表示:来表示:MNfNfMfmms(5-2)(5-2)smffMN33如果串口通信采用如果串口通信采用9600b/s9600b/s的传输速率,的传输速率,M=16M=16,因此,因此需要产生一个需要产生一个9600960016=153600Hz16=153600Hz串行驱动时钟频率串行驱动时钟频率f fs s,即将外部输入的即将外部输入的25MHz25MHz的信号分成频率为的
47、信号分成频率为153600Hz153600Hz的信的信号。号。N/M162.76N/M162.76,这不是一个整数,取,这不是一个整数,取N/M=163N/M=163,得到,得到f fs s153374.233153374.233。相对误差为。相对误差为为:为:若取若取N/M=162N/M=162,得到,得到fs154320.988fs154320.988,相对误差为,相对误差为为为0.439%0.439%。可见取。可见取N/M=163N/M=163相对误差要小些。相对误差要小些。如要获得如要获得50%50%的波特率时钟,的波特率时钟,163/2=81.5163/2=81.5不是整数,不是整数
48、,因此可取高电平计数因此可取高电平计数8181个个f fm m脉冲,低电平计数脉冲,低电平计数8282个个f fm m脉脉冲,即冲,即T Ts s=81T=81Tm m+82T+82Tm m=163T=163Tm m。%147.0%153600153600233.153374163sssfff34(5)(5)异步通信方式下串行驱动时钟程序编写异步通信方式下串行驱动时钟程序编写例例5-45-4设计一个系统驱动时钟频率设计一个系统驱动时钟频率f fm m=25MHz=25MHz,标准,标准波特率波特率f fb b=9600bits/s=9600bits/s,串行驱动采样时钟的频率,串行驱动采样时钟
49、的频率f fs s=9600=960016Hz16Hz的的RS232RS232串行收发系统。串行收发系统。该系统应包括将该系统应包括将f fm m=25MHz=25MHz时钟变为采样时钟时钟变为采样时钟153600Hz153600Hz的分频电路、的分频电路、1 1比特的奇偶校验位获取电比特的奇偶校验位获取电路、路、RS232RS232串行输出控制电路。串行输出控制电路。1616倍倍9600bps9600bps采样时钟采样时钟f fs s输出电路设计:输出电路设计:fs.vhdfs.vhd35librarylibrary IEEE IEEE;useuse IEEE.std_logic_1164.
50、IEEE.std_logic_1164.allall;entityentity dvfm_fs dvfm_fs isis PortPort(clk(clk :inin std_logicstd_logic;ctrctr :inin std_logicstd_logic;fs fs:outout std_logicstd_logic);endend dvfm_fs dvfm_fs;architecture architecture bhvbhv ofof dvfm_fs dvfm_fs isis signal signal counter counter:integer rangeinteger