FPGA串口(verilog)

上传人:飞*** 文档编号:7204847 上传时间:2017-09-18 格式:DOC 页数:34 大小:271KB
返回 下载 相关 举报
FPGA串口(verilog)_第1页
第1页 / 共34页
FPGA串口(verilog)_第2页
第2页 / 共34页
FPGA串口(verilog)_第3页
第3页 / 共34页
FPGA串口(verilog)_第4页
第4页 / 共34页
FPGA串口(verilog)_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《FPGA串口(verilog)》由会员分享,可在线阅读,更多相关《FPGA串口(verilog)(34页珍藏版)》请在金锄头文库上搜索。

1、FPGA 实现 RS-232 串口收发的仿真过程( Quartus+Synplify+ModelSim)网上关于 RS-232 的异步收发介绍得很多,最近没事学着摸索用 ModelSim 来做时序仿真,就结合网上的参考资料和自己的琢磨,做了这个东西。针对我这个小程序结合 FPGA 的开发流程,主要走了以下几步:1. 文本程序输入(Verilog HDL)2. 功能仿真(ModelSim,查看逻辑功能是否正确,要写一个 Test Bench)3. 综合(Synplify Pro,程序综合成网表)4. 布局布线(Quartus II,根据我选定的 FPGA 器件型号,将网表布到器件中,并估算出相应

2、的时延)5. 时序仿真(ModelSim,根据时延做进一步仿真)这里贴出我的程序和各个详细步骤,能和各位正在学习的新手们一起分享。0. 原理略一、文本程序输入(Verilog HDL)发送端:module trans(clk,rst,TxD_start,TxD_data,TxD,TxD_busy);input clk,rst,TxD_start;input7:0 TxD_data; / 待发送的数据output TxD, / 输出端口发送的串口数据TxD_busy; reg TxD;reg 7:0 TxD_dataReg; / 寄存器发送模式,因为在串口发送过程中输入端不可能一直保持有效电平r

3、eg 3:0 state;parameter ClkFrequency = 25000000; / 时钟频率25 MHzparameter Baud = 115200; / 串口波特率115200 / 波特率产生parameter BaudGeneratorAccWidth = 16;reg BaudGeneratorAccWidth:0 BaudGeneratorAcc;wire BaudGeneratorAccWidth:0 BaudGeneratorInc = (Baud5)/(ClkFrequency4);wire BaudTick = BaudGeneratorAccBaudGene

4、ratorAccWidth;wire TxD_busy;always (posedge clk or negedge rst)if(rst)BaudGeneratorAcc 8)/(ClkFrequency7);reg Baud8GeneratorAccWidth:0 Baud8GeneratorAcc;always (posedge clk or negedge rst)if(rst)Baud8GeneratorAcc 1b1; /移位 8 次,第 1bit 起始位移除,剩下 8bit 正好时接收数据else if(num=4d12) beginnum =2000000) printf(*)

5、; else printf( );acc %= 2000000;这段代码会精确的以平均每 17.361111111. 个时钟间隔打印出一个*。为了从 FPGA 得到同样的效果,考虑到串行接口可以容忍一定的波特率误差,所以即使我们使用 17.3 或者 17.4 这样的分频比也是没有关系的。FPGA 波特率发生器我们希望 2000000 是 2 的整数幂,但很可惜,它不是。所以我们改变分频比,2000000/115200 约等于 1024/59 = 17.356. 这跟我们要求的分频比很接近,并且使得在 FPGA 上实现起来相当有效。/10 位的累加器 (9:0), 1 位进位输出 (10)reg

6、 10:0 acc; /一共 11 位!always (posedge clk)acc 5)/(ClkFrequency4);这行程序也使得结果成为整数,从而避免截断。这就是整个的设计方法了。现在我们已经得到了足够精确的波特率,可以继续设计串行接收和发送模块了。FPGA 实现串行接口 RS232(3)2008-12-17 11:40RS-232 发送模块下面是我们所想要实现的:它应该能像这样工作: 发送器接收 8 位的数据,并将其串行输出。(TxD_start置位后开始传输). 当有数传输的时候,使busy信号有效,此时“TxD_start”信号被忽略. RS-232 模块的参数是固定的: 8

7、 位数据, 2 个停止位, 无奇偶校验.数据串行化假设我们已经有了一个 115200 波特的BaudTick信号.我们需要产生开始位、8 位数据以及停止位。用状态机来实现看起来比较合适。reg 3:0 state;always (posedge clk)case(state)4b0000: if(TxD_start) state =1&state_rec=8) beginif(clkbaud_rec) beginrxd_buf7=rxd_reg2;rxd_buf6:0=rxd_buf7:1;state_rec=state_rec+1;endendelse if(state_rec=9) beg

8、inif(clkbaud_rec) beginstate_rec=0;recstart=0;endendendendalways(rxd_buf) /将接受的数据用数码管显示出来begincase (rxd_buf)8h30:seg_data=8b0000_0011;8h31:seg_data=8b1001_1111;8h32:seg_data=8b0010_0101;8h33:seg_data=8b0000_1101;8h34:seg_data=8b1001_1001;8h35: seg_data=8b0100_1001;8h36:seg_data=8b0100_0001;8h37:seg_data=8b0001_1111;8h38:seg_data=8b0000_0001;8h39:seg_data=8b0001_1001;8h41:seg_data=8b0001_0001;8h42:seg_data=8b1100_0001;8h43:seg_data=8b0110_0011;8h44:seg_data=8b1000_0101;8h45:seg_data=8b0110_0001;8h46:seg_data=8b0111_0001;default:seg_data=8b1111_1111;endcaseend endmodule(串口通信)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号