程序目前支持9600、19200、38400、57600、115200,如需要其他波特率請根據計算方法加入代碼中,輸入的時鐘信號爲50MHz
module SpeedSet(clk,reset,cnt);
input clk,reset;
output cnt;
///波特率對應的脈衝的個數。計算方法如下:
//以9600bps爲例:1s/9600/20ns=5208.33333,即有5208個週期。
parameter bps9600 = 5208,
bps19200 = 2604,
bps38400 = 1302,
bps57600 = 868,
bps115200 = 434;
//個數的一半,即在週期的中間位置。進行採樣。
parameter bps9600_2 = 2604,
bps19200_2 = 1302,
bps38400_2 = 652,
bps57600_2 = 434,
bps115200_2 = 217;
reg cnt;
reg [12:0]sample;
always@(posedge clk or negedge reset)
begin
if(!reset) begin
sample<=0;
end
else if(sample==bps115200) begin
sample <= 0;
end
else begin
sample <= sample + 1'b1;
end
end
always@(posedge clk or negedge reset)
begin
if(!reset)
cnt<=1'b0;
else if(sample==bps115200)
cnt<=1'b1;
else
cnt<=1'b0;
end
endmodule