UART SEND詳細設計方案

2021-06-22 05:12:53 字數 3923 閱讀 8362

串列埠是用的非常多的一種介面,實現原理比較簡單,基本所有cpu晶元都配置有串列埠,所以經常被用來作為除錯介面。

實現9600波特率的串列埠傳送,上位機串列埠軟體可以接收到傳送的資料。

以波特率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

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;

endelse

buff  <= data_in ;

endalways@(posedge sys_clk or negedge sys_rst_n) begin

if (sys_rst_n ==1'b0) begin

counter <= 16'b0;

endelse if (counter > 57200 )    

counter <= 16'b0;

else

counter  <= counter + 1'b1;

endalways@(*) 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;       

endelse 

uart_txd  <= txd;       

endendmodule

//endof rtl code     

TinyURL設計方案

現在貌似tinyurl很火爆,也逐漸成為一種流行趨勢。對應於php版本的tinyurl也有一些演算法,其實本質上來說是一種hash。除此之外,還有另外一種tinyurl方案 類似於http img.ly 其實這種設計 是最簡單的,沒有使用hash,而是遞增,這種的好 處就是資料庫 可以無限擴充套件,...

許可權設計方案

簡要介紹一下該許可權管理系統的特點,該系統功能上做到了靈活授權,操控細緻,許可權可以細到按鈕及超鏈級別,而且部署簡單,下面談談我自己的設計經驗。該系統主要功能如下 1 自定義操作動作 如增加 刪除 修改 審核等,不再是以前見過的那種粗粒度的 按模組分配許可權,或者稍微先進點的規定死某幾個操作了 2 ...

快取設計方案

redis提供的快取的api,但是在開發階段,如果每個人都自己呼叫原生api實現快取時,由於每個人的水平問題,會導致實現方案千差萬別,同事又很難統一管理維護 通過提供spring的annotation,實現快取方案的統一 target retention retentionpolicy.runtim...