网站大量收购闲置独家精品文档,联系QQ:2885784924

RS232设计报告和verilog代码,含testbench,可以直接运行.docx

RS232设计报告和verilog代码,含testbench,可以直接运行.docx

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
RS232设计报告和verilog代码,含testbench,可以直接运行课案

RS232接口数据转发协议实验报告 设计要求 设计RS232接口数据转发协议,将8位并行数据转发为RS232协议的串口数据发送出去。 entity rs232 port ( clk: in std_logic; -- 16MHz输入时钟 rdy: in std_logic; --数据准备好信号, 1个时钟周期的正脉冲 data: in std_logic_vector(7 downto 0); --要发送的并行数据 bps: in std_logic_vector(1 downto 0); --波特率设置 -- 00:4800bps 01:9600 10:19200 11:38400 parity : in std_logic; --奇偶校验控制,0:奇校验 1:偶校验 d_out: out std_logic); --串行数据输出 end rs232; 协议要求: 波特率:4800/ 9600/19200/38400可选 8位数据位,1位停止位,偶校验可选 设计要求: (1)采用VHDL或Verilog语言设计上述电路; (2)写出测试激励文件,并仿真; (3)分析仿真结果,并撰写设计报告. (4)提交完整的纸质设计报告并附源代码. 2.接口协议要求 一个字符一个字符传输,每传一个字符总是以起始位???始,以停止位结束,字符之间没有固定时间间隔要求。波特率可在4800、9600、19200、38400中选择。 每一个字符前面都有一位起始位(低电平),字符本身有5-7位数据位,接着是一位校验位,最后是一位停止位。停止位和空闲位规定必须为高电平 3.系统结构分析 本设计采用自顶向下的分析方法,结合端口要求和协议要求,将设计分为顶层模块和底层模块。 顶层模块框图如下: 底层模块主要又包含两个部分,时钟分频和串行输出。 时钟分频模块结构图如下: 串行输出模块结构图如下: 顶层模块和底层模块的关系如下: 4.实验结果分析 在使用verilog HDL实现各模块的过程中,采用自底向上的实现方法,将各个模块逐一实现后进行编译、仿真。 编译结果如下: 时钟分频模块仿真结果如下: 串行输出模块仿真结果如下: 顶层模块仿真结果如下: 虽然在全队的努力之下基本实现了设计要求,但是由于能力的有限,设计仍有很多不足之处,为未来更进一步的优化指明方向。 1.时钟频率不够精确,如果需要十分精确的时钟频率,需要采用模拟锁相环电路使输入时钟扩大三倍,然后分频方能实现。 2.设计实现依赖于前级,要求本级数据发送完成且finish信号高电平有效之后才能再次使rdy信号有效。 3.如若后级发现数据有错,无法实现数据重发的功能。 4.在测试平台的编写过程中,只是随机地选取了两组数据进行验证,未能实现所有输入数据的覆盖。 实验verilog代码: module clk_select(rst,clk_in,bps,clk_out); input rst,clk_in; input [1:0]bps; output reg clk_out; reg [11:0] cnt; reg [11:0] cnt_end; always@(bps or rst) begin if(~rst) clk_out=0; else case (bps) 2b00 : cnt_end=1666; 2b01 : cnt_end=833; 2b10 : cnt_end=416; 2b11 : cnt_end=208; default : cnt_end=208; endcase end always@(posedge clk_in or negedge rst) begin if(~rst) cnt=0; else if(cnt==cnt_end) cnt=0; else cnt=cnt+1; end always@(posedge clk_in or negedge rst) begin if(cnt==cnt_end) clk_out=~clk_out; end Endmodule module clk_select_testbench; reg rst,clk_in; reg [1:0] bps; wire clk_out; initial begin $monitor (clk_out=%b,clk_out); end initial begin #0 rst=1b0; #20 rst=1b1; bps=2b11; #200000 bps=2b00; e

文档评论(0)

jiayou10 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档