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類型的。。。