|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
多亏论坛上大侠们的帮助,我已经成功地使我写的uart和PC正确通信了 :)
感觉写的太简单了,可能不对,于是找了网上的一个RTL代码,再试试,结果主要就坑在波特率设置上:
比如:人家可能用的是50MHz的时钟,而我用的是66MHz。还有虽然我原来的程序用的是115200,但这段代码的目标波特率是多少我也不知道。。。
module bps_set(
clk,rst_n,
bps_start,
sample
);
input clk;
input rst_n;
input bps_start;
output sample;
/*
`define BPS_PARA 5207
`define BPS_PARA_HALF 2603
*/
reg [12:0] cnt;
always @ (posedge clk or posedge rst_n) begin
if (rst_n)
cnt <= 13'd0;
else if ((cnt == 868) || (!bps_start)) ///// 我很不解这个数是怎么算出来的?
cnt <= 13'd0;
else
cnt <= cnt+1'b1;
end
reg sample_reg;
always @ (posedge clk or posedge rst_n) begin
if (rst_n)
sample_reg <= 1'b0;
else if (cnt == 434) ///// 我很不解这个数是怎么算出来的?
sample_reg <= 1'b1;
else
sample_reg <= 1'b0;
end
assign sample = sample_reg;
endmodule
////////////////////////////////////////////////////////sample信号用法如下//////////////////////////////////////////////
always @ (posedge clk or posedge rst_n) begin
if (rst_n)
begin
rs232_tx_r <= 1'b1;
num <= 4'd0;
end
else if (tx_en)
if (sample)
begin
num <= num+1'b1;
case(num)
4'd0: rs232_tx_r <= 1'b0;
4'd1: rs232_tx_r <= tx_data[0];
4'd2: rs232_tx_r <= tx_data[1];
4'd3: rs232_tx_r <= tx_data[2];
4'd4: rs232_tx_r <= tx_data[3];
4'd5: rs232_tx_r <= tx_data[4];
4'd6: rs232_tx_r <= tx_data[5];
4'd7: rs232_tx_r <= tx_data[6];
4'd8: rs232_tx_r <= tx_data[7];
4'd9: rs232_tx_r <= 1'b1;
default: rs232_tx_r <= 1'b1;
endcase
end
else if (num == 4'd10)
num <= 4'b0;
end
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
请高手指点一下如何通过目标波特率115200和我的物理时钟66MHz,算出何时的计数值? |
|