日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UART_SEND详细设计方案

發(fā)布時間:2024/9/21 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UART_SEND详细设计方案 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.????? UART_SEND簡介:

串口是用的非常多的一種接口,實現(xiàn)原理比較簡單,基本所有CPU芯片都配置有串口,所以經常被用來作為調試接口。

2.????? UART_SEND規(guī)格:

實現(xiàn)9600波特率的串口發(fā)送,上位機串口軟件可以接收到發(fā)送的數(shù)據(jù)。

?

3.????? 實現(xiàn)原理

以波特率9600為例子說明,波特率9600接收一個bit的時間為1s/9600=104us,即每隔104us發(fā)送一個數(shù)據(jù)。

?

104us = 104000ns 50M時鐘的一個周期時間為20ns要遠小于104000ns,所以可以用50M時鐘產生的計數(shù)器來計數(shù),然后根據(jù)計數(shù)器來發(fā)送數(shù)據(jù)。

?

新建一個計數(shù)器,50Mhz為時鐘,那么計數(shù)器變化一次時間為20ns。

由于一次完整數(shù)據(jù)接收需要有1144000ns時間,所以計數(shù)器必須記到1144000ns時間。

1144000ns/20ns = 57200,所以需要16位計數(shù)器。

?

Startbit(0)占據(jù)計數(shù)器的0?? -104000ns/20ns = 5200

D0?????????? 占據(jù)計數(shù)器的5200-208000ns/20ns = 10400

D1?????????? 占據(jù)計數(shù)器的10400-312000ns/20ns = 15600

D2?????????? 占據(jù)計數(shù)器的15600-416000ns/20ns = 20800

D3?????????? 占據(jù)計數(shù)器的20800-520000ns/20ns = 26000

D4?????????? 占據(jù)計數(shù)器的26000-624000ns/20ns = 31200

D5?????????? 占據(jù)計數(shù)器的31200-728000ns/20ns = 36400

D6 ??????????占據(jù)計數(shù)器的36400-832000ns/20ns = 41600

D7?????????? 占據(jù)計數(shù)器的41600-936000ns/20ns = 46800?

校驗位?????? 占據(jù)計數(shù)器的46800-1040000ns/20ns = 52000

Endbit(1)? 占據(jù)計數(shù)器的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详细设计方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。