news 2026/10/26 10:54:03

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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混接必烧芯片,加个电平转换模块保平安。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 13:46:17

提示工程架构师揭秘:AI驱动提示实时优化的技术方案

提示工程架构师揭秘&#xff1a;AI驱动提示实时优化的技术方案 一、引言&#xff1a;为什么你需要“AI帮你调Prompt”&#xff1f; 1. 一个扎心的痛点&#xff1a;你还在手动“试错式”调Prompt吗&#xff1f; 上周&#xff0c;我遇到一位做AI客服的朋友&#xff0c;他吐槽&…

作者头像 李华
网站建设 2026/10/17 7:31:28

利用RabbitMQ提升大数据系统的消息吞吐量

RabbitMQ在大数据系统中的吞吐量优化实践&#xff1a;从原理到落地 副标题&#xff1a;解决高并发消息场景下的延迟、丢包与性能瓶颈 摘要/引言 在大数据系统中&#xff0c;消息中间件是连接数据源&#xff08;如日志采集、业务系统&#xff09;与计算引擎&#xff08;如Fli…

作者头像 李华
网站建设 2026/10/21 6:12:46

向量的叉乘

叉乘的定义&#xff1a; 对于不共线的两个向量 a 和 b &#xff0c;他们叉乘的结果是一个新的向量。并且这个向量垂直与a、b两个向量所在的平面。叉乘后向量的模为&#xff1a; | a x b| | a | | b | sinθ叉乘后向量的方向&#xff1a; 将 a b平移至同起点。用右手螺旋定…

作者头像 李华
网站建设 2026/10/17 7:30:40

焊缝跟踪 abb机器人二次开发 上位机由C#+halcon联合编程 提供源码讲解

焊缝跟踪 abb机器人二次开发 上位机由C#&#xff0b;halcon联合编程 提供源码讲解&#xff0c;abb编程及通讯、工业相机标定、halcon图像处理、C#与halcon联合编程等 系统架构与设计理念 本系统是一个高度集成的工业自动化解决方案&#xff0c;采用C# WinForms作为前端界面框…

作者头像 李华
网站建设 2026/10/21 11:08:54

Golang高性能轻量博客程序源码

极速部署&#xff0c;拥抱主题插件化你是否厌倦了臃肿、复杂的博客系统&#xff1f;是否希望拥有一个启动如闪电、资源占用极小&#xff0c;同时又保持足够灵活性的个人写作空间&#xff1f;今天&#xff0c;我们向所有追求极致效率和简洁的开发者、博主推荐一款基于 Go 语言开…

作者头像 李华
网站建设 2026/10/25 4:09:41

互联网大厂Java面试实战:从Spring Boot到Kafka的技术与业务场景解析

面试场景介绍 在当前互联网大厂的Java岗位面试中&#xff0c;面试官通常会结合具体业务场景&#xff0c;深入考察应聘者对核心技术栈的理解和应用能力。本文通过一个音视频场景的模拟面试&#xff0c;展示面试官与应聘者谢飞机的互动&#xff0c;帮助读者系统学习相关技术。第一…

作者头像 李华