www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > EDA > 電子設(shè)計(jì)自動(dòng)化
[導(dǎo)讀]多狀態(tài)機(jī)的協(xié)同設(shè)計(jì)


作者Email:  zlyadvocate@163.com

    隨著微電子技術(shù)的迅速發(fā)展,人們對(duì)數(shù)字系統(tǒng)的需求也在提高[ 1 ]。不僅要有完善的功能,而且對(duì)速度也提出了很高的要求。對(duì)于大部分?jǐn)?shù)字系統(tǒng),都可以劃分為控制單元和數(shù)據(jù)單元兩個(gè)組成部分。通常,控制單元的主體是一個(gè)有限狀態(tài)機(jī) ,它接收外部信號(hào)以及數(shù)據(jù)單元產(chǎn)生的狀態(tài)信息,產(chǎn)生控制信號(hào)序列。有限狀態(tài)機(jī)設(shè)計(jì)的關(guān)鍵是如何把一個(gè)實(shí)際的時(shí)序邏輯關(guān)系抽象成一個(gè)時(shí)序邏輯函數(shù),傳統(tǒng)的電路圖輸入法通過直接設(shè)計(jì)寄存器組來實(shí)現(xiàn)各個(gè)狀態(tài)之間的轉(zhuǎn)換, 而用硬件描述語言來描述有限狀態(tài)機(jī), 往往是通過充分發(fā)揮硬件描述語言的抽象建模能力,通過對(duì)系統(tǒng)在系統(tǒng)級(jí)或寄存器傳輸級(jí)進(jìn)行描述來建立有限狀態(tài)機(jī)。EDA 工具的快速發(fā)展,使通過CAD快速設(shè)計(jì)有限狀態(tài)機(jī)自動(dòng)化成為可能。

    傳統(tǒng)上在系統(tǒng)級(jí)和寄存器傳輸級(jí)完成VHDL 的描述主要分以下幾步:

    (1) 分析控制器設(shè)計(jì)指標(biāo), 建立系統(tǒng)算法模型圖;
    (2) 分析被控對(duì)象的時(shí)序狀態(tài), 確定控制器有限狀態(tài)機(jī)的各個(gè)狀態(tài)及輸入.輸出條件;
    (3) 應(yīng)用VHDL 語言完成描述。

    使用XILINX的ISE6.1軟件包的輔助工具STATECAD能加速有限狀態(tài)機(jī)設(shè)計(jì),大大簡(jiǎn)化狀態(tài)機(jī)的設(shè)計(jì)過程,實(shí)現(xiàn)狀態(tài)機(jī)設(shè)計(jì)的自動(dòng)化。使用STATECAD進(jìn)行狀態(tài)機(jī)設(shè)計(jì)的流程如下:

    (1) 分析控制器設(shè)計(jì)指標(biāo), 建立系統(tǒng)算法模型圖;
    (2) 分析被控對(duì)象的時(shí)序狀態(tài), 確定控制器有限狀態(tài)機(jī)的各個(gè)狀態(tài)及輸入.輸出條件;
    (3) 在STATECAD中輸入有限狀態(tài)機(jī)狀態(tài)圖,自動(dòng)產(chǎn)生VHDL模型描述,使用STATEBENCH進(jìn)行狀態(tài)轉(zhuǎn)移分析,分析無誤后使用導(dǎo)出VHDL模型塊到ISE中進(jìn)行仿真后綜合,實(shí)現(xiàn)到CPLD或FPGA的映射。

    設(shè)計(jì)人員的主要工作在第一步。第二步,第三步基本上可以通過STATECAD完成有限狀態(tài)機(jī)的自動(dòng)生成和分析,還可以利用分析結(jié)果來對(duì)被控對(duì)象的邏輯進(jìn)行分析,改進(jìn),完善系統(tǒng)控制邏輯。

    在需要并行處理的場(chǎng)合,往往需要采用多狀態(tài)機(jī)來完成系統(tǒng)的控制任務(wù),這時(shí)狀態(tài)機(jī)之間的同步問題往往是設(shè)計(jì)者需要仔細(xì)考慮的問題。如果采用完全人工輸入代碼的方法來設(shè)計(jì),往往力不從心。采用STATECAD完成整個(gè)控制邏輯的設(shè)計(jì)并對(duì)設(shè)計(jì)結(jié)果進(jìn)行驗(yàn)證更能體現(xiàn)CAD設(shè)計(jì)方法的優(yōu)勢(shì),加速產(chǎn)品開發(fā)進(jìn)度,提高設(shè)計(jì)生產(chǎn)率。

    下面以一個(gè)雙狀態(tài)機(jī)設(shè)計(jì)過程來介紹如何使用STATECAD進(jìn)行多狀態(tài)機(jī)的協(xié)同設(shè)計(jì)。

    有二個(gè)狀態(tài)機(jī),一個(gè)負(fù)責(zé)對(duì)M0寫,一個(gè)負(fù)責(zé)對(duì)M0讀操作,為了簡(jiǎn)單起見,系統(tǒng)已經(jīng)盡量簡(jiǎn)化了。
    負(fù)責(zé)對(duì)M0寫的狀態(tài)機(jī)包括四個(gè)狀態(tài):
    STATE0:寫狀態(tài)機(jī)復(fù)位后初始化;
    write0:對(duì)M0寫,寫滿4個(gè)轉(zhuǎn)到m0full;
    m0full:M0滿狀態(tài);
    m0writewait:等待。M0滿時(shí)轉(zhuǎn)入write0狀態(tài)。
    負(fù)責(zé)對(duì)M0讀的狀態(tài)機(jī)包括四個(gè)狀態(tài):
    STATE1:讀狀態(tài)機(jī)復(fù)位后初始化
    read0:對(duì)M0讀,讀4個(gè)轉(zhuǎn)到m0empty
    m0empty:M0空狀態(tài)
    m0readwait:等待。M0空時(shí)轉(zhuǎn)入read0狀態(tài)

    負(fù)責(zé)對(duì)M0寫的狀態(tài)機(jī)必須知道M0是空的,而負(fù)責(zé)對(duì)M0讀的狀態(tài)機(jī)必須知道M0是滿的才能讀。讀完了通知負(fù)責(zé)對(duì)M0寫的狀態(tài)機(jī)M0是空的,可以寫了。二個(gè)狀態(tài)機(jī)同時(shí)并行工作。M0寫的狀態(tài)機(jī)在寫操作完了,就等待M0空。M0讀的狀態(tài)機(jī)在讀操作完了,就等待M0滿。在STATECAD中,狀態(tài)本身可以作為其他狀態(tài)機(jī)的轉(zhuǎn)移條件。這也正是在進(jìn)行多狀態(tài)機(jī)的協(xié)同設(shè)計(jì)中最需要的功能,能大大方便多狀態(tài)機(jī)的設(shè)計(jì)。

輸入完?duì)顟B(tài)圖,就基本完成了狀態(tài)機(jī)的設(shè)計(jì)過程。進(jìn)行邏輯優(yōu)化(工具自動(dòng)進(jìn)行邏輯優(yōu)化)后,使用STATEBENCH進(jìn)行狀態(tài)轉(zhuǎn)移分析。以下是自動(dòng)狀態(tài)轉(zhuǎn)移模擬波形。

由以上的波形看到狀態(tài)機(jī)的工作過程符合設(shè)計(jì)邏輯。對(duì)單獨(dú)的器件操作也許不需要采用多狀態(tài)機(jī)的設(shè)計(jì)方法,但在多器件需要并行工作時(shí),多狀態(tài)機(jī)的協(xié)同設(shè)計(jì)就顯得必要了。導(dǎo)出VHDL模型塊到ISE中進(jìn)行仿真后綜合,這里就不多講了,以下是產(chǎn)生的代碼:
--  D:XILINXTUTORIALDUOZTJI.vhd

LIBRARY ieee;
USE ieee.std_logic_1164.all;


LIBRARY ieee;
USE ieee.std_logic_unsigned.all;

ENTITY SHELL_DUOZTJI IS
 PORT (CLK,RESET: IN std_logic;
  dcounter0,dcounter1 : OUT std_logic);
 SIGNAL BP_dcounter0,BP_dcounter1,readcounter0,readcounter1: std_logic;
END;

ARCHITECTURE BEHAVIOR OF SHELL_DUOZTJI IS
 SIGNAL sreg : std_logic_vector (1 DOWNTO 0);
 SIGNAL next_sreg : std_logic_vector (1 DOWNTO 0);
 CONSTANT m0full : std_logic_vector (1 DOWNTO 0) :="00";
 CONSTANT m0writewait : std_logic_vector (1 DOWNTO 0) :="01";
 CONSTANT STATE0 : std_logic_vector (1 DOWNTO 0) :="10";
 CONSTANT write0 : std_logic_vector (1 DOWNTO 0) :="11";

 SIGNAL sreg1 : std_logic_vector (1 DOWNTO 0);
 SIGNAL next_sreg1 : std_logic_vector (1 DOWNTO 0);
 CONSTANT m0empty : std_logic_vector (1 DOWNTO 0) :="00";
 CONSTANT m0readwait : std_logic_vector (1 DOWNTO 0) :="01";
 CONSTANT read0 : std_logic_vector (1 DOWNTO 0) :="10";
 CONSTANT STATE1 : std_logic_vector (1 DOWNTO 0) :="11";

 SIGNAL next_BP_dcounter0,next_BP_dcounter1,next_readcounter0,
  next_readcounter1 : std_logic;
 SIGNAL BP_dcounter : std_logic_vector (1 DOWNTO 0);
 SIGNAL dcounter : std_logic_vector (1 DOWNTO 0);
 SIGNAL readcounter : std_logic_vector (1 DOWNTO 0);
BEGIN
 PROCESS (CLK, next_sreg, next_BP_dcounter1, next_BP_dcounter0)
 BEGIN
  IF CLK='1' AND CLK'event THEN
   sreg <= next_sreg;
   BP_dcounter1 <= next_BP_dcounter1;
   BP_dcounter0 <= next_BP_dcounter0;
  END IF;
 END PROCESS;

 PROCESS (CLK, next_sreg1, next_readcounter1, next_readcounter0)
 BEGIN
  IF CLK='1' AND CLK'event THEN
   sreg1 <= next_sreg1;
   readcounter1 <= next_readcounter1;
   readcounter0 <= next_readcounter0;
  END IF;
 END PROCESS;

 PROCESS (sreg,sreg1,BP_dcounter0,BP_dcounter1,readcounter0,readcounter1,
  RESET,BP_dcounter,readcounter)
 BEGIN
next_BP_dcounter0 <= BP_dcounter0;next_BP_dcounter1 <= BP_dcounter1;
next_readcounter0 <= readcounter0;next_readcounter1 <= readcounter1;
BP_dcounter <= (( std_logic_vector'(BP_dcounter1, BP_dcounter0)));
readcounter <= (( std_logic_vector'(readcounter1, readcounter0)));

next_sreg<=m0full;
next_sreg1<=m0empty;

IF ( RESET='1' ) THEN
 next_sreg<=STATE0;
 BP_dcounter <= (std_logic_vector'("00"));
ELSE
 CASE sreg IS
  WHEN m0full =>
   next_sreg<=m0writewait;
   BP_dcounter <= (( std_logic_vector'(BP_dcounter1, BP_dcounter0)));
  WHEN m0writewait =>
  IF (  (sreg1=m0empty)) THEN
   next_sreg<=write0;
   BP_dcounter <= (( std_logic_vector'(BP_dcounter1, BP_dcounter0)) +       std_logic_vector'("01"));
  ELSE
   next_sreg<=m0writewait;
   BP_dcounter <= (( std_logic_vector'(BP_dcounter1, BP_dcounter0)));
  END IF;
   WHEN STATE0 =>
   next_sreg<=write0;
   BP_dcounter <= (( std_logic_vector'(BP_dcounter1, BP_dcounter0)) +
      std_logic_vector'("01"));
  WHEN write0 =>
  IF ( BP_dcounter0='1' AND BP_dcounter1='1' ) THEN
   next_sreg<=m0full;
   BP_dcounter <= (std_logic_vector'("00"));
  ELSE
      next_sreg<=write0;
   BP_dcounter <= (( std_logic_vector'(BP_dcounter1, BP_dcounter0)) +
       std_logic_vector'("01"));
  END IF;
  WHEN OTHERS =>
   END CASE;
 END IF;

IF ( RESET='1' ) THEN
 next_sreg1<=STATE1;
 readcounter <= (std_logic_vector'("00"));
ELSE
CASE sreg1 IS
WHEN m0empty =>
 next_sreg1<=m0readwait;
 readcounter <= (( std_logic_vector'(readcounter1, readcounter0)));
WHEN m0readwait =>
 IF (  (sreg=m0full)) THEN
     next_sreg1<=read0;
 readcounter <= (( std_logic_vector'(readcounter1, readcounter0)) +
       std_logic_vector'("01"));
  ELSE
  next_sreg1<=m0readwait;
  readcounter <= (( std_logic_vector'(readcounter1, readcounter0)));
  END IF;
WHEN read0 =>
 IF ( readcounter0='1' AND readcounter1='1' ) THEN
  next_sreg1<=m0empty;
  readcounter <= (std_logic_vector'("00"));
 ELSE
  next_sreg1<=read0;
  readcounter <= (( std_logic_vector'(readcounter1, readcounter0)) +
       std_logic_vector'("01"));
 END IF;
WHEN STATE1 =>
 IF (  (sreg=m0full)) THEN
  next_sreg1<=read0;
  readcounter <= (( std_logic_vector'(readcounter1, readcounter0)) + std_logic_vector'("01"));
 ELSE
  next_sreg1<=STATE1;
  readcounter <= (( std_logic_vector'(readcounter1, readcounter0)));
 END IF;
WHEN OTHERS =>
  END CASE;
END IF;

next_BP_dcounter1 <= BP_dcounter(1);
  next_BP_dcounter0 <= BP_dcounter(0);
  next_readcounter1 <= readcounter(1);
  next_readcounter0 <= readcounter(0);
 END PROCESS;

 PROCESS (BP_dcounter0,BP_dcounter1,dcounter)
 BEGIN
  dcounter <= (( std_logic_vector'(BP_dcounter1, BP_dcounter0)));
  dcounter0 <= dcounter(0);
  dcounter1 <= dcounter(1);
 END PROCESS;
END BEHAVIOR;

LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY ieee;
USE ieee.std_logic_unsigned.all;

ENTITY DUOZTJI IS
 PORT (dcounter : OUT std_logic_vector (1 DOWNTO 0);
  CLK,RESET: IN std_logic);
END;

ARCHITECTURE BEHAVIOR OF DUOZTJI IS
 COMPONENT SHELL_DUOZTJI
  PORT (CLK,RESET: IN std_logic;
   dcounter0,dcounter1 : OUT std_logic);
 END COMPONENT;
BEGIN
 SHELL1_DUOZTJI : SHELL_DUOZTJI PORT MAP (CLK=>CLK,RESET=>RESET,dcounter0=>
  dcounter(0),dcounter1=>dcounter(1));
END BEHAVIOR;

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉