用verilog完成UART協定懂得甜心寶貝聊包養網作甚接口以及若何停止模塊化design

作者:

分類:

      UART是很簡略的協定,也可以說是進門級的協定,它自己不值得我們破費多年夜的精神切磋,可是我們可以把它看作我們剛學C說話時辰寫下的”hello world”,剛進修單片機時辰點亮的一個led燈,如許,它就有興趣義了,並且它的意義曾經不再是完成一個效能了。我們要好好應用這個簡略的協定往懂得“協定”這個概念以及若何停止模塊化design,這對FPGA來說,是尤為主要的兩個方面。
接待收看相干錄像:UART協定講授
重要內在的事務為:1•作甚接口協定,熟悉UART協定22•若何design模塊,designUART邏輯模塊3•如何design邏輯,完成UART邏輯design課程附帶中art測試法式,支撐不年夜于512字節的肆意長度數據收發接口協定      為什么要純真的往懂得“協定”這個很虛的詞呢?由於在我看來,對于剛接觸協定或許FPGA這方面的伴侶來說,了解“為什么這么做”比“了解怎么做”更主要。為什么這么說呢?
      記得我在上學時辰,我把很多多少協定列個清單有,看著清單遲疑滿志,預備像打怪進級那樣一個一個的霸佔,如許就能成為技巧牛人,走向人生巔峰了,然后我就往看技巧文檔,往搞懂這是個什么協定,怎么任務的,硬件怎么連的,法式怎么寫的,時序是什么樣子的,搞了不久,我降服佩服了。就拿我們常常會接觸到協定來舉例,uart、I2C、SPI,SDRAM、DDR、serdes、TCP/IP協定棧,此中TCP/IP協定占還包含UDP、TCP、RAP等候,還分了數據鏈路層等等,太多了太復雜了。我就被一堆一堆專門研究名詞搞暈了,被看不懂的時序整糊涂了,被他人的法式邏輯整殘了。那為什么會如許呢?心急,太想多學點多會點,太想進修更多的協定來晉陞本身,是以,只想了解這個怎么完成阿誰怎么做,把地位占的太低而不往斟酌人家為什么這么design,也就是疏忽了為什么這么做。
     實在,協定是學包養網dcard不完的,哪怕明天你把一切的協定都學會了,今天還會有新的協定呈現,但協定都是存在個性的,當我們了解為什么了這么做,并對此有深入的領會,就會游刃有余各類協定,簡略的協定,張口即來,復雜點的協定,了解一下狀況就會,沒有協定知足項目需求,那就造他個協定。協定是什么呢?
     協定是人們依據器件的物理特徵和應用場景想出來的讓器件溝通的方式。器件不會措辭,聰慧的人類就設定一種方式讓他們往溝通,經由過程交通往完成一些工作。所以說協定是人想出來的,哪怕再艱澀難明那也是人想出來的,協定是源自于人、源自于生涯的,我們是主人,是這些協定的design者,我們要往仰望它,把握它甚至是玩弄它,我們要將抽象的工具回回到生涯,站在一個更高的地位往做微觀的懂得,然后帶著這種懂得和洽奇心往看某個協定,看某篇文檔,我想就會更有用率和動力。好比說,令人比擬抓狂的專門研究名詞,可以說就是將生涯中的景象用在專門研究範疇的另一種表述方法。
      什么是呼應應對,就我說教員好,教員說同窗們好,      什么是通信超時,就是我啼聲美男,美男沒理我。      什么是三次握手,就是我看到小張了,說了句,“喲小張”,小張說嗯,我說,你真的是小張啊,小張來句,是的,我說,真的,小張說真的。這就是TCP/IP里面的三次握手也就是這個道理,握手好了就可以干其他事了,好比說,小張吃飯了沒?這就是通信內在的事務
      可以說,一些專門研究名詞不是可以經由過程生涯中的景象往包養意思說明,而是它就是源自于我們的生涯,那什么是協定呢?舉幾個例子,     1、我走路上看到小張,我說句:“小張,吃飯了沒?”,小張回應版主一句:“吃了”,這就是我和小張樹立起了通信機制,通信鏈路是我們發聲器官和空氣,通信協定就是漢語。      2、我又走路上,看到一條小狗,蠻心愛的,我說句:“小狗,吃飯了沒?”小狗回應版主一句:“汪汪”,嚇得我拔腿就跑,就是我和小狗通信樹立掉敗,固然通信鏈路樹立起來了,但通信協定確切漢語和狗語,就好用uart協定往和TA24C02通信,對不上啊。      3、我又走路上,看到小趙我說句:“小趙”小趙回應版主一句:“嗯嗯“我說句:“吃了沒”小趙回應版主一句:“吃了“,這就比如IIC協定,有肇端電子訊號,有應對電子訊號。      4、我又走路上,看到小李,我說句:“小李,吃飯了沒?”小李回了句,剛從茅廁出來”。這是啥,通信樹立了,但通信內在的事務校驗有誤,“明白了。嗯,你跟娘親在這裡待的夠久了,今天又在外面跑了一天,該回房間陪兒媳婦了。”裴母說道。 “這幾天對她好這就是為啥很多多少通信要做CRC校驗,輪迴校驗。     5、我走路上,看到一群美男,包養意思這把我衝動的,說了句:“嗨,美男們,吃飯了沒”?成果美男昂首一看這家伙怎么這么丑,沒人回應我,心里想著包養網推薦“傻X”、“丑人多作祟”,這叫什么?多播或播送,在工程上也是用的比擬多的一種方法。
所以說,通信協定源自于生涯,我們要有將抽象的工具回回到生涯的心態,如許懂得起來又不難又高興。      回過火來我們再說,什么是接口協定,百度說接口協定就是需求停止信息交流的接口間需求服從的通訊方法和請求。通信方法就是這信息是用什么傳遞的,拿什么運曩昔的,通訊請求就是語法,是說用漢語仍是英語仍是什么的。也就是說我們要讓兩個器件停止溝通,起首要做什么呢?斷定拿什么傳,然后斷定說什么話,最后可以說咱想說包養網推薦的了。當然這是簡略的通信樹立,復雜的通信道理一樣,但樹立經過歷程很復雜。
UART協定
      此刻就來了解一下狀況UART協定。我是用什么傳的呢?用USB轉串口線銜接上位機與FPGA板卡,FPGA板卡用MAX232做電平轉換之后與FPGA芯片相連。
上面我們就看一下uart協定。     UART串口通信的任務道理是將傳輸數據的每個字符一位接一位地傳輸。UART是用兩根線停止通訊的,從一端看,一個用來收他人說的,一個是發本身說的,一根線它就有兩種情形,要不是高電平,要不就是低電平,一根線我們傳數據呢?這就是事前說好的規則,也就是協定。大師可以想想,假如你來design,我們經由過程兩根線來停止通信,你會怎么design呢?我們先了解一下狀況我們的先輩是怎么design的。他的格局就是“肇端位(0)+八位數據+奇偶校驗+結束位”,他的速率是由波特率來設定,空閑狀況為高電平,這就是協定。上面我們來懂得一下。
什么是肇端位,就是要措辭了,我們人措辭得先出個聲,叫個“嗨,小張”器件它不克不及發聲,所以就要模仿一個與不出話時辰紛歧包養違法樣的情形,這就是肇端位,由於空閑時辰是高電平,所以當呈現低電日常平凡候表現可以措辭了。數據,就是和小張措辭的內在的事務,就是包養留言板吃飯了沒,好比說,我包養一個月價錢發個5就表現問包養網單次小張吃飯了沒,那一根線怎么發了,人家說了,每個字符一位接一位地傳輸,也就是把5轉為為二進制00000101,接上去就似乎敲電報似得收回往。發0吧數據線拉低了,發1把數據線拉高了,如許就發完了。奇偶校驗,什么是校驗,就是判定對不合錯誤。好比,我問小張吃飯了沒,同時做一個吃飯的舉措,這小張聽到我說吃飯了沒,又看到我做吃飯的舉措,就清楚了我是在問他吃飯了沒?假如我問他吃飯了沒,又做個蹲坑的舉措,小張就該沒有方向了,這是在干啥呢,這時辰校驗欠亨過。對于uart就一根線,怎么校驗,就數數你發的數里面有幾個1,假如短期包養1的個數是計數就把結束位,話說完了,數據線拉高,我不說了。
     為啥要設定波特率呢,例如我說,小張吃飯了沒?假如說快了,他反映不外來,認為我問他往茅廁了?說慢了,他還不耐心。所以說,接受者和包養犯法嗎發送者速度要婚配。對于機械,你不告知說多塊,更沒有方向了,所以就引出了波特率這個概念。但這只是我們一種深刻的懂得,實在波特率是一個很有汗青的名詞,它是為了留念電報碼的發現者法國人波特(Baudot)故單元為baud,波特率表現串口通訊的速度,可以淺顯的懂得為一個裝備在一秒鐘內發送(或接受)了幾多碼元符號。它是對符號傳輸速度的一種懷抱,1波特即指每秒傳輸1個碼元。在數字通訊中經常用時光距離雷同的符號來表現一個二進制數字,如許的時光距離內的電子訊號稱為(二進制)碼元。大師有愛好可以看百度百科的先容https://baike.baidu.com/item/%E6%B3%A2%E7%89%B9%E7%8E%87/2153185?fr=aladdin假如波特率為9600,也就是每秒發送9600個數據(這里的數據包含肇端、結束、校驗位等,這也就是和比特率的差別,比特率說的是有用數據),如許的話發送一個數據的時光就是1÷9600=0.0001041667s=104166ns,我們晶振是50MHZ,時鐘周期是20ns,所以計數個數為104166÷20=5208。所以,當我們在計數5208經過歷程中要完成一位數據的傳輸,但為了保險起見,我們在這個數的中心停止傳輸,也就是2604時一位發送數據。
模塊化design,模塊化design對FPGA工程師來說長短常主要的,公道的模塊劃分和封裝不只會使代碼更友愛,並且也很是利于保護,以下是我對模塊劃分的設法。
module bps_set
#(
    parameter BPS_CNT = 16 d5208
)
(
    input   wire    sys_clk,
    input   wire    sys_rst_n,
     
    output wire    rx_bps_vld,
   包養網ppt input   wire    rx_bps_en,
     
    output wire    tx_bps_vld,
    input   wire    tx_bps_en
);

    localparam BPS_HALF_CNT =( BPS_CNT>>1) – 1 b1;

    reg [15:0] rx_pbs_c包養合約nt;
    reg [15:0] tx_pbs_cnt;

//————————- rx cnt————————     
    always @ (長期包養posedge sys_clk or negedge sys_rst_n)
     if(!sys_包養留言板rst_n)
         rx_pbs_cnt      else if(rx_pbs_cnt == BPS_CNT – 1 b1)
         rx_pbs_cnt      else if(rx_bps_en)
         rx_pbs_cnt      else
         rx_pbs_cnt          
//————————- tx cnt———————–包養女人–           
    always @ (posedge sys_clk or negedge sys_rst_n)
     if(!sys_rst_n)
         begin
         tx_pbs_cnt          end
     else if(tx_pbs_cnt == BPS_CNT)
         tx_pbs_cnt      else if(tx_bps_en)
         tx_pbs_cnt      else
         tx_pbs_cnt          
    assign rx_bps_vld = (rx_pbs_cnt == BPS_HALF_CNT) ? 1 b1 : 1 b0;
    assign tx_bps_vld = (tx_pbs_cnt == (BPS_CNT -1)) ? 1 b1 : 1 b0;
   
endmodule
     復制代碼
2、數據接受模塊
module rx_d包養違法ata
(
    input wire sys_clk,
    input wire sys_rst_n,
   
    input wire rx_pin,
   
    input wire rx_bps_vld,
    output reg rx_bps_en,
  包養管道 
    output reg rx_data_vld,
    output reg [7:0] rx_da包養網VIPta

);

//—————- parm ————————
 包養管道   localparam IDLE   = 4 h0;
    localparam START    = 4 h1;
    localparam DATA   = 4 h2;
    localparam CHECK    = 4 h4;
    localparam STOP         = 4 h8;
   
    reg [3:0]   cs;
    reg [3:0]   ns;     
//—————————————-     
    reg       rx_pin_dly;
    reg       rx_pin_dly1;
    reg [3:0]   data_cnt;
    reg [7:0]   rxdata;
   
//—————————————-
    always @ (posedge sys_clk or negedge sys_rst_n)
     if(!sys_rst_n)
         cs      else
         cs   包養甜心   
     
    always @ (*)
     begin
     ns = IDLE;
     case(cs)
    //—————-IDLE wait data———————
         IDLE:
 裴母看到自己幸福的兒媳,真的覺得老天爺確實在照顧她,不僅給了她一個好兒子,還給了她一個難得的好兒媳。很明顯,她           if(rx_pin_dly1 & !rx_pin_dly)
             ns = START;
            else
 甜心寶貝包養網            ns = 包養pttIDLE;
    //—————- start sig ————————
         START:
            if(rx_bps_vld && !rx_pin_dly1)
             ns = DATA;
            else if可當他看到新娘被抬在轎子的背上,婚宴的人一步一步抬著轎子朝他家走去,離家越來越近,他才明白這不是戲。 ,而且他(rx_bps_vld && rx_pin_dly1)
             ns = IDLE;
            else
             ns = START;
    //—————–data 8bit———————–
         DATA:
            if(data_cnt == 4 d7)
             ns = STOP;
            else
             ns = DATA;
    //—————— no use ———包養金額————-
         CHECK:
            if(rx_bps_vld)
             ns = STOP;
            else
             ns = CHECK;
    //—————————————-
    sd包養     STOP:
            if(rx_bps_vld)
             ns = IDLE;
            else
             ns = STOP;
             
         default:ns = IDLE;
     endcase
     end
   
//———————— buffer ———————————-     
   
    always @ (posedge sys_clk or negedge sys_rst_n)
     if(!sys_rst_n) begin
         rx_pin_dly               rx_pin_dly1         end else begin
         rx_pin_dly               rx包養網評價_pin_dly1      包養故事   end
   
//———————————————————-     
    always @ (posedge sys_clk or negedge sys_rst_n)
     if(!sys_rst_n)
         rx_bps_en      else if((ns == START)&(cs == IDLE))
         rx_bps_en      else if((ns == IDLE)&(cs == STOP))
         rx_bps_en      else
         rx_bps_en    
//———————————————————-     
    always @ (posedge sys_clk or negedge sys_rst_n)
     if(!sys_rst_n)
         data_cnt      else if(cs == IDLE)
         data_cnt      else if((cs == DATA)&&rx_bps_vld)
         data_cnt      else
         data_cnt          
//———————————————————-                 
    always @ (posedge sys_clk or negedge sys_rst_n)
     if(!sys_rst_n)
         rxdata      else if((cs == DATA) && rx_bps_vld) //dly
         rxdata[data_cn包養金額t]      else if(cs == IDLE)
         rxdata      else
         rxdata          
//———————————————————-     
    always @ (posedge sys_clk or negedge sys_rst_n)
     if(!sys_rst_n)       begin
         rx_data_vld          rx_data                 end else if((cs == STOP) && rx_bps_vld ) begin
         rx_data_vld          rx_data                 end else begin
         rx_data_vld          rx_data                 end
         
endmodule

復制代碼
3、發送模塊
module tx_data
(
    input   wire         sys_clk,
    input   wire         sys_rst_n,
   
    output wire         tx_pin,
    input   wire         tx_data_vld,
    input   wire    [7:0]   tx_data,
    input   wire         tx_bps_vld,
    output reg          tx_bps_en,
    output wire         tx_over
   
);

//————– localparam —————-

    localparam IDLE   = 4 h0;
    localp包養意思aram START    = 4 h1;
    localparam DATA   = 4 h2;
    localparam CHECK    = 4 h4;
    localparam STOP   = 4 h8;
   
    reg   [3 :0]     cs;
    reg   [3 :0]     ns;
   
    reg           tx_pin_buf;
    reg           empty_dly1;
   
    wire    [7 :0]     rd_data;
    reg           rd_en;
    wire            empty;
    reg   [3 :0]     tx_cnt;
    reg            [15:0]            stop_d短期包養elay_cnt;
   
    tx_fifo tx_fifo//512
    (
     .clock     ( sys_clk      ),
     .wrreq     ( tx_data_vld   ),
     .data      ( tx_data      ),
   
     .rdreq     ( rd_en       ),
     .q        ( rd_data      ),
     .empty     ( empty       )
    );
   
    always @ (posedge sys_clk or negedge sys_rst_n)
     if(!sys_rst_n) begin
         empty_dly1      end else begin
         empty_dly1      end     
   
    always @ (posedge sys_clk or negedge sys_rst_n)
     if(!sys_rst_n) begin
         tx_bps_en      end else if(!empty && empty_dly1) begin//negedge
         tx_bps_en      end else if(empty && (cs == STOP) && (ns == IDLE) )     begin
         tx_bps_en      end else begin
         tx_bps_en      end

//——————————————————–           
    always @ (posedge sys_clk or negedge sys_rst_n)
     if(!sys_rst_n)
         rd_en      else if((cs == IDLE) &&(ns == START))
         rd_en      else
         rd_en          
//********************************“小姐,你這麼早要去哪裡?”彩修上前看向她身後,狐疑的問道。***************************                 
    always @ (posedge sys_clk or negedge sys_rst_n)
     if(!sys_rst_n)
         cs      else
         cs
    always @ (*)
     begin
     ns = IDLE;
     case(cs)
     IDLE:
         if(tx_bps_en )
        “他們不敢!”    ns = START;
         else
            ns = IDLE;
     
     START:
         if(tx_bps_vld )
            ns = DATA;
         else
            ns = START;
   
     DATA:
         if((tx_cnt == 7) && tx_bps_vld)
            ns = CHECK;
         else
            ns = DATA;
         
     CHECK:
         if(tx_bps_vld)
            ns = STOP;
         else
            ns = CHECK;
   
     STOP:
     包養違法    if(tx_bps_vld)
            ns = IDLE;
         else
            ns = STOP;
     
     default:ns = IDLE;
     endcase
     end
                 
//——————————————————–     
    always @ (posedge sys_clk or negedge sys_rst_n)
     if(!sys_rst_n)
         tx_cnt      else if((cs == DATA) && tx_bps_vld)     
         tx_cnt      else if(cs == IDLE)
         tx_cnt      else
         tx_cnt //——————————————————–                           
    always @ (posedge sys_clk or negedge sys_rst_n)
     if(!sys_rst_n)     
         tx_pin_buf      else if(cs == START)
         tx_pin_buf      else if(cs == DATA)
         tx_pin_buf      else if(cs == CHECK)
         tx_pin_buf      else if(cs == STOP)
         tx_pin_buf      else
         tx_pin_buf                  
    assign     tx_pin = tx_pin_buf;
    assign     tx_over 包養條件= (empty && (cs == STOP) && (ns == IDLE) ) ? 1 b1 : 1 b0;
                 
endmodule
    復制代碼

• 《經由過程uart協定懂得作甚接口design作甚模塊化design(封裝)》含法式和錄像 1923


留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *