内置FIFO的UART设计与实现_第1页
内置FIFO的UART设计与实现_第2页
内置FIFO的UART设计与实现_第3页
内置FIFO的UART设计与实现_第4页
内置FIFO的UART设计与实现_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、内置FIFO的UART设计与实现一、程序(加批注)library ieee; -U1:RSRuse ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity RSR is port(reset:in std_logic; rx:in std_logic; clk:in std_logic; rx_data:out std_logic_vector(7 downto 0); rx_int:out std_logic);end entity; architecture ar

2、c of RSR issignal shifter:std_logic_vector(7 downto 0);signal bitstate:integer range 0 to 10:=0;beginprocess(clk,reset,rx) -接收进程begin if(reset=1) then -复位信号 bitstate=0; shifter=ZZZZZZZZ; elsif(rising_edge(clk) then if(bitstate=0) then -状态0 判断有没有数据输入 if(rx=0) then bitstate=bitstate+1; end if; elsif(b

3、itstate=9) then -状态9 数据接收完成 bitstate=0; else -其他状态接收1-8为数据,停止位不检查 shifter(0)=rx; shifter(7 downto 1)=shifter(6 downto 0); bitstate=bitstate+1; end if; end if; end process;process(clk,reset) -输出进程begin if(reset=1) then rx_data=00000000; rx_int=0; elsif(rising_edge(clk) then if(bitstate=9) then rx_dat

4、a=shifter; -数据输出 rx_int=1; else rx_int=0; rx_data=ZZZZZZZZ; end if; end if;end process; end arc; library ieee; -U2:FIFO ( 8 * 8 bit )use ieee.std_logic_1164.all;entity FIFO is port( clock : in std_logic; reset : in std_logic; wr_req : in std_logic; -写请求 rd_req : in std_logic; -读请求 data_in : in std_l

5、ogic_vector(7 downto 0); full : buffer std_logic; -满状态,1有效 empty : buffer std_logic; -空状态,1有效 data_out : out std_logic_vector(7 downto 0);end FIFO;architecture arch of FIFO is type type_2d_array is array(0 to 7) of std_logic_vector(7 downto 0); signal fifo_memory : type_2d_array; signal wr_address :

6、 integer range 0 to 7; signal rd_address : integer range 0 to 7; signal offset : integer range 0 to 7; signal data_buffer : std_logic_vector(7 downto 0);beginoffset rd_address)else (8 - (rd_address - wr_address)when (rd_address wr_address)else 0;empty = 1 when (offset = 0) else 0; full = 1 when (off

7、set = 7) else 0; -实际存储空间7 * 8 bit,空出1*8bit以区分空和满process(clock,rd_req) -读进程begin if (clockevent and clock=1) then -同步清0 if reset = 1 then rd_address = 0; data_buffer 0); elsif (rd_req = 1 and empty = 0) then -读出数据 data_buffer rd_address rd_address = rd_address + 1 ; end case; end if; end if;end proce

8、ss;data_out = data_buffer ;process(clock,wr_req) -写进程begin if (clockevent and clock=1) then -同步清0 if reset = 1 then wr_address = 0; elsif (wr_req = 1 and full = 0) then -写入数据 fifo_memory(wr_address) wr_address wr_address = wr_address + 1 ; end case; end if; end if;end process;end arch;library ieee;

9、-U3:TSRuse ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity TSR is port(reset:in std_logic; tx_data:in std_logic_vector(7 downto 0); tx_int:in std_logic; - clk:in std_logic; tx:out std_logic; tx_req:out std_logic);end entity; architecture arc of TSR issigna

10、l shifter:std_logic_vector(7 downto 0);type state is(s0,s1,s2);beginprocess(clk,reset) variable cnt:integer range 0 to 8:=0; variable present_state:state;begin if(reset=1) then tx=1; tx_req -判定有没有并行数据输入 if(tx_int=0) then shifter=tx_data; tx=1; tx_req=1; present_state:=s1; -一旦进入并串转换输出,TSR不再受empty的控制

11、else tx=1; tx_req -状态1,低电平起始位输出 tx=0; tx_req -状态2,8位数据移位输出 if(cnt8) then tx=shifter(7-cnt); cnt:=cnt+1; tx_req=0; present_state:=s2; else -状态2,高电平停止位输出 cnt:=0; tx=1; tx_reqRXD,clk=bps_clk,reset=rst,rx_data=data1,rx_int=req1);U2:FIFO port map(data_in=data1,wr_req=req1,clock=bps_clk,reset=rst,data_out

12、=data2,rd_req=req2,empty=req3);U3:TSR port map(tx_data=data2,tx_int=req3,clk=bps_clk,reset=rst,tx_req=req2,tx=TXD);end arc;二、功能仿真如图中若干蓝线的划分:输入RXD:0 0000 0100 1 0 0001 0000 1 0 0011 0000 1 0 0110 1001 1 (即以8421BCD码形式输入本人的学号:04103069) 0 0000 0000 1 1 1111 1111 1(无效输入)对于第五行(即输入00)的说明:本程序设计 发送模块TSR 控制FI

13、FO的rd_req信号:只有当FIFO成功将其输出传送给TSR之后,才会产生tx_req信号控制rd_req信号并在下一个时钟上升沿下,FIFO进行读进程实现读取输出(只有这样才能实现FIFO输出的刷新)以及读指针的自增操作。而对于输入的数据69,尽管FIFO最终已经将其输出,但是由于读指针实现自增,empty变成1,无法将数据69传输到发送模块TSR。所以在输入的学号数据后面还要加上一个无用的8位数据将其写入FIFO以使写指针自增,实现empty=0,再在下一个时钟上升沿下将数据69传送到TSR,最终将输入的学号数据完整的输出。如图中若干蓝线的划分:输出TXD:1 0 0000 0000 1

14、 1 0 0000 0100 1 1 0 0001 0000 1 1 0 0011 0000 1 1 0 0110 1001 1(学号04103069的输出) 1 1 1111 1111 1(无效)对于第一行(即输出00)说明:由图可以看出是在第13个时钟周期开始输出的,因为开始清0后empty=1,直到第10个时钟上升沿下,rx_int=1(即wr_req=1)并且RSR输出数据,在第11个时钟上升沿下,向FIFO中写入数据04,empty=0(即tx_int=0),在第12个时钟上升沿下,FIFO的输出要送入TSR并且TSR输出1(此时tx_req=1)。而在此之前,因为tx_req=0(

15、即rd_req=0),尽管读指针为0不变并且所指向的数据变成04(即只执行了写进程而没有进行读进程),但是FIFO的输出一直保持着一开始复位清0时的输出00,在第13个时钟上升沿下TSR输出数据的起始位0(此时FIFO进行读进程,FIFO读取读指针所指向的数据04,输出变为04,但是读指针实现自增致使empty=1,不能将数据04送入TSR),接着依次输出00。说明:接收模块RSR:从输入数据到输出数据整个周期为 10 个时钟周期(数据格式:起始位0+8位有效数据+停止位1)。FIFO模块:对于发送模块TSR的设计:只要FIFO不为空(即empty=0),则在时钟上升沿的情况下,FIFO则将其

16、输出(复位清0后输出为00)传送给 TSR。TSR在每次输出10位数据(输出数据格式:8位数据开头加上起始位0,结尾加上停止位1)前,则在判断状态下输出1的同时产生tx_req信号请求FIFO输出下一个数据,在下一个时钟上升沿下,若empty=0则读指针自增指向下一个数据,并且FIFO将其输出实现输出的刷新;否则,读指针不变,并且FIFO输出不变。对于接收模块RSR的设计:只要RSR检验数据并接收完毕数据就会产生rx_int信号请求向FIFO中写入数据,如果full=0则在下一个时钟上升沿下数据写入;否则该数据相当于被丢弃不会再写入FIFO中,RSR再次进入检验状态,等待下一个有效数据。发送模

17、块TSR:因为多了一个判断状态(此时TXD输出1),再加上10位的数据,所以从数据输入到输出整个周期为 11 个时钟周期三、时序仿真四、耗用报告五、生成逻辑图附:对三个模块的设计与实现一、 接受模块U1:RSR1、 程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity RSR is port(reset:in std_logic; rx:in std_logic; -串行数据接收端RXD clk:in std_logic; -时

18、钟clk rx_data:out std_logic_vector(7 downto 0); -FIFO中的data_in rx_int:out std_logic); -FIFO中的wr_reqend entity; architecture arc of RSR issignal shifter:std_logic_vector(7 downto 0);signal bitstate:integer range 0 to 10:=0;beginprocess(clk,reset,rx) -接收进程 begin if(reset=1) then -复位信号 -异步清0 bitstate=0;

19、 shifter=ZZZZZZZZ; elsif(rising_edge(clk) then if(bitstate=0) then -状态0 判断有没有数据输入 if(rx=0) then bitstate=bitstate+1; end if; elsif(bitstate=9) then -状态9 数据接收完成 bitstate=0; else -其他状态接收1-8为数据,停止位不检查 shifter(0)=rx; shifter(7 downto 1)=shifter(6 downto 0); bitstate=bitstate+1; end if; end if; end proce

20、ss;process(clk,reset) -输出进程begin if(reset=1) then rx_data=00000000; -异步清0 rx_int=0; elsif(rising_edge(clk) then if(bitstate=9) then rx_data=shifter; -数据输出 rx_int=1; else rx_int=0; rx_data=ZZZZZZZZ; -不输出时呈高阻状态 end if; end if;end process; end arc;2、 功能仿真3、 时序仿真二、 U2:FIFO1、程序library ieee;use ieee.std_l

21、ogic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all; entity FIFO is port( clock : in std_logic; reset : in std_logic; wr_req : in std_logic; rd_req : in std_logic; data_in : in std_logic_vector(7 downto 0); full : buffer std_logic; empty : buffer std_logic; data_out : out std_

22、logic_vector(7 downto 0);end FIFO;architecture arch of FIFO is type type_2d_array is array(0 to 7) of std_logic_vector(7 downto 0); signal fifo_memory : type_2d_array; signal wr_address : integer range 0 to 7; signal rd_address : integer range 0 to 7; signal offset : integer range 0 to 7; signal dat

23、a_buffer : std_logic_vector(7 downto 0);beginoffset rd_address)else (8 - (rd_address - wr_address)when (rd_address wr_address)else 0;empty = 1 when (offset = 0) else 0;full = 1 when (offset = 7) else 0; -实际7*8bit容量(full=1)process(clock,rd_req)begin if (clockevent and clock=1) then if reset = 1 then

24、rd_address = 0; data_buffer 0); elsif (rd_req = 1 and empty = 0) then -empty=1则输出保持 data_buffer rd_address rd_address = rd_address + 1 ; end case; end if; end if;end process;data_out = data_buffer ;process(clock,wr_req)begin if (clockevent and clock=1) then -同步清0 clock时钟 if reset = 1 then wr_address = 0; elsif (wr_req = 1 and full = 0) then -full=1而wr_req=1则丢弃数据 fifo_memory(wr_address) wr_address wr_address = wr_address + 1 ; end case; end if; end if;end process;end arch;2、功能仿真3、时序仿真三、 发送模块U3:TSR1、 程序library ieee;use ieee.std_logic_11

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论