版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 制造业安全操作标准
- 城市河道绿化植树造林合同
- 人教新课标五年级语文下册教案
- 二年级语文下册集体备课教案
- 唐山市摄影服装租赁合同
- 妇幼保健院护工聘用合同
- 新闻采访车辆油耗维修管理规范
- 展览馆照明系统安装合同范本
- 印刷包装招投标委托书样本
- 大型剧院施工合同模板
- 《新时代劳动教育》新时代劳动价值观
- 数控机床控制系统装调学习通超星课后章节答案期末考试题库2023年
- 联营项目管理办法(法务-合同-人力-策划-资金-结算)
- 第十章特定人群的口腔保健
- 小学科学课程空气占据空间吗说课稿公开课一等奖市赛课获奖课件
- 监理大纲范本(同名6493)
- 中非合作会议峰会
- 锂离子电池储能电站早期安全预警及防护
- 江苏省南通市通州区2021-2022学年高二上学期期中质量检测物理试题Word版含答案
- 物业公司 监控录像查看记录表
- 2022年组织能力调研白皮书-腾讯
评论
0/150
提交评论