这个是发送,每秒发送一个0x31,这次有点懒了,连发的数据都没改下,按教程来的,不过内容并不是完全按教程,先把例程看一下,明白了思路后就自己敲,想不起来了或综合通不过了再对比例程,找原因,我觉得这样学习比较快一点。
/*********************************************/
/*********************************************/
module tx_232_top(clk,rst_n,tx_pin_out);
input clk;
input rst_n;
output tx_pin_out;
wire Tx_done_sig;
wire Tx_en_sig;
wire[7:0] Tx_data;
tx U1(
.clk(clk),.rst_n(rst_n),
.tx_en_sig(Tx_en_sig),
.tx_data(Tx_data),
.tx_done_sig(Tx_done_sig),
.tx_pin_out(tx_pin_out)
);
control U2(
.clk(clk),.rst_n(rst_n),
.tx_done_sig(Tx_done_sig),
.tx_en_sig(Tx_en_sig),
.tx_data(Tx_data)
);
endmodule
/*********************************************/
/*********************************************/
module control (clk,rst_n,tx_done_sig,tx_en_sig,tx_data);
input clk;
input rst_n;
input tx_done_sig;
output tx_en_sig;
output[7:0] tx_data;
reg[7:0] tx_data_r;
reg[25:0] count;
reg is_En;
parameter T_1S = 26'd50_000_000;
always@(posedge clk or negedge rst_n)
if(!rst_n)
count <= 26'd0;
else if(count == T_1S)
count <= 26'd0;
else
count <= count + 1'b1;
always@(posedge clk or negedge rst_n)
if(!rst_n)
begin
is_En <= 1'b0;
tx_data_r <= 8'h31;
end
else if(tx_done_sig)
begin
tx_data_r <= 8'h31;
is_En <= 1'b0;
end
else if(count == T_1S)
is_En <= 1'b1;
assign tx_en_sig = is_En;
assign tx_data = tx_data_r;
endmodule
/*********************************************/
/*********************************************/
module tx(clk,rst_n,tx_en_sig,tx_data,tx_done_sig,tx_pin_out);
input clk;
input rst_n;
input[7:0] tx_data;
input tx_en_sig;
output tx_done_sig;
output tx_pin_out;
wire bps_clk;
rs_bps U1(
.clk(clk),
.rst_n(rst_n),
.count_sig(tx_en_sig),
.bps_clk(bps_clk)
);
tx_control U2(
.clk(clk),.rst_n(rst_n),
.tx_en_sig(tx_en_sig),
.tx_data(tx_data),
.bps_clk(bps_clk),
.tx_done_sig(tx_done_sig),
.tx_pin_out(tx_pin_out)
);
endmodule
/*********************************************/
/*********************************************/
module rs_bps( clk,rst_n,count_sig,bps_clk );
input clk;
input rst_n;
input count_sig;
output bps_clk;
/***************************/
reg[12:0] count_bps;
always@(posedge clk or negedge rst_n)
if(!rst_n)
count_bps <= 13'd0;
else if(count_bps == 13'd5207) //50M/9600 = 5208
count_bps <= 13'd0;
else if(count_sig)
count_bps <= count_bps + 1'b1;
else
count_bps <= 13'd0;
/***************************/
assign bps_clk = (count_bps == 13'd2604) ? 1'b1 : 1'b0 ;
/***************************/
endmodule
/*********************************************/
/*********************************************/
module tx_control
(
clk,rst_n,
tx_en_sig,
tx_data,
bps_clk,
tx_done_sig,
tx_pin_out
);
input clk;
input rst_n;
input tx_en_sig;
input [7:0] tx_data;
input bps_clk;
output tx_done_sig;
output tx_pin_out;
/*************************************/
reg [3:0] i;
reg tx_r;
reg isDone;
always@(posedge clk or negedge rst_n)
if(!rst_n)
begin
i <= 4'd0;
tx_r <= 1'b1;
isDone <= 1'b0;
end
else if(tx_en_sig)
case(i)
4'd0:
if(bps_clk) begin i <= i + 1'b1; tx_r <= 1'b0; end
4'd1,4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8:
if(bps_clk)
begin
i <= i + 1'b1;
tx_r <= tx_data[i-1];
end
4'd9:
if(bps_clk)
begin
i <= i + 1'b1;
tx_r <= 1'b1;
end
4'd10:
if(bps_clk)
begin
i <= i + 1'b1;
tx_r <= 1'b1;
end
4'd11:
if(bps_clk)
begin
i <= i + 1'b1;
isDone <= 1'b1;
end
4'd12:
begin
i <= 1'b0;
isDone <= 1'b0;
end
endcase
/***************************/
assign tx_pin_out = tx_r;
assign tx_done_sig = isDone;
/***************************/
endmodule