handelc中慎用signal类型变量

来源:互联网 发布:郴州干部网络培训 编辑:程序博客网 时间:2024/06/03 22:52

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