TA的每日心情 | 开心 2024-10-25 14:50 |
---|
签到天数: 1071 天 连续签到: 1 天 [LV.10]以坛为家III
|
在上篇https://www.cirmall.com/bbs/thread-205909-1-1.html的基础上来学习串口的接收处理,
实现的功能:将接收的到的串口数据以十进制的方式显示在开发板的数码管上。
一、硬件部分
和上篇一样的硬件电路,使用串口COM2接收。
二、程序部分
2.1、串口接收部分
2.2、接收到的数据处理部分
- module uart_hdl(
- input sys_clk, //系统时钟
- input sys_rst_n, //系统复位,低电平有效
- input recv_done, //接收一帧数据完成标志
- input [7:0] recv_data, //接收的数据
- input tx_busy, //发送忙状态标志
- output reg send_en, //发送使能信号
- output reg [7:0] send_data, //待发送数据
- output reg [7:0] led_data //待发送数据
- );
-
-
- //reg define
- reg recv_done_d0;
- reg recv_done_d1;
- reg tx_ready;
- //wire define
- wire recv_done_flag;
- //*****************************************************
- //** main code
- //*****************************************************
- //捕获recv_done上升沿,得到一个时钟周期的脉冲信号
- assign recv_done_flag = (~recv_done_d1) & recv_done_d0;
-
- //对发送使能信号recv_done延迟两个时钟周期
- always @(posedge sys_clk or negedge sys_rst_n) begin
- if (!sys_rst_n) begin
- recv_done_d0 <= 1'b0;
- recv_done_d1 <= 1'b0;
- end
- else begin
- recv_done_d0 <= recv_done;
- recv_done_d1 <= recv_done_d0;
- end
- end
- //判断接收完成信号,并在串口发送模块空闲时给出发送使能信号
- always @(posedge sys_clk or negedge sys_rst_n) begin
- if (!sys_rst_n) begin
- tx_ready <= 1'b0;
- send_en <= 1'b0;
- send_data <= 8'd0;
- end
- else begin
- if(recv_done_flag)begin //检测串口接收到数据
- tx_ready <= 1'b1; //准备启动发送过程
- send_en <= 1'b0;
- send_data <= recv_data; //寄存串口接收的数据
- led_data <= recv_data;
- end
- else if(tx_ready && (~tx_busy)) begin //检测串口发送模块空闲
- tx_ready <= 1'b0; //准备过程结束
- send_en <= 1'b1; //拉高发送使能信号
- end
- end
- end
- endmodule
复制代码
2.3、顶层设计
将接收的串口数据送到动态数码管
- module fpga_test (
- input sys_clk , // 系统时钟
- input sys_rst_n, // 系统复位信号(低有效)
- input touch_key, // 触摸按键
- output [5:0] seg_sel , // 数码管位选
- output [7:0] seg_led , // 数码管段选
- output [3:0] led , //4个LED灯
- output beep,
-
- //串口COM2
- input uart_rxd, //UART接收端口
- output uart_txd //UART发送端口
- );
- //parameter define
- parameter TIME_SHOW = 25'd25000_000; // 数码管变化的时间间隔0.5s
- parameter CLK_FREQ = 50000000; //定义系统时钟频率
- parameter UART_BPS = 115200; //定义串口波特率
- parameter led_en = 1;
- //wire define
- wire flag; // 数码管变化的通知信号
- wire flag_10ms;
- wire key_val;
- //wire define
- wire [19:0] data; // 数码管显示的数值
- wire [ 5:0] point; // 数码管小数点的位置
- wire en; // 数码管显示使能信号
- wire sign; // 数码管显示数据的符号位
- wire uart_recv_done; //UART接收完成
- wire [7:0] uart_recv_data; //UART接收数据
- wire uart_send_en; //UART发送使能
- wire [7:0] uart_send_data; //UART发送数据
- wire uart_tx_busy; //UART发送忙状态标志
- //*****************************************************
- //** main code
- //*****************************************************
- //动态LED数码管驱动
- seg_led_dynamic u_seg_led_dynamic(
- .clk (sys_clk),
- .rst_n (sys_rst_n),
-
- .data (data ), // 显示的数值
- .point (point ), // 小数点具体显示的位置,高电平有效
- .en (led_en),//(en ), // 数码管使能信号
- .sign (sign ), // 符号位,高电平显示负号(-)
-
- .seg_sel (seg_sel ), // 位选
- .seg_led (seg_led ) // 段选
- );
- //串口接收模块
- uart_recv #(
- .CLK_FREQ (CLK_FREQ), //设置系统时钟频率
- .UART_BPS (UART_BPS)) //设置串口接收波特率
- u_uart_recv(
- .sys_clk (sys_clk),
- .sys_rst_n (sys_rst_n),
-
- .uart_rxd (uart_rxd),
- .uart_done (uart_recv_done),
- .uart_data (uart_recv_data)
- );
-
- //串口处理
- uart_hdl u_uart_hdl(
- .sys_clk (sys_clk),
- .sys_rst_n (sys_rst_n),
-
- .recv_done (uart_recv_done),
- .recv_data (uart_recv_data),
- .led_data (data)
- );
- endmodule
复制代码
三、执行结果
在串口上发送十六进制数,开发板显示对应的十进制数
|
-
|