久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8633|回復: 7
打印 上一主題 下一主題
收起左側

基于FPGA的串口接收設計全過程

  [復制鏈接]
跳轉到指定樓層
樓主
首先得說明一下,在下剛學FPGA,不知道多模塊怎么來寫,或是說有什么技巧,連小白也算不上,只是參考黑金代碼,以自己的理解,記錄編寫串口接收程序的過程,還望得到燒友指點。         引腳rx_Pin_In是接收上位機信號。由圖可見,當有數據的時候,它會拉低電平來提醒一句,“嗨,數據到了”。如果此時設置好了波特率,就可以開始數據接收工作。在接收完畢一幀數據后,恢復高電平。我們可對接收到的數據處理,并且可以等待加一個低電平的到來在進行此操作。現在我想實現的功能是上位機發送數據,串口接收后發給led,實現對led亮滅的控制。顯然,實現該功能需要倆個模塊,一個是實現數據的接收rx_control_module.v,另一個是實現對led的亮滅控制(led_Control_module.v。而數據接收需要三個條件:來了低電平信號,有匹配的波特率,還得對數據接收。所以我們需要三個模塊完成,一是檢測信號(rx_detect_module;)、二是波特率計數:rx_bps_module;、三是數據接收控制:rx_receive_module接下來,咱就拿出一張紙,畫畫看,串口接收在FPGA當中是怎樣工作的。
首先,先把那五個模塊及引腳rx_Pin_In寫上,接下來的一切動作都是由rx_Pin_In而起的。我們要接收數據肯定要先對信號(低電平)進行檢查,否則,怎么開始呢?故先關注rx_detect_module.v(信號檢測模塊),這里要實現數據的電平檢測,并不斷的發送給數據接收模塊。別的不管,先input rx_pin_in;再output L_sig(輸出低電平) ;。這個模塊的任務就完成了。
現由L_sig,信號傳給了數據接收控制模塊(rx_receive_module.v。按理說下面就該對這個模塊進行描述了。畢竟人家都不斷給咱信號了,咱不能不干活呀。但還真不能干,得設置波特率呀,沒有波特率還接收個毛線。所以走,設置波特率,然后跟他要個信號,就可以工作了,出發~
“歡迎光臨波特率計數模塊(rx_bps_module),在這里您將得到你想要的一切”
“給我個接收數據的信號就可以了。”
“好,請掏錢”
“納尼??!!,還要錢?”
“不給我錢(信號),我憑什么給你呢,想騙吃騙喝啊,滾~~
出門不能忘了帶錢啊,要不然人家不待見。回去拿錢吧。
PS:想讓人家工作,得給信號。起初還真的忘了
回到數據接收控制模塊(rx_receive_module.v),得弄個output bps_count;(波特率計數),相對應的在模塊中reg  bps_work;(波特率工作)。走,這回看他還咋不讓俺們進。
“歡迎光臨波特率計數模塊(rx_bps_module),在這里您將得到你想要的一切”
“給,input  bps_count;(波特率計數)”
“請問您要多少的波特率”
“9600吧”
“請告訴我詳細信息,馬上配置”
“晶振50MHZ,周期的中間取走,output BPS_CLK;(采集數據),9600 bps傳輸速度使一位數據的周期是1/9600 = 0.000104166667,以50MHZ時鐘頻率要得到上述的定時則需計數N = 0.000104166667 /(1/50M) = 5208,由于從零開始算起則為5207。中間取樣為2604”
這時,波特率計數模塊(rx_bps_module)先input bps_count;(波特率計數),再reg [12:0] BPS_Conut;(計數) BPS_Conut=5027時歸零,等于2604時讀出即output BPS_CLK;說白了,波特率設置就是個計數器。現在他配置好了,等咱需要的時候給他個信號他就工作,加工,并且給咱帶來了BPS_CLK,有它,咱可以就收數據了。
走,回數據接收控制模塊(rx_receive_module.v),在這個模塊主要就是對一幀一幀的數據度,這里采用case(i)來讀,首先,i=0的時候,若~L_sig=1,則bps_work=1;通知波特率計數模塊(rx_bps_module)工作,并i+1。i=1時,if(BPS_CLK)i<=i+1,就是起始位了,起始位忽略。在i=2~9時候是接收數據的。所以當 i=2~9時,只要來了波特率,咱就開始從rx_pin_in接收數據,就定義個  reg [7:0]rData;吧,接收數據。i=10的時候奇偶校驗位,i+1。i=11的時候,停止位。接收完了,波特率不用計數了,咱該收工了吧?不行不行絕對不行,波特率計數模塊(rx_bps_module.v)很靠譜,你不讓他停他一直工作,所以,bps_work=0;您停吧。
好了,接收工作咱干完了,剩下的就是把接收的數據發送給led_Control_module.v模塊,那什么時候發呢?當然是接收完就發啊,FPGA這么講效率,拖個毛線。所以,在i=12的時候,不僅要讓bps_work停止,還要讓led_Control_module.v接收數據,故reg led_begin =1,output led_Begin_work;現在告訴這個模塊要工作了。
但是!工作要干什么?
答:接收數據
好!不要忘了帶數據,故output RX_Data;
assign RX_Data = rData;
assign led_Begin_work = led_begin;
來到了led_Control_module.v(led燈控制模塊),因為led_Begin_work=1;傳輸數據。傳輸完了呢?即在i=13的時候led_begin=0。結束工作!好了完成了,哈哈。接收數據搞定了。



    一直在想,人家怎么從無到有建一個模塊的,我不知道,現在想先一個一個小模塊,再和在一起。先挑個軟柿子捏。
1、  rx_detect_module.v模塊,input rx_pin_in; output L_sig ;

2、  波特率模塊(rx_bps_module)也比較簡單,就它吧。
Input  bps_count;rx_receive_module模塊來的計數標志位
reg [12:0]  BPS_Conut;(計數) 2^13 = 8 192>5027,BPS_Conut=5027時歸零,等于2604時讀出即output BPS_CLK;

rx_receive_module.v模塊感覺挺復雜的,信號多,不好寫,就寫led_Control_module.v模塊吧。因為他就和rx_receive_module.v相關。
Input led_Begin_work
input RX_Data
Output led;
就差rx_receive_module想想它怎么寫:
Input  rx_pin_in(數據) L_Sig(低電平) BPS_CLK(波特率計滿)
Output  BPS_Conut,(波特率計數信號) led_Begin_work(開始信號)RX_Data(傳值)、

還有倆個模塊,勝利在望啊。
rx_control_module.v模塊。把那三個綜合一下,進的進,出的出,模塊之間的wire OK啦。

  1. module rx_receive_module(
  2.                                                                         clk,rst_n,
  3.                                                                         rx_Pin_In,L_Sig,BPS_CLK,
  4.                                                                         BPS_Conut,led_Begin_work,RX_Data
  5.                                                                 );
  6.                         
  7. input clk ;
  8. input rst_n;
  9. input rx_Pin_In;
  10. input L_Sig;
  11. input BPS_CLK;

  12. output BPS_Conut;
  13. output led_Begin_work;
  14. output [7:0] RX_Data;

  15. reg [3:0] i;
  16. reg [7:0] data;
  17. reg bps_Begin;
  18. reg led_Begin;

  19. always @(posedge clk or negedge rst_n)
  20.         if(!rst_n)
  21.                 begin
  22.                         i <= 4'd0;
  23.                         data <= 8'd0;
  24.                         bps_Begin <= 1'b0;
  25.                         led_Begin <= 1'b0;
  26.                 end
  27.         else
  28.         case(i)
  29.                 4'd0:
  30.                 if(!L_Sig)
  31.                 begin
  32.                         i <= i+1'b1;
  33.                         bps_Begin <= 1'b1;
  34.                 end
  35.                
  36.                 4'd1:
  37.                 if(BPS_CLK)
  38.                         i <= i+1'b1;
  39.                         
  40.                 4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8,4'd9:
  41.                 if(BPS_CLK)
  42.                 begin
  43.                         i <= i+1'b1;
  44.                         data[i-2] <= rx_Pin_In;
  45.                 end
  46.                
  47.                 4'd10:
  48.                 if(BPS_CLK)
  49.                         i = i+1'b1;
  50.                         
  51.                 4'd11:
  52.                 if(BPS_CLK)
  53.                         i= i +1'b1;
  54.                         
  55.                 4'd12:
  56.                 begin
  57.                         i <= i +1'b1;
  58.                         bps_Begin <= 1'b0;
  59.                         led_Begin <= 1'b1;
  60.                 end
  61.                
  62.                 4'd13:
  63.                 begin
  64.                         i <= 4'd0;
  65.                         led_Begin <= 1'b0;
  66.                 end
  67.         endcase
  68.         
  69. assign  BPS_Conut = bps_Begin;
  70. assign  led_Begin_work = led_Begin;
  71. assign  RX_Data = data;
  72.         
  73. endmodule
  74.         
  75.                         
  76.                
復制代碼



rx_module.rar

3.09 MB, 下載次數: 52, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:243298 發表于 2017-10-26 22:39 | 只看該作者
感謝樓主
回復

使用道具 舉報

板凳
ID:529463 發表于 2019-5-20 17:20 | 只看該作者
樓主的文件使用什么軟件打開的?
回復

使用道具 舉報

地板
ID:830571 發表于 2020-10-16 09:30 | 只看該作者
整體的介紹,講解的真心好
回復

使用道具 舉報

5#
ID:828188 發表于 2020-10-19 23:26 | 只看該作者
講的很接地,很棒
回復

使用道具 舉報

6#
ID:828188 發表于 2020-10-19 23:27 | 只看該作者
講的很接地,初學者能看懂一些了,學習了
回復

使用道具 舉報

7#
ID:872683 發表于 2021-4-26 22:00 | 只看該作者
講解的很好
回復

使用道具 舉報

8#
ID:105474 發表于 2021-4-28 17:10 | 只看該作者
不錯,我學習的時CPLD,多多交流
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 四虎黄色影院 | 国产一级片网站 | av黄色在线 | 欧美视频在线一区 | 国内精品偷拍 | 黄色一级视频网站 | 欧美精品一级片 | 一本一道久久a久久精品蜜桃 | 人人看人人干 | 精品免费观看 | 国产女人18毛片18精品 | 一区二区三区精品 | 日韩999| 视频一区二区三区在线观看 | 久久一区二区三区四区 | 成人欧美视频 | 午夜网站在线观看 | 色婷婷六月 | 欧美日韩久久久 | 免费在线a | 欧美激情一二三区 | 色草在线 | 成人日韩在线 | 国产三级做爰高清在线 | av日韩精品 | 国产一级视频在线观看 | 色婷婷网 | 国产精品成人免费精品自在线观看 | 欧美激情一区二区 | 99国产免费 | 久久日本 | 国产日韩一区二区三区 | 在线日韩欧美 | 青青久草| 韩国理论在线 | 亚洲精品18在线观看 | 午夜一区 | 亚洲va韩国va欧美va精品 | 99国产精品99久久久久久 | 一本色道久久综合亚洲精品酒店 | 亚洲欧美日韩成人 |