查看: 2293|回复: 0

【小脚丫STEP-MXO2】学习2 —Verilog HDL模拟串口通信

[复制链接]
  • TA的每日心情

    2017-12-13 09:01
  • 签到天数: 152 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2016-12-26 16:05:06 | 显示全部楼层 |阅读模式
    分享到:
    串口通信是单片机里最基础的通信接口,这里的串口是指RS232串口。一般单片机里已经硬件集成了UART协议,所以串口通信只要写入数据就行,把波特率设定好。一般常用串口去监测单片机数据或者指令的传输。
          而在这款FPGA里硬件是没有串口的,不过有硬件SPI和I²C。有兴趣的也可以自己模拟IIC。现在做一光子计数的东西,频率较高,用FPGA采集并把数据通过串口发给STM32,然后进行处理。既然是模拟串口,那就把uart协议通过HDL描述出来。usrt协议的东西网上资料很多,板子上晶振是12MHz的,就在这个频率下我们选定波特率为9600进行传输。12000000/9600为1250,那么波特率分频计数值就是1249。下面放一下波特率产生的代码(我也是参考网上的)
    //============================波特率产生模块module speed_select_rx(clk,rst_n,bps_start,clk_bps); input clk;   //12M时钟 input rst_n;  //复位信号 input bps_start; //接收到信号以后,波特率时钟信号置位 output clk_bps; //接收数据中间采样点, reg[12:0] cnt;//分频计数器 reg clk_bps_r;//波特率时钟寄存器  reg[2:0] uart_ctrl;//波特率选择寄存器 always @(posedge clk or negedge rst_n)  if(!rst_n)   cnt<=13'd0;  else if((cnt==1249)|| !bps_start)   cnt<=13'd0;  else   cnt<=cnt+1'b1;//波特率时钟启动   always @(posedge clk or negedge rst_n) begin  if(!rst_n)   clk_bps_r<=1'b0;  else if(cnt== 2603)//当波特率计数到一半时,进行采样存储   clk_bps_r<=1'b1;  else   clk_bps_r<=1'b0; end assign clk_bps = clk_bps_r;//将采样数据输出给uart_rx模块endmodule波特率确定后就是数据的发送和接收了。整个完整代码我会在后面列出。
    代码的功能是通过电脑端发送数据,FPGA接收数据再回传到电脑。
    引脚绑定我选的是E3为tx端,F3为rx端。然后用串口转USB的的模块去接收发送数据。在这里说明下Tx和Rx端接的时候是tx-Tx,rx-Rx,这个是相对而言的,对于单片机是tx,对于外设就是rx。如果没有数据回传的话就反接下。看你的串口转USB模块的说明了。


    串口软件用的是串口猎人,功能强大。
    完整代码请参考https://pan.baidu.com/s/1i5sN7N3 密码:oqms
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-18 20:17 , Processed in 0.117207 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.