<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > FPGA研發(fā)之道(23)-控制(上)

FPGA研發(fā)之道(23)-控制(上)

作者: 時(shí)間:2014-12-02 來(lái)源:網(wǎng)絡(luò ) 收藏

  本質(zhì)上說(shuō),的模塊設計就是將輸入轉化成想要得到的輸出結果。而除了某些簡(jiǎn)單模塊,即在當拍內完成,即將輸入進(jìn)行邏輯操作后,再輸出。(如簡(jiǎn)單加法器等)。其余大部分的設計需要通過(guò)時(shí)序邏輯和組合邏輯混合實(shí)現,時(shí)序邏輯帶來(lái)就是延遲起效的問(wèn)題,舉例說(shuō),如實(shí)現某個(gè)信號(start)起效后,接下來(lái)五個(gè)周期需要分別進(jìn)行五種操作,分別是op0,op1,op2,op3,op4 等等。如何進(jìn)行控制,這就是每個(gè)工程師要面對的問(wèn)題。

本文引用地址:http://dyxdggzs.com/article/266275.htm

  對于簡(jiǎn)單控制,分別可以采用計數和移位寄存器的方式來(lái)解決問(wèn)題。而對于較為復雜的控制,則需要設計來(lái)解決。下面將分別介紹

  : 對于上述操作來(lái)說(shuō),start起效后,可以通過(guò)計數實(shí)現,設置寄存器count[2:0],有效信號開(kāi)始時(shí)計數自加。 計數的方式帶來(lái)的問(wèn)題就是,計數從零開(kāi)始還是從1開(kāi)始,假如初始化為0,則從0-4狀態(tài)可以分別輸出op0,op1,op2,op3,op4,但是在無(wú)有效信號時(shí),計數會(huì )保持0,從而造成op0的輸出。 上述舉例雖然簡(jiǎn)單,但是確實(shí)很多初學(xué)者或者工程師在仿真時(shí)會(huì )經(jīng)常會(huì )犯的錯誤。從設計來(lái)說(shuō),計數需要考慮初始值對于輸出的影響。同樣計數帶來(lái)的另一個(gè)問(wèn)題就是,從零開(kāi)始的計數會(huì )導致設計與實(shí)際不一致,例如,一個(gè)信號9拍后拉低,但從零計數到8時(shí),已經(jīng)到9拍了(0-8),這種設計會(huì )導致命名count==8 與9拍存在不一致的現象。當然也可以從1計數到9,這樣狀態(tài)在count==9時(shí)觸發(fā)。這樣就會(huì )初始化需要復位寄存器為1。當然這個(gè)問(wèn)題大端和小端的爭斗一樣,沒(méi)有終點(diǎn)。一個(gè)設計中如果多種計數來(lái)驅動(dòng)計數的話(huà),就需要特別小心這個(gè)問(wèn)題計數。當然也可把問(wèn)題交給仿真器,仿真時(shí)根據波形調整,計數的狀態(tài)。

  移位寄存器:如采用移位寄存器,根據上述例子,則start信號有效后,設計5bit的移位寄存器flag[4:0]分別利用寄存器的某BIT來(lái)控制輸出,從而在每BIT有效時(shí),分別輸出op0,op1,op2,op3,op4。假設此種狀態(tài)較少,寄存器資源較為豐富,因此利用移位寄存器是一個(gè)不錯的注意。

  assign op4 = ( count == 3’b100) ;

  assign op4 = flag[4] ;

  比較上述兩種輸出,則可以看出,通過(guò)計數的方式占用輸出資源較多,而移位寄存器在此種應用下,占用邏輯就相對簡(jiǎn)單。(僅針對小規模的計數來(lái)說(shuō),對于超過(guò)16的計數,則使用更優(yōu))。另外,通過(guò)移位寄存器可以方便的進(jìn)行時(shí)序控制,不用糾結從零開(kāi)始還是從1開(kāi)始的問(wèn)題,在某些簡(jiǎn)單的處理下能夠達到更小的面積和更快的時(shí)序。

  對于復雜的控制,則,就是必須的。對于實(shí)現,其實(shí)并不需要那么多的設計的方法。主要就是兩個(gè)要點(diǎn)。(1)獨熱碼。(2)三段式。

  對于第一點(diǎn)來(lái)說(shuō),獨熱碼,因為FPGA內部寄存器資源較多,另外獨熱碼將會(huì )帶來(lái)額外的面積和時(shí)序優(yōu)化的好處。則以上述例子為例,增加狀態(tài)轉移的觸發(fā)信號,狀態(tài)轉移圖如下所示:

  

 

  狀態(tài)獨熱碼(也可以用define localparam)建議使用parameter或者localparam

  parameter idle == 6’b000001,

  op0_state == 6’b000010,

  op1_state == 6’b000100,

  op2_state == 6’b001000,

  op3_state == 6’b010000,

  op4_state == 6’b100000;

  三段式結構如下

  //(1)當前狀態(tài)

  always@(posedge sys_clk or negedge rst_n)

  if(!rst_n)

  cs_state <= idle;

  else

  cs_state <= ns_state;

  //(2)下一狀態(tài)的賦值

  always@(*)

  case(cs_state)

  idle : if(start)

  ns_state = op0_state;

  else

  ns_state = idle;

  op0_state :

  if(op0_over)

  ns_state = op1_state;

  else

  ns_state = op0_state;

  op1_state :

  if(op1_over)

  ns_state = op2_state;

  else

  ns_state = op1_state;

  op2_state :

  if(op2_over)

  ns_state = op3_state;

  else

  ns_state = op2_state;

  op3_state :

  if(op3_over)

  ns_state = op4_state;

  else

  ns_state = op3_state;

  op4_state :

  if(op4_over)

  ns_state = op4_state;

  else

  ns_state = idle;

  default ns_state = idle;

  endcase

  //(3)輸出狀態(tài)

  assign out1 = (cs_state == op0_state);

  always@(posedge sys_clk or negedge rst_n)

  if(!rst_n)

  out2_reg <= 1'b0;

  else if (cs_state == op2_state)

  out2_reg <= 1'b1;

  else

  out2_reg <= 1'b0;

  上述例子,介紹獨熱碼和三段式。三段式的好處不用說(shuō),就是邏輯清楚??梢钥闯鰋ut1輸出為組合輸出。out_2_reg為寄存輸出。那么獨熱碼在FPGA內部的優(yōu)勢又有哪些?

  (1)綜合后,邏輯簡(jiǎn)單

  例如assign out1 = (cs_state == op0_state); 綜合后的電路等同于

  assign out1= cs_state(0) ;//可以看出無(wú)邏輯消耗

  而 out2_reg 的電路等同于 將cs_state(2)寄存一拍,只需一個(gè)寄存器的消耗

  (2)時(shí)序優(yōu)化。

  從上述同樣得出結論,如果是使用某狀態(tài)cs_state(n)作為其他信號的輸入來(lái)說(shuō),其本身為寄存器信號,因此關(guān)鍵路徑就會(huì )減少一級??赡苓\行較快的頻率就會(huì )增加。如不是獨**,對比這兩條語(yǔ)句cs_state = 3 與cs_state(3) 一個(gè)是組合輸出,一個(gè)寄存器輸出。其不同也就是上述計數與移位寄存器的區別一致。

  那么一般狀態(tài)機會(huì )產(chǎn)生的錯誤會(huì )有哪些那?

  首先;就是狀態(tài)不全產(chǎn)生LATCH,前文已述,這是FPGA設計的大敵,解決這個(gè)問(wèn)題的方法可以通過(guò)所有分支都設定確定狀態(tài),如上例中。有沒(méi)有更簡(jiǎn)單的方式?

  其此:狀態(tài)機上述描述,并不直觀(guān)的顯現綜合后電路的描述,有沒(méi)有更直接的rtl的描述,一眼就能看出獨熱碼的特征和好處?

  最后:狀態(tài)機是一個(gè)較為成熟技術(shù),還會(huì )有哪些值得關(guān)注的地方?

  這些問(wèn)題,下節再述。



關(guān)鍵詞: FPGA 狀態(tài)機 計數器

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>