99在线精品免费视频九九视-99在线精品视频-99在线精品视频免费观里-99在线精品视频在线观看-99在线免费播放



官方論壇
官方淘寶
官方博客
微信公眾號(hào)
點(diǎn)擊聯(lián)系吳工 點(diǎn)擊聯(lián)系周老師

【文章】USB3.0數(shù)據(jù)通信設(shè)計(jì)

發(fā)布時(shí)間:2021-06-24   作者:admin 瀏覽量:

        

作為一個(gè)即將畢業(yè)但由于疫情不能回校的研三學(xué)生的獨(dú)白。。。。。。


真正和FPGA打交道應(yīng)該是剛讀研一的時(shí)候,不知道市場(chǎng)上什么資料好,可能和剛開始學(xué)習(xí)FPGA的同學(xué)們一樣,主要心態(tài)是想快速掌握這門技術(shù),經(jīng)過一番調(diào)查選擇了潘老師的《手把手教你學(xué)FPGA設(shè)計(jì)》,終于被大道至簡的至簡設(shè)計(jì)法所打敗了。


一、為什么大道至簡好用且方便


由于《手把手教你學(xué)FPGA設(shè)計(jì)》書中講解詳細(xì)且區(qū)域劃分鮮明,至簡設(shè)計(jì)法最大特點(diǎn)2個(gè),設(shè)計(jì)模板化和思考步驟化。


設(shè)計(jì)模板化:

在設(shè)計(jì)上明德?lián)P把一些功能模板規(guī)范成可復(fù)用的模板,我們只需要填入?yún)?shù)就能把設(shè)計(jì)做出來,極大地減少代碼上不必要的錯(cuò)誤,我們只需要專心做好設(shè)計(jì); 


思考步驟化:

至簡設(shè)計(jì)法能幫助我們形成嚴(yán)謹(jǐn)?shù)倪壿嬎季S,做到設(shè)計(jì)有根據(jù)、思考有步驟。 


過多贅述不必多說,就像潘老師所說過那樣,學(xué)好FPGA最重要就是狀態(tài)機(jī)和計(jì)數(shù)器,記住,這是重點(diǎn),要考的!!!

其實(shí)剛開始我沒認(rèn)為這兩項(xiàng)多么重要,哈哈哈,但是隨著工程代碼量的不斷增大以及對(duì)時(shí)序等要求的不斷增強(qiáng),愈發(fā)覺得基礎(chǔ)才能決定上層建筑。而反觀三段式或四段式狀態(tài)機(jī)代碼清晰,結(jié)構(gòu)分明,你所需要做的只是添磚加瓦,也就是你自己的狀態(tài),因?yàn)榈鼗呀?jīng)為你搭好了。再說計(jì)數(shù)器,應(yīng)該說沒有什么說的了,抬手就寫,因?yàn)榇a放在那了啊,只需要添加你的加一和結(jié)束條件就可以了啊!!!現(xiàn)在想想當(dāng)初的我為什么要特立獨(dú)行!!!導(dǎo)致在仿真階段浪費(fèi)好多時(shí)間。

二. USB3.0數(shù)據(jù)通信

        最近寫的代碼(也不是最近了,大約在過年回家之前)是關(guān)于USB3.0數(shù)據(jù)通信的,這里多說幾句,板子前期是購買的,后來自己設(shè)計(jì)的。代碼部分是賣家提供(具體名稱不方便透露,因?yàn)槲也皇翘羰碌娜耍钦娴氖撬拇a太繁瑣以及太不易搞懂且移植性太差了,但比較好的是我自己寫也不浪費(fèi)什么事情,我將USB3.0的狀態(tài)分為讀,寫,空閑三個(gè),然后根據(jù)三段式順利寫好屬于自己的代碼。源代碼在下面,哈哈哈,如果可以的話請(qǐng)不要亂發(fā)或者幫我打碼,畢竟畢業(yè)論文里還在用。并且家里電腦真的是什么軟件都沒安裝,我就用記事本復(fù)制過來的。

2.1. USB3.0控制模塊參考代碼

信號(hào)
類型
位寬
意義
clk
輸入
1
時(shí)鐘信號(hào)
pclk_in
輸入
1
USB芯片復(fù)位信號(hào)
rst_n
輸入
1
復(fù)位信號(hào),低電平有效
flag_a
輸入
1
USB芯片標(biāo)志位,控制寫狀態(tài)
flag_b
輸入
1
USB芯片標(biāo)志位,控制寫狀態(tài)
flag_c
輸入
1
USB芯片標(biāo)志位,控制讀狀態(tài)
flag_d
輸入
1
USB芯片標(biāo)志位,控制讀狀態(tài)
pclk
輸出
1
USB芯片復(fù)位信號(hào)
slcs
輸出
1
USB芯片片選信號(hào)
sloe
輸出
1
USB芯片控制信號(hào)
slrd
輸出
1
USB芯片讀狀態(tài)選擇信號(hào)
slwr
輸出
1
USB芯片寫狀態(tài)選擇信號(hào)
pktend
輸出
1
USB芯片數(shù)據(jù)包信號(hào)
fifo_addr
輸出
2
USB芯片數(shù)據(jù)讀取方向控制信號(hào)
usb_data
雙向
32
USB3.0數(shù)據(jù)
cmd_flag
輸出
1
USB傳輸數(shù)據(jù)標(biāo)志位
cmd_data
輸出
32
USB傳輸數(shù)據(jù)

module  USB_command(
        input                   clk  ,
        input                   pclk_in  ,
        input                   rst_n  ,
        //usb
        input                   flag_a  ,
        input                   flag_b  ,
        input                   flag_c  ,
        input                   flag_d  ,
output  wirepclk                            ,
output  wireslcs                            ,
output  reg             sloe                            ,
output  regslrd                            ,
output  regslwr                            ,
output  wirepktend                          ,
output  reg   [ 1: 0]   fifo_addr                       ,
inoutwire  [31: 0]   usb_data                        ,
output  regcmd_flag                        ,
output  wire  [31: 0]   cmd_data
                
                                
);
parameter   IDLE            =   4'b0001                         ;
parameter   WRITE           =   4'b0010                         ;
parameter   READ            =   4'b0100                         ;
reg   [ 3: 0]                 state_c /*synthesis preserve*/  ;
reg   [ 3: 0]                 state_n /*synthesis preserve*/  ;
//cnt
reg   [31: 0]                 cnt                             ;
wire                            add_cnt  ;
wire                            end_cnt  ;
reg   [15: 0]                 rd_cnt                          ;
reg   [15: 0]                 rd_data_len                     ;
regwr_trig                         ;//寫觸發(fā)
assign  slcs        =   1'b0;
assign  pclk        =   pclk_in;
assign  pktend      =   1'b1;
assign  usb_data    =   (!slwr) ? usb_write_data : 32'dz;
wire[31:0]  usb_write_data ;
//state_c
always@(posedgeclk or negedgerst_n)begin
    if(!rst_n)begin
state_c<= IDLE;
    end
    else begin
state_c<= state_n;
    end
end
//state_n
always@(*)begin
    case(state_c)
IDLE:begin
if(flag_a&&flag_b&&wr_trig)begin
state_n = WRITE;
            end
            else if(flag_c&&flag_d)begin
state_n = READ;                                        
            end
            else begin
state_n = state_c;                                        
            end
        end
WRITE:begin
            if(flag_b == 1'b0)begin //寫滿
state_n = IDLE;
            end
            else begin
state_n = state_c;
            end
        end
READ:begin
            if(flag_d == 1'b0)begin //讀空
state_n = IDLE;
            end
            else begin
state_n = state_c;
            end
        end
default:begin
state_n = IDLE;
        end
endcase
end
//fifo_addr
always  @(posedgeclk or negedgerst_n)begin
if(rst_n == 1'b0)begin
fifo_addr<=  2'b00;
        sloe        <=  1'b1;
    end
    else if(state_c==READ)begin
fifo_addr<=  2'b11;
        sloe        <=  1'b0;
    end
    else begin
fifo_addr<=  2'b00;
        sloe        <=  1'b1;
    end
end
//slwr 輸出信號(hào),用時(shí)序邏輯好點(diǎn)
always  @(posedgeclk or negedgerst_n)begin
if(rst_n == 1'b0)begin
slwr<=  1'b1;
    end
    else if(state_c==WRITE)begin
slwr<=  1'b0;
    end
    else begin
slwr<=  1'b1;
    end
end
//slrd
always  @(posedgeclk or negedgerst_n)begin
if(rst_n == 1'b0)begin
slrd<=  1'b1;
    end
    else if(state_c==READ)begin
slrd<=  1'b0;
    end
    else begin
slrd<=  1'b1;
    end
end
//rd_cnt
always  @(posedgeclk or negedgerst_n)begin
if(rst_n == 1'b0)begin
rd_cnt<=  16'd0;
    end
    else if(slrd)begin
rd_cnt<=  16'd0;
    end
    else begin
rd_cnt<=  rd_cnt + 1'b1;
    end
end
//rd_data_len
always  @(posedgeclk or negedgerst_n)begin
if(rst_n == 1'b0)begin
rd_data_len<=  16'd0;
    end
    else if(rd_cnt == 16'd3)begin
rd_data_len<=  usb_data + 16'd3;
    end
end
//cmd_flag
always  @(posedgeclk or negedgerst_n)begin
if(rst_n == 1'b0)begin
cmd_flag<=  1'b0;
    end
    else if(rd_cnt == 16'd3)begin
cmd_flag<=  1'b1;
    end
    else if(rd_cnt == rd_data_len)begin
cmd_flag<=  1'b0;
    end
end
assign  cmd_data   =   usb_data ;  //將cmd_flag與cmd_data配合使用                                   
//cnt
always @(posedgeclk or negedgerst_n)begin
    if(!rst_n)begin
cnt<= 0;
    end
    else if(add_cnt)begin
        if(end_cnt)
cnt<= 0;
        else
cnt<= cnt + 1;
    end
    else begin
cnt<= 0;
    end
end
assign  add_cnt     =       state_c==WRITE;      
assign  end_cnt     =       add_cnt&&cnt == 4096-1;   //測(cè)試用的計(jì)數(shù)數(shù)據(jù)
//wr_trig
always  @(posedgeclk or negedgerst_n)begin
if(rst_n == 1'b0)begin
wr_trig<=  1'b0;
    end
    else if(cmd_flag&&cmd_data == 32'h11111111)begin
wr_trig<=  1'b1;
    end
    //else if(slwr == 1'b0)begin //開始寫的時(shí)候,將wr_trig拉低   
      //  wr_trig<=  1'b0;
    //end
end
//fifo 讀請(qǐng)求
regfifo_rdeq;
always  @(posedgeclk or negedgerst_n)begin
if(rst_n == 1'b0)begin
fifo_rdeq<=  1'b0;                
    end
    else if(flag_a )begin                
                fifo_rdeq<=  1'b1;        
    end
    else fifo_rdeq<= 1'b1;
end
//fifo 寫請(qǐng)求
regfifo_wdeq;
always  @(posedgeclk or negedgerst_n)begin
if(rst_n == 1'b0)begin
fifo_wdeq<=  1'b0;
    end
    else if(flag_c)begin
fifo_wdeq<=  1'b1;
    end
    else fifo_wdeq<= 1'b1;
end
//FIFO
fifo        fifo_inst (        
        .clock (clk),
        .data ( cnt ),
        .rdreq ( fifo_rdeq ),
        .wrreq ( fifo_wdeq ),
        .q ( usb_write_data )
        );
Endmodule

2.2. 明德?lián)P的signaltap教程及仿真驗(yàn)證

       這里還得感謝明德?lián)P的signaltap教程,因?yàn)閁SB通信的數(shù)據(jù)線為32根,因此調(diào)試階段使用modelsim真的不太好用,所以根據(jù)明德?lián)P所講的signaltap教程,我很容易的實(shí)現(xiàn)了抓圖,分析出代碼問題,并且我自己的體會(huì),signaltap真的就像現(xiàn)實(shí)的示波器啊!!!好處自己去鉆研吧。下面是抓圖,通過抓圖分析數(shù)據(jù)簡直不要太快!!

三. 結(jié)論

       

無論是FPGA初學(xué)者,還是已經(jīng)工作的工程師,都推薦學(xué)習(xí)明德?lián)P的至簡設(shè)計(jì)法,一定會(huì)有大大的收獲。最后,祝福明德?lián)P越來越好,大道至簡,受益匪淺。愿桃李不言下自成蹊,終其教育,無外乎傳道授業(yè)解惑,古有孔丘弟三千,愿今師者百樹人。



   拓展閱讀
主站蜘蛛池模板: 一级片黄色的 | 久久中文字幕久久久久 | 日本免费黄色片 | 中文字幕日韩精品一区口 | 婷婷草 | 国产亚洲人成网站在线观看 | 黄色在线观看国产 | 日韩特级黄色片 | 全免费a级毛片免费看不卡 全免费a级毛片免费看视频免 | 视频在线观看一区二区三区 | 亚洲福利在线视频 | 国产福利区一区二在线观看 | 免费一级毛片一级毛片aa | 一区二区手机视频 | 97久久久久国产精品嫩草影院 | 亚洲免费色 | 国产农村乱色xxxx | 午夜视频色| 亚洲精品日韩在线一区 | 国产91色拍| 国内久久久久影院精品 | 欧美高清一区二区三区欧美 | 亚洲国产成人久久一区二区三区 | 免费看欧美一级特黄α大片 | 久久综合九色综合欧洲色 | 日韩一级精品视频在线观看 | 国产午夜a理论毛片在线影院 | 污污小视频在线观看 | 成熟自由日本语热亚洲人 | 日韩在线一区二区三区 | 免费高清a级毛片在线播放 免费高清小黄站在线观看 免费高清不卡毛片在线看 免费高清毛片 | 一区视频在线播放 | 97se亚洲综合在线韩国专区福利 | 原味小视频在线www国产 | 精品福利一区二区三区 | 国产剧情精品在线观看 | 国产在线观看麻豆91精品免费 | 视频一区二区不卡 | 国产国产人免费人成免费视频 | 中文字幕一区二区精品区 | 香蕉乱码成人久久天堂爱免费 |