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

標(biāo)題: 基于FPGA的串口接收設(shè)計全過程 [打印本頁]

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



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

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

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

還有倆個模塊,勝利在望啊。
rx_control_module.v模塊。把那三個綜合一下,進(jìn)的進(jìn),出的出,模塊之間的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.                
復(fù)制代碼



rx_module.rar

3.09 MB, 下載次數(shù): 52, 下載積分: 黑幣 -5


作者: prettywarm    時間: 2017-10-26 22:39
感謝樓主
作者: sadasfasf    時間: 2019-5-20 17:20
樓主的文件使用什么軟件打開的?

作者: silverzzz    時間: 2020-10-16 09:30
整體的介紹,講解的真心好
作者: 1748736612    時間: 2020-10-19 23:26
講的很接地,很棒
作者: 1748736612    時間: 2020-10-19 23:27
講的很接地,初學(xué)者能看懂一些了,學(xué)習(xí)了
作者: 51heibai    時間: 2021-4-26 22:00
講解的很好
作者: gg_sockie    時間: 2021-4-28 17:10
不錯,我學(xué)習(xí)的時CPLD,多多交流




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 午夜视频在线免费观看 | 亚洲国产精品一区二区三区 | 性欧美8khd高清极品 | 亚洲精品资源 | 午夜天堂网 | 日韩在线不卡视频 | 欧美日韩精品一区 | 羞羞网站在线观看 | 亚洲在线视频观看 | 人人干人人看 | 欧美一级网站 | 欧美性猛交xxxx免费看久久久 | 国产高清在线观看 | 91手机看片 | 天天舔天天干 | 97在线播放 | 中文字幕在线观看第一页 | 激情五月激情综合网 | 国产精品久久久久久久久久辛辛 | 日韩一区二区三免费高清在线观看 | 日本成人免费 | 国产三级成人 | 一本一道久久a久久精品蜜桃 | 国产理论片 | 伊人网综合 | 欧美日韩国产在线播放 | 草逼视频免费看 | 少妇一级淫片aaaaaa | 特级西西444www大胆免费看 | 日韩精品成人 | aaa黄色片| 成人免费福利视频 | 国产精品国产精品国产专区不卡 | 欧美黄视频 | 欧美伦理一区二区 | 日韩在线精品视频 | 成人欧美一区二区三区黑人免费 | 婷婷丁香六月 | 在线观看91视频 | 欧美一级在线观看 | 91久久久久国产一区二区 |