//****************************************Copyright (c)***********************************//
// File name:
// Last modified Date:
// Last Version: V1.1
// Descriptions: 232串口通信,实现数据电脑输出通过FPGA,FPGA传输回电脑
//----------------------------------------------------------------------------------------
// Version: V1.0
// Descriptions: rs232发送数据编码
//
//----------------------------------------------------------------------------------------
// Version: V1.1
// Descriptions over:
//
//----------------------------------------------------------------------------------------
//****************************************************************************************//
module rs232_tx(
input clk , //系统时钟
input rst_n, //系统复位,低电平有效
input [7:0] rx232_data , //输入数据
input data_done,
output reg tx232_data//输出数据
);
//reg define
reg pos_1;//
reg pos_2;//
wire start;//开始
reg [15:0] clk_cnt;//时钟计数
reg tx232_valid;
reg [3:0] tx_cnt;
reg [7:0] tx_data;
parameter CLK_FREQ = 50_000_000;//系统时钟
parameter UART_BPS = 9600; //波特率
parameter BPS_CNT = CLK_FREQ/UART_BPS; //波特率计数
//*****************************************************
//** main code
//*****************************************************
//开始发送信号
assign start = (!pos_1)&pos_2;
//采沿
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
// reset
pos_1 <= 1'b0;
pos_2 <= 1'b0;
end
else begin
pos_1 <= data_done;
pos_2 <= pos_1;
end
end
//数据开始编码时间
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
// reset
tx232_valid <= 1'b0;
tx_data <= 8'd0;
end
else if (start) begin
tx232_valid<= 1'b1;
tx_data <= rx232_data;
end
else if ((tx_cnt==4'd9)&&(clk_cnt==BPS_CNT/2)) begin
tx232_valid<=1'b0;
tx_data <= 8'd0;
end
else begin
tx232_valid<= tx232_valid;
tx_data <= tx_data;
end
end
//数据计数
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
clk_cnt <= 16'd0;
tx_cnt <= 4'd0;
end
else if (tx232_valid) begin //处于发送过程
if (clk_cnt < BPS_CNT - 1) begin
clk_cnt <= clk_cnt + 1'b1;
tx_cnt <= tx_cnt;
end
else begin
clk_cnt <= 16'd0; //对系统时钟计数达一个波特率周期后清零
tx_cnt <= tx_cnt + 1'b1; //此时发送数据计数器加1
end
end
else begin //发送过程结束
clk_cnt <= 16'd0;
tx_cnt <= 4'd0;
end
end
//数据解码
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
// reset
tx232_data <= 1'b1;
end
else if (tx232_valid)
case (tx_cnt)
4'b0:tx232_data <= 1'b0;
4'd1:tx232_data <= tx_data[0];
4'd2:tx232_data <= tx_data[1];
4'd3:tx232_data <= tx_data[2];
4'd4:tx232_data <= tx_data[3];
4'd5:tx232_data <= tx_data[4];
4'd6:tx232_data <= tx_data[5];
4'd7:tx232_data <= tx_data[6];
4'd8:tx232_data <= tx_data[7];
4'd9:tx232_data <= 1'b1;
default: ;
endcase
else begin
tx232_data <= 1'b1;
end
end
endmodule
Warning (13410)?什么意思?警告一般不影响运行吧
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y