当前位置: 首页 > news >正文

fpga verilog 实现串口收发通信,上板可直接通信 支持xilinx和altera

fpga verilog 实现串口收发通信,上板可直接通信 支持xilinx和altera

这玩意儿搞过FPGA的都知道,串口通信算是基本功里的战斗机了。今天咱们直接撸代码,不废话硬件原理,反正就是搞个能收能发的模块,Xilinx的板子和Altera的板子通吃。

先看波特率生成——这玩意是串口的命门。拿个50MHz时钟为例,要搞个115200的波特率,分频系数这么算:

localparam CLK_FREQ = 50_000_000; localparam BAUD_RATE = 115200; localparam BAUD_COUNT = CLK_FREQ / BAUD_RATE; reg [15:0] baud_counter; always @(posedge clk) begin if(baud_counter == BAUD_COUNT-1) begin baud_tick <= 1'b1; baud_counter <= 0; end else begin baud_tick <= 1'b0; baud_counter <= baud_counter + 1; end end

重点在分频系数别算错,尤其是Altera的Cyclone系列时钟架构和Xilinx不一样的时候,实测发现有些板子需要把分频系数减1才能准确。

发送模块的核心是状态机,直接上硬菜:

reg [3:0] tx_state; reg [7:0] tx_data; always @(posedge clk) begin case(tx_state) 0: if(tx_start) begin tx_reg <= 0; //起始位 tx_state <= 1; bit_count <= 0; end 1: if(baud_tick) begin tx_reg <= tx_data[bit_count]; bit_count <= bit_count + 1; tx_state <= (bit_count == 7) ? 2 : 1; end 2: if(baud_tick) begin tx_reg <= 1; //停止位 tx_state <= 3; end 3: begin tx_done <= 1'b1; tx_state <= 0; end endcase end

注意这里用了非标准写法,状态直接用数字表示,老司机都懂——状态少的时候这么写更直观。停止位搞个1.5位的骚操作?别,老老实实1位最稳妥。

fpga verilog 实现串口收发通信,上板可直接通信 支持xilinx和altera

接收模块的玄学在于抗干扰:

reg [7:0] rx_buffer; reg [2:0] sample_counter; always @(posedge clk) begin if(rx_sync) begin //消抖后的信号 case(rx_state) 0: if(!rx_sync) begin //检测起始位 sample_counter <= 0; rx_state <= 1; end 1: if(baud_tick) begin sample_counter <= sample_counter + 1; if(sample_counter == 3) begin //取中间值采样 rx_buffer[bit_count] <= rx_sync; bit_count <= bit_count + 1; end if(bit_count == 8) begin rx_state <= 2; end end 2: begin //校验停止位 if(rx_sync) rx_valid <= 1'b1; rx_state <= 0; end endcase end end

重点在采样时刻选在数据位中间,用3次采样的多数表决更稳。实测发现某些Altera板子的IO延迟需要调整采样点,这时候改sample_counter的触发条件就行。

跨平台兼容的骚操作在这:

`define ALTERA_RESET 1 //Xilinx用0,Altera用1 reg uart_rst; always @(posedge clk) begin uart_rst <= `ALTERA_RESET ? ~rst_n : rst_p; end

Xilinx的复位通常是高有效,Altera习惯低有效,用宏定义切换美滋滋。记得在顶层模块例化时传对应的复位信号。

最后上板实测,拿个USB转TTL模块,杜邦线接好RX/TX。用个回环测试代码:

always @(posedge clk) begin if(rx_valid) begin tx_data <= rx_buffer; tx_start <= 1'b1; end else begin tx_start <= 1'b0; end end

打开串口助手,敲字母能自发自收就妥了。注意电压匹配——3.3V和5V混接必烧芯片,加个电平转换模块保平安。

http://www.jsqmd.com/news/330463/

相关文章:

  • 数字图形处理篇---图像存储格式
  • 玉米目标检测实战:基于YOLO13-C3k2-RFAConv的优化方案_1
  • 数字图像处理篇---BMP
  • Go语言并发模式解析:利用Channel处理高并发任务
  • 考虑充电需求差异性的电动汽车协同充放电调度方法
  • 直接抓个Verilog的BT656组帧模块来看,核心逻辑就盯着同步码塞数据。玩过FPGA视频处理的都知道,嵌入式同步码(EAV/SAV)是协议的关键。看这段
  • Leetcode会员尊享面试100题:1086:前五科的均分
  • 【题解】Atcoder Beginner Contest 443(ABC443) A~E
  • Elasticsearch索引优化策略,提升全文检索查询性能
  • 满意度从62%到95%!礼品公司的员工福利定制实战
  • 光伏-混合储能微电网能量管理系统模型 系统主要由光伏发电模块、mppt控制模块、混合储能系统模...
  • 赋能主机厂供应链质量与效率的数字化引擎——全星APQP供应商研发协同管理软件系统
  • 员工福利定制常见问题解答(2026专家版)
  • Java高频面试题:MyBatis如何处理懒加载和预加载?
  • 混合动力汽车SIMULINK整车模型,并联P2构型,基于规则的控制策略,模型运行及仿真无误
  • 题解:洛谷 P1056 [NOIP 2008 普及组] 排座椅
  • 3500
  • PSO-GRU多变量回归预测:Matlab中的粒子群优化门控循环单元程序
  • 利用fpga搭建永磁同步电机电机svpwm的源码,采用的是verilog搭建底层框架,利用ni...
  • 2026铝板铝皮采购问答式指南
  • 2026智推时代GEO优化对接指南:合作全流程指引
  • Serverless架构实战:使用AWS Lambda构建无服务器数据处理管道
  • 【网友委托的爬虫代码】KanAcademyTranscriptsSprider.py(网站有反爬虫,做不了)
  • 基于ASP的毕业论文管理系统的设计与实现 开题报告
  • Flink在大数据领域的安全漏洞防范
  • 基于Android的课堂教学辅助系统 开题报告
  • 2025年12月Scratch图形化编程等级考试四级真题试卷
  • 2026年1月专业评测|主流GEO优化服务商优选机构权威推荐
  • 别被“伪自律”绑架:为什么你的“中国胃”跑不动“西式沙拉”?
  • 数据中台在大数据领域的应用挑战与解决方案