中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 利用狀態(tài)機(jī)的狀態(tài)機(jī)實現(xiàn)層次結(jié)構(gòu)化設(shè)計

        利用狀態(tài)機(jī)的狀態(tài)機(jī)實現(xiàn)層次結(jié)構(gòu)化設(shè)計

        作者: 時間:2017-10-13 來源:網(wǎng)絡(luò) 收藏

        練習(xí)九.利用的嵌套實現(xiàn)層次結(jié)構(gòu)化設(shè)計目的:1.運用主與子產(chǎn)生層次化的邏輯設(shè)計;
        ?。?在結(jié)構(gòu)化設(shè)計中靈活使用任務(wù)(task)結(jié)構(gòu)。
        在上一節(jié),我們學(xué)習(xí)了如何使用狀態(tài)機(jī)的實例。實際上,單個有限狀態(tài)機(jī)控制整個邏輯電路的運轉(zhuǎn)在實際設(shè)計中是不多見,往往是狀態(tài)機(jī)套用狀態(tài)機(jī),從而形成樹狀的控制核心。這一點也與我們提倡的層次化、結(jié)構(gòu)化的自頂而下的設(shè)計方法相符,下面我們就將提供一個這樣的示例以供大家學(xué)習(xí)。
        該例是一個簡化的EPROM的串行寫入器。事實上,它是一個EPROM讀寫器設(shè)計中實現(xiàn)寫功能的部分經(jīng)刪節(jié)得到的,去除了EPROM的啟動、結(jié)束和EPROM控制字的寫入等功能,只具備這樣一個雛形。工作的步驟是:1.地址的串行寫入;2.數(shù)據(jù)的串行寫入;3.給信號源應(yīng)答,信號源給出下一個操作對象;4.結(jié)束寫操作。通過移位令并行數(shù)據(jù)得以一位一位輸出。
        模塊源代碼:
        module wriTIng(reset,clk,address,data,sda,ack);
        input reset,clk;
        input[7:0] data,address;
        output sda,ack; //sda負(fù)責(zé)串行數(shù)據(jù)輸出;
                 //ack是一個對象操作完畢后,模塊給出的應(yīng)答信號。
        reg link_write; //link_write 決定何時輸出。
        reg[3:0] state; //主狀態(tài)機(jī)的狀態(tài)字。
        reg[4:0] sh8out_state; //從狀態(tài)機(jī)的狀態(tài)字。
        reg[7:0] sh8out_buf; //輸入數(shù)據(jù)緩沖。
        reg finish_F; //用以判斷是否處理完一個操作對象。
        reg ack;
        parameter
        idle=0,addr_write=1,data_write=2,stop_ack=3;
        parameter
        bit0=1,bit1=2,bit2=3,bit3=4,bit4=5,bit5=6,bit6=7,bit7=8;
        assign sda = link_write? sh8out_buf[7] : 1bz;
        always @(posedge clk)
        begin
        if(!reset) //復(fù)位。
        begin
        link_write= 0;
        state = idle;
        finish_F = 0;
        sh8out_state=idle;
        ack= 0;
        sh8out_buf=0;
        end
        else
        case(state)
        idle:
        begin
        link_write = 0;
        state = idle;
        finish_F = 0;
        sh8out_state=idle;
        ack= 0;
        sh8out_buf=address;
        state = addr_write;
        end
        addr_write: //地址的輸入。
        begin
        if(finish_F==0)
        begin shift8_out; end
        else
        begin
        sh8out_state = idle;
        sh8out_buf = data;
        state = data_write;
        finish_F = 0;
        end
        end
        data_write: //數(shù)據(jù)的寫入。
        begin
        if(finish_F==0)
        begin shift8_out; end
        else
        begin
        link_write = 0;
        state = stop_ack;
        finish_F = 0;
        ack = 1;
        end
        end
        stop_ack: //完成應(yīng)答。
        begin
        ack = 0;
        state = idle;
        end

        endcase
        end
        task shift8_out; //串行寫入。
        begin
        case(sh8out_state)
        idle:
        begin
        link_write = 1;
        sh8out_state = bit0;
        end
        bit0:
        begin
        link_write = 1;
        sh8out_state = bit1;
        sh8out_buf = sh8out_buf1;
        end
        bit1:
        begin
        sh8out_state=bit2;
        sh8out_buf=sh8out_buf1;
        end
        bit2:
        begin
        sh8out_state=bit3;
        sh8out_buf=sh8out_buf1;
        end
        bit3:
        begin
        sh8out_state=bit4;
        sh8out_buf=sh8out_buf1;
        end
        bit4:
        begin
        sh8out_state=bit5;
        sh8out_buf=sh8out_buf1;
        end

        bit5:
        begin
        sh8out_state=bit6;
        sh8out_buf=sh8out_buf1;
        end
        bit6:
        begin
        sh8out_state=bit7;
        sh8out_buf=sh8out_buf1;
        end
        bit7:
        begin
        link_write= 0;
        finish_F=finish_F+1;
        end

        endcase
        end
        endtask
        endmodule
        測試模塊源代碼:
        `TImescale 1ns/100ps
        `define clk_cycle 50
        module wriTIngTop;
        reg reset,clk;
        reg[7:0] data,address;
        wire ack,sda;
        always #`clk_cycle clk = ~clk;
        iniTIal
        begin
        clk=0;
        reset=1;
        data=0;
        address=0;
        #(2*`clk_cycle) reset=0;
        #(2*`clk_cycle) reset=1;
        #(100*`clk_cycle) $stop;
        end
        always @(posedge ack) //接收到應(yīng)答信號后,給出下一個處理對象。
        begin
        data=data+1;
        address=address+1;
        end
        writing writing(.reset(reset),.clk(clk),.data(data),
        .address(address),.ack(ack),.sda(sda));
        endmodule
        仿真波形:[[wysiwyg_imageupload:252:height=174,width=496]]
        練習(xí):仿照上例,編寫一個實現(xiàn)EPROM內(nèi)數(shù)據(jù)串行讀取的模塊。編寫測試模塊,給出仿真波形。

        本文引用地址:http://www.antipu.com.cn/article/201710/365682.htm


        關(guān)鍵詞: 狀態(tài)機(jī) FGPA

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉