UART_SEND详细设计方案
1.????? UART_SEND簡介:
串口是用的非常多的一種接口,實現原理比較簡單,基本所有CPU芯片都配置有串口,所以經常被用來作為調試接口。
2.????? UART_SEND規格:
實現9600波特率的串口發送,上位機串口軟件可以接收到發送的數據。
?
3.????? 實現原理
以波特率9600為例子說明,波特率9600接收一個bit的時間為1s/9600=104us,即每隔104us發送一個數據。
?
104us = 104000ns 50M時鐘的一個周期時間為20ns要遠小于104000ns,所以可以用50M時鐘產生的計數器來計數,然后根據計數器來發送數據。
?
新建一個計數器,50Mhz為時鐘,那么計數器變化一次時間為20ns。
由于一次完整數據接收需要有1144000ns時間,所以計數器必須記到1144000ns時間。
1144000ns/20ns = 57200,所以需要16位計數器。
?
Startbit(0)占據計數器的0?? -104000ns/20ns = 5200
D0?????????? 占據計數器的5200-208000ns/20ns = 10400
D1?????????? 占據計數器的10400-312000ns/20ns = 15600
D2?????????? 占據計數器的15600-416000ns/20ns = 20800
D3?????????? 占據計數器的20800-520000ns/20ns = 26000
D4?????????? 占據計數器的26000-624000ns/20ns = 31200
D5?????????? 占據計數器的31200-728000ns/20ns = 36400
D6 ??????????占據計數器的36400-832000ns/20ns = 41600
D7?????????? 占據計數器的41600-936000ns/20ns = 46800?
校驗位?????? 占據計數器的46800-1040000ns/20ns = 52000
Endbit(1)? 占據計數器的52000-1144000ns/20ns = 57200
4.????? Verilog HDL源代碼
Verilog HDL代碼為:
?
moduleUartSend (
????????????? //input
????????????? sys_clk??????? ,
????????????? sys_rst_n????? ,
????????????? data_in??????? ,???????????? //data in 8bit
?
????????????? //output
????????????? uart_txd
????????????? );
?
//inputports
?
input??????????????????? sys_clk???????????? ;??? //system clock;
input??????????????????? sys_rst_n?????????? ;???//system reset, low is active;
input[WIDTH-1:0]??????? data_in???????????? ;??? //to send data? 8bit ;???
?
//outputports
output?????????????????? uart_txd??????????? ;???//uart txd output ;??
?
//regdefine
reg??? [WIDTH-1:0]?????? buff??????????????? ;????????
reg??? [WIDTH-1:0]?????? data_out??????????? ;
?
reg????????????????????? uart_txd??????????? ;???
reg????????????????????? txd???????????????? ;??? //temp txd signal;
????
reg? [SIZE-1:0]????????? counter???????????? ;????
????
//wiredefine
?
//parameterdefine
parameterWIDTH = 8;
parameterSIZE? = 16;
?
/*******************************************************************************************************
**???????????????? ?????????????Main Program???
**?
********************************************************************************************************/
always@(posedge sys_clk or negedge sys_rst_n) begin
??????? if (sys_rst_n ==1'b0) begin
??????????? buff <= 8'b0;
??????? end
??????? else
??????????? buff? <= data_in ;
end
???????
always@(posedge sys_clk or negedge sys_rst_n) begin
??????? if (sys_rst_n ==1'b0) begin
??????????? counter <= 16'b0;
??????? end
??????? else if (counter > 57200 )????
??????????? counter <= 16'b0;
??????? else
??????????? counter? <= counter + 1'b1;
end
?
always@(*) begin
??? if ((counter > 0)???????? &&? (counter?<= 5200 ))??
?????? txd?=? 1'b0? ;???????????????????????
??? else if ((counter > 5200)&&? (counter? <= 10400))??
?????? txd?=? buff[0]? ;????????????????????
??? else if ((counter > 10400) &&(counter? <= 15600))??
?????? txd?=? buff[1]? ;????????????????????
??? else if ((counter > 15600) &&(counter? <= 20800))??
?????? txd?=? buff[2]? ;?????????????????? ??
??? else if ((counter > 20800) &&(counter? <= 26000))??
?????? txd?=? buff[3]? ;????????????????????
??? else if ((counter > 26000) &&(counter? <= 31200))??
?????? txd?=? buff[4]? ;????????????????????
??? else if ((counter > 31200) &&(counter ?<= 36400))??
?????? txd?=? buff[5]? ;????????????????????
??? else if ((counter > 36400) &&(counter? <= 41600))??
?????? txd?=? buff[6]? ;????????????????????
??? else if ((counter > 41600) &&(counter? <= 46800))??
?????? txd?=? buff[7]? ;????????????????????
??? else if ((counter > 46800) &&(counter? <= 52000))??
?????? txd?=? 1'b1???? ;????????????????????
??? else if ((counter > 52000) &&(counter? <= 57200))
?????? txd?=? 1'b1???? ;???????
??? else???????????
?????? txd?=? 1'b1? ;?
end???????
?
?
always@(posedge sys_clk or negedge sys_rst_n) begin
??????? if (sys_rst_n ==1'b0) begin
?????????? uart_txd <= 1'b1;???????
??????? end
??????? else?
?????????? uart_txd? <= txd;???????
??????????
end
?
endmodule
//endof RTL code? ? ?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的UART_SEND详细设计方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于FPGA的UART接口协议设计
- 下一篇: UART_RECV详细设计方案