handelc中慎用signal類型變量

        signal聲明的變量很特殊,只在被賦值的那個時鐘保持被賦的值,在其他時鐘會變回他的初始值。所以一般對於一些一直隨着時鐘CLK變化的變量,將之聲明爲signal類型的。

        但是對於一些並不隨着時鐘CLK變化的變量,比如是一些外部輸入的變量(比如模仿外部按鍵或開關輸入持續的0或1),類似的這些變量是不能聲明爲signal變量的,否則當你想讓該變量持續爲0或持續爲1時,往往達不到要求的效果。

 下面舉個例子:

  比如用Handelc寫了一個讀寫RAM的程序:

  讀ram:

unsigned int 1  we;

 readram(address,rdata)

{

   we=1;   //讀寫允許信號

   *rdata=ramdata_out;

}

  寫ram:

 writeram(address,wdata)

{

  we=0;

  ramdata_in=wdata;

}

void main(void)

{

     signal unsigned  rdata1,rdata2;   

     writeram(0,1);    //向地址0寫入1

     writeram(1,2);

     readram(0,&rdata1); //讀地址0的數據

     readram(0,&rdata2)

}

注:  程序中的we只能聲明爲 unsigned int類型的,而不能聲明爲signal類型,因爲該變量是一個外部輸入變量,它的值不是一直變化的。如果聲明爲signal類型,當進行讀操作時,當we被賦值爲1後的下一個時鐘會恢復爲初始值0,而不能持續爲1,這樣就不能正常產生讀申請信號,讀操作因此無法完成。同理,writeram(address,wdata)中的wdata也應是unsigned  int類型的。

         而程序中的rdata1和rdata2在有些情況下必須被聲明爲signal類型。比如操作的ram是sdram(即動態ram),動態ram的數據輸出可以一次讀取多個字節,當讀申請產生時,sdram會每隔一個clk輸出總線上就會輸出一個數據,而接收此數據的變量rdata如果聲明爲int類型讀出的數據就會出錯。這時必須聲明爲signal類型的。。。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章