日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 利用狀態(tài)機的狀態(tài)機實現(xiàn)層次結構化設計

          利用狀態(tài)機的狀態(tài)機實現(xiàn)層次結構化設計

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

          練習九.利用的嵌套實現(xiàn)層次結構化設計目的:1.運用主與子產(chǎn)生層次化的邏輯設計;
          ?。?在結構化設計中靈活使用任務(task)結構。
          在上一節(jié),我們學習了如何使用狀態(tài)機的實例。實際上,單個有限狀態(tài)機控制整個邏輯電路的運轉在實際設計中是不多見,往往是狀態(tài)機套用狀態(tài)機,從而形成樹狀的控制核心。這一點也與我們提倡的層次化、結構化的自頂而下的設計方法相符,下面我們就將提供一個這樣的示例以供大家學習。
          該例是一個簡化的EPROM的串行寫入器。事實上,它是一個EPROM讀寫器設計中實現(xiàn)寫功能的部分經(jīng)刪節(jié)得到的,去除了EPROM的啟動、結束和EPROM控制字的寫入等功能,只具備這樣一個雛形。工作的步驟是:1.地址的串行寫入;2.數(shù)據(jù)的串行寫入;3.給信號源應答,信號源給出下一個操作對象;4.結束寫操作。通過移位令并行數(shù)據(jù)得以一位一位輸出。
          模塊源代碼:
          module wriTIng(reset,clk,address,data,sda,ack);
          input reset,clk;
          input[7:0] data,address;
          output sda,ack; //sda負責串行數(shù)據(jù)輸出;
                   //ack是一個對象操作完畢后,模塊給出的應答信號。
          reg link_write; //link_write 決定何時輸出。
          reg[3:0] state; //主狀態(tài)機的狀態(tài)字。
          reg[4:0] sh8out_state; //從狀態(tài)機的狀態(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) //復位。
          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: //完成應答。
          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) //接收到應答信號后,給出下一個處理對象。
          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]]
          練習:仿照上例,編寫一個實現(xiàn)EPROM內(nèi)數(shù)據(jù)串行讀取的模塊。編寫測試模塊,給出仿真波形。

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


          關鍵詞: 狀態(tài)機 FGPA

          評論


          相關推薦

          技術專區(qū)

          關閉