收藏 分销(赏)

FPGA模拟串口自收发-Verilog.doc

上传人:天**** 文档编号:4543609 上传时间:2024-09-27 格式:DOC 页数:6 大小:375KB
下载 相关 举报
FPGA模拟串口自收发-Verilog.doc_第1页
第1页 / 共6页
FPGA模拟串口自收发-Verilog.doc_第2页
第2页 / 共6页
FPGA模拟串口自收发-Verilog.doc_第3页
第3页 / 共6页
FPGA模拟串口自收发-Verilog.doc_第4页
第4页 / 共6页
FPGA模拟串口自收发-Verilog.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

1、实现功能,FPGA里实现从PC串口接收数据,接着把接收到得数据发回去。波特率可选9600bps,可调 1bit起始位,8bit数据,1bit停止位,无校验位。 参考VHDL硬件描述语言与与数字逻辑电路设计模块介绍如下一、串口数据接收模块:特别注意一个数据位占4个clk_bps_4时钟周期。串口数据接收控制当数据接收端rxd出现起始位低电平,启动接收控制计数器rx_cnt,置位为8b0111_00(28),即rx_cnt5:2= 4b0111(7),rx_cnt1:0 = 2b00(0);一个计数周期开始,伴随clk_bps_4, rx_cnt加1(每一个数据位加4)串口接收数据移位控制(关键采

2、样点得选取)每当rx_cnt1:0 = 2b01,为了保证在rxd一位数据靠近中间位置采样;每4个clk_bps_4, rx_cnt5:2加1当rx_cnt5:2 = 8,9,10、15,完成8位得数据采样,串并变换置位标志位rxdF数据接收标志 rxd出现起始位低电平, rxdF置1,表示数据接收开始;当rx_cnt计数到8b1111_11(63),数据接收完成, rxdF置0置位标志位rdFULL;/接收锁存器满标志空闲时rdFULL置0,当数据接收完成,数据锁存到do_latch,同时 rdFULL置1,向上层模块表示数据以准备OK,可以来读取;rd置0,表示上层模块开始读取数据,rdF

3、ULL置0,表示数据已读走二、串口数据发送模块:数据发送依赖于wr(低电平有效)空闲时wr置1,数据发送时wr产生低电平脉冲,wr上升沿将数据锁存到din_latch;串口数据发送控制:wr由0跳变为1后,启动发送控制计数器tx_cnt,置位为8b0111_00(28),即tx_cnt5:2= 4b0111(7), tx_cnt1:0 = 2b00(0);一个计数周期开始,伴随clk_bps_4, tx_cnt加1(每一个数据位加4)串口发送数据移位控制 每4个clk_bps_4, tx_cnt5:2加1当tx_cnt5:2 =7,8,9,10、15,完成一位起始位,8位得数据位发送,随后tx

4、d置1(停止位),完成并串转换置位标志位txdF,tdEMPTY /发送完成标志当写数据到发送寄存器din_latch时,txdF,tdEMPTY置0; 当tx_cnt计数到8b1111_11(63),数据发送完成,txdF,tdEMPTY置1;三、串口数据自收发控制模块 当rdFULL = 1& tdEMPTY = 1(rdFULL = 1表示数据准备OK,tdEMPTY = 1表示上次发送已完成) ,rd,wr产生低脉冲,rd置0,数据读取到DATA,wr置0使能发送数据控制,低脉冲将DATA锁存到din_latch四、波特率发生模块:针对9600bps,生成4倍于波特率38、4KHz得时

5、钟信号,用于采样代码如下:串口数据自收发控制模块module UART(clk, rst_n, rxd, txd, LED1 );input clk; /时钟周期50MHzinput rst_n; /低电平复位 input rxd; /串口引脚输入接收发送PCoutput reg LED1;/lED测试用/*/wire tdEMPTY;/发送寄存器空标志reg wr;/发送使能信号reg 7:0DATA;wire clk_bps_4;/4倍于波特率时钟信号reg1:0 wr_cnt;/wr低电平计数reg rd;/读接收锁存器信号wire7:0 do_latch;/接收数据锁存wire rdF

6、ULL;/接收锁存器满标志reg1:0 rd_cnt;/rd低电平计数/*当rdFULL = 1& tdEMPTY = 1(rdFULL = 1表示接收锁锁存器数据准备OK,tdEMPTY = 1表示上次发送已完成),rd,wr产生低脉冲,rd置0,do_latch数据读取到DATA,wr置0用于使能发送数据控制,低脉冲将DATA锁存到din_latch*/always(posedge clk_bps_4 or negedge rst_n)begin if(!rst_n) beginrd = 1;wr = 1;wr_cnt = 0;rd_cnt = 0;endelse beginif(rdFU

7、LL = 1)begin rd = 0;wr = 0;wr_cnt = 0;rd_cnt = 0;DATA = do_latch;end if(rd = 0)/产生rd低电平 2个clk_bps_4周期begin rd_cnt = rd_cnt + 1;if(rd_cnt = 3)rd = 1;endif(wr = 0)/产生wr低电平 2个clk_bps_4周期begin wr_cnt = wr_cnt + 3;if(wr_cnt = 1)wr = 1;endendend/*发送*/Uart_TX tx( 、rst_n(rst_n), 、clk_bps_4(clk_bps_4),、wr(wr

8、),、tdEMPTY(tdEMPTY), 、DATA(DATA), 、txd(txd) );/output to tx_m/*接收*/ Uart_RX rx( 、rst_n(rst_n), 、clk_bps_4(clk_bps_4),、rd(rd), 、rdFULL(rdFULL),、do_latch(do_latch), 、rxd(rxd) );/*针对9600bps,生成38、4KHz得时钟信号,用于接收数据采样与数据发送*/Baudrate baud(、clk(clk), 、rst_n(rst_n), 、clk_bps_4(clk_bps_4); Endmodule串口数据接收模块:mo

9、dule Uart_RX(rst_n, clk_bps_4, rd, rdFULL, do_latch, rxd);input rst_n; /低电平复位 input clk_bps_4; /4倍于波特率时钟信号即一个数据位占4个时钟周期input rd;/接收使能,低电平有效output reg7:0 do_latch;/接收数据锁存output reg rdFULL;/接收锁存器满标志input rxd;/串口引脚输入reg7:0 data_r = 8bx; /接收数据寄存器reg5:0 rx_cnt;reg rxdF;/数据接收标志,RX模块内部信号/*当数据接收端rxd出现起始位低电平

10、,启动接收控制计数器rx_cnt,置位为8b0111_00(28),即rx_cnt5:2= 4b0111(7),rx_cnt1:0 = 2b00(0);一个计数周期开始,伴随clk_bps_4, rx_cnt加1(每一个数据位加4)*/always(posedge clk_bps_4 or negedge rst_n)beginif(!rst_n) begin rx_cnt = 0; endelse if(rx_cnt = 27 & rxd = 0) begin rx_cnt = 28; end else if(rx_cnt = 27 & rxd = 1)/串口无数据时,rx_cnt保持0 b

11、egin rx_cnt = 0; end else begin rx_cnt = rx_cnt + 1;endend/*空闲时rdFULL置0,当数据接收完成,数据锁存到do_latch,同时 rdFULL置1,向上层模块表示数据以准备OK,可以来读取;rd置0,表示上层模块开始读取数据,rdFULL置0,表示数据已读走*/always(posedge clk_bps_4 or negedge rst_n)/置位标志位 rdFULLbegin if(!rst_n) begin rdFULL = 0; endelse if(rd = 0) begin rdFULL = 0; end else i

12、f(rxdF = 1 & rx_cnt = 63) begindo_latch = data_r;/数据锁存rdFULL = 1;/锁存器数据准备OK endend/*rxd出现起始位低电平, rxdF置1,表示数据接收开始;当rx_cnt计数到8b1111_11(63),数据接收完成, rxdF置0*/always(posedge clk_bps_4 or negedge rst_n)/置位标志位 rxdFbegin if(!rst_n)begin rxdF = 0; end else if(rxd = 0)/拉低表示有数据来begin rxdF = 1;end else if(rxdF =

13、 1 & rx_cnt = 63)begin rxdF = 0;endend/*每当rx_cnt1:0 = 2b01,为了保证在rxd一位数据靠近中间位置采样;每4个clk_bps_4, rx_cnt5:2加1当rx_cnt5:2 = 8,9,1015,完成8位得数据采样,串并变换*/always(posedge clk_bps_4)/数据接收 begin if( rx_cnt1:0 = 2b01 )case(rx_cnt5:2) /4d7:rxd=0;起始位4d8:data_r0 = rxd;/ 低第1位4d9:data_r1 = rxd;/ 第2位4d10:data_r2 = rxd;/

14、第3位4d11:data_r3 = rxd;/ 第4位4d12:data_r4 = rxd;/ 第5位4d13:data_r5 = rxd;/ 第6位4d14:data_r6 = rxd;/ 第7位4d15:data_r7 = rxd;/高第8位 endcaseendendmodule串口数据发送模块:module Uart_TX(rst_n, clk_bps_4,wr,tdEMPTY, DATA, txd);input rst_n; /低电平复位 input clk_bps_4; /4倍于波特率时钟信号input 7:0DATA;input wr;/发送使能信号output reg tdEM

15、PTY;/发送寄存器空标志 对外输出output txd;/串口引脚输出reg txdF;/发送完成标志 模块内部信号reg txd_r; /发送寄存器reg7:0 din_latch;/发送数据锁存reg5:0 tx_cnt;/发送计数器/*空闲时wr置1,数据发送时wr产生低电平脉冲,wr上升沿将数据锁存到din_latch;*/always(posedge wr)begin /din_latch = 8hAB; din_latch = DATA; end/*wr由0跳变为1后,启动发送控制计数器tx_cnt,置位为8b0111_00(28),即tx_cnt5:2= 4b0111(7),

16、tx_cnt1:0 = 2b00(0);一个计数周期开始,伴随clk_bps_4, tx_cnt加1(每一个数据位加4)*/always(posedge clk_bps_4 or negedge rst_n)beginif(!rst_n) begin tx_cnt = 0; endelse if(tx_cnt = 27) beginif(tdEMPTY = 0 & wr = 1) begintx_cnt = 28;endelse begin tx_cnt = 0; endend else begin tx_cnt = tx_cnt + 1;endend/*当写数据到发送寄存器din_latch

17、时,txdF,tdEMPTY置0; 当tx_cnt计数到8b1111_11(63),数据发送完成,txdF,tdEMPTY置1;*/ always(posedge clk_bps_4 or negedge rst_n)begin if(!rst_n) begin txdF = 1;tdEMPTY = 1;endelse if(wr = 0) begintxdF = 0;tdEMPTY = 0;end else if(txdF = 0 & tx_cnt = 63) begintxdF = 1;tdEMPTY = 1; end end/*每4个clk_bps_4, tx_cnt5:2加1当tx_c

18、nt5:2 =7,8,9,1015,完成一位起始位,8位得数据位发送,随后txd置1(停止位),完成并串转换*/always(posedge clk_bps_4 or negedge rst_n)if(!rst_n) begin txd_r = 1;endelse begincase(tx_cnt5:2)4d7:txd_r = 1b0; /起始位04d8:txd_r = din_latch0; /低第1位4d9:txd_r = din_latch1; / 第2位4d10:txd_r = din_latch2;/ 第3位4d11:txd_r = din_latch3;/ 第4位4d12:txd_

19、r = din_latch4;/ 第5位4d13:txd_r = din_latch5;/ 第6位4d14:txd_r = din_latch6;/ 第7位4d15:txd_r = din_latch7;/高第8位default:txd_r = 1;endcaseendassign txd = txd_r;endmodule波特率发生模块:/*针对9600bps,生成4倍于波特率38、4KHz得时钟信号,用于采样*/module Baudrate(clk, rst_n,clk_bps_4);input clk; /时钟周期50MHzinput rst_n; /低电平复位 output clk_

20、bps_4; /38、4KHz时钟信号 9600*4reg clk_bps_4;reg 12:0 bps_cnt; /波特率产生时计数parameter N=1302;/分频系数 9600bpsalways(posedge clk or negedge rst_n)begin if(!rst_n) begin clk_bps_4 = 0; bps_cnt = 0;end else beginif(bps_cnt = N/2 1)begin clk_bps_4 = clk_bps_4; bps_cnt = 0;endelsebegin bps_cnt = bps_cnt + 1;endendendendmoduleModelsim仿真波形图:rxd端输入数据,txd发送连接PC 串口助手

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服