串列埠是用的非常多的一種介面,實現原理比較簡單,基本所有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...