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