verilog串口通信程序

上传人:ni****g 文档编号:561687532 上传时间:2024-02-19 格式:DOC 页数:34 大小:222.01KB
返回 下载 相关 举报
verilog串口通信程序_第1页
第1页 / 共34页
verilog串口通信程序_第2页
第2页 / 共34页
verilog串口通信程序_第3页
第3页 / 共34页
verilog串口通信程序_第4页
第4页 / 共34页
verilog串口通信程序_第5页
第5页 / 共34页
点击查看更多>>
资源描述

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

1、FPGA实现RS-232串口收发的仿真过程(Quartus+Synplify+ModelSim)(2007-09-11 12:17:37) 网上关于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; / 寄存器发送模式,因为在串口发送过

3、程中输入端不可能一直保持有效电平reg 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 = BaudGene

4、ratorAccBaudGeneratorAccWidth;wire TxD_busy;always (posedge clk or negedge rst) if(rst) BaudGeneratorAcc = 0;else if(TxD_busy) BaudGeneratorAcc = BaudGeneratorAccBaudGeneratorAccWidth-1:0 + BaudGeneratorInc;/ 发送端状态wire TxD_ready = (state=0); / 当state = 0时,处于准备空闲状态,TxD_ready = 1assign TxD_busy = TxD_

5、ready; / 空闲状态时TxD_busy = 0/ 把待发送数据放入缓存寄存器 TxD_dataRegalways (posedge clk or negedge rst) if(rst) TxD_dataReg = 8b00000000;else if(TxD_ready & TxD_start)TxD_dataReg = TxD_data;/ 发送状态机always (posedge clk or negedge rst)if(rst) begin state = 4b0000; / 复位时,状态为0000,发送端一直发1电平 TxD = 1b1; endelsecase(state)

6、4b0000: if(TxD_start) begin state = 4b0100; / 接受到发送信号,进入发送状态 end4b0100: if(BaudTick) begin state = 4b1000; / 发送开始位 - 0电平 TxD = 1b0; end4b1000: if(BaudTick) begin state = 4b1001; / bit 0 TxD = TxD_dataReg0; end4b1001: if(BaudTick) begin state = 4b1010; / bit 1 TxD = TxD_dataReg1; end4b1010: if(BaudTi

7、ck) begin state = 4b1011; / bit 2 TxD = TxD_dataReg2; end4b1011: if(BaudTick) begin state = 4b1100; / bit 3 TxD = TxD_dataReg3; end4b1100: if(BaudTick) begin state = 4b1101; / bit 4 TxD = TxD_dataReg4; end4b1101: if(BaudTick) begin state = 4b1110; / bit 5 TxD = TxD_dataReg5; end4b1110: if(BaudTick)

8、begin state = 4b1111; / bit 6 TxD = TxD_dataReg6; end4b1111: if(BaudTick) begin state = 4b0010; / bit 7 TxD = TxD_dataReg7; end4b0010: if(BaudTick) begin state = 4b0011; / stop1 TxD = 1b1; end4b0011: if(BaudTick) begin state = 4b0000; / stop2 TxD = 1b1; enddefault: if(BaudTick) begin state = 4b0000;

9、 TxD = 1b1; endendcaseendmodule接收端:module rcv(clk, rst, RxD, RxD_data, RxD_data_ready, );input clk, rst, RxD;output7:0 RxD_data; / 接收数据寄存器output RxD_data_ready; / 接收完8位数据,RxD_data 值有效时,RxD_data_ready 输出读信号parameter ClkFrequency = 25000000; / 时钟频率25MHzparameter Baud = 115200; / 波特率115200reg2:0 bit_sp

10、acing;reg RxD_delay;reg RxD_start;reg3:0 state;reg7:0 RxD_data;reg RxD_data_ready;/ 波特率产生,使用8倍过采样parameter Baud8 = Baud*8;parameter Baud8GeneratorAccWidth = 16;wire Baud8GeneratorAccWidth:0 Baud8GeneratorInc = (Baud88)/(ClkFrequency7);reg Baud8GeneratorAccWidth:0 Baud8GeneratorAcc;always (posedge clk or negedge rst) if(rst) Baud8GeneratorAcc = 0; else Baud8GeneratorAcc = Baud8GeneratorAccBaud8GeneratorAccWidth-1:0 + Baud8GeneratorInc;/ Baud8Tick 为波特

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 综合/其它

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