原创 锁存器、触发器

2008-9-23 09:01 2668 3 3 分类: FPGA/CPLD
   锁存器是电平触发,触发器是边沿触发。

 

锁存器:

   推导出锁存器的一般规则是,如果变量未在always语句所有可能的执行过程中被赋值,就推导出锁存器。如果变量在if的所有分支中都被赋值则综合成组合逻辑。

   case、casez、casex可转成if、else形式。当case中不是所有情况都列举出或使用default语句时、在case语句前对case中赋值对象赋初值也可避免综合出锁存器。若不是以上各种情况且须综合成组合逻辑可以使用综合命令,如下:

例: always @ (Toggle)

       case (Toggle)                //synthesis full_case

          2'b01: NextToggle = 2'b10;

          2'b10: NextToggle = 2'b01;

       end case

    end module

上例中的//synthesis full_case 是综合命令,告知综合工具case中已是全部列举可能的情况,这样综合后无锁存器。(正常的case语句是有优先级的,先出现的优先级最高,若case中各分支是互斥时,综合成译码逻辑。当使用casex时用综合命令//synthesis parallel-case告知综合工具该casex是互斥的)。

 

触发器:

   沿控制的用触发器,且沿控制的赋值用非阻塞的方式“Zee<=A;”。

   当always中是沿敏感时,此always中有if……else if……且在这些if……else if中有多于1个对同一变量赋值时,这个变量很可能被综合成有异步置位或清零的触发器。

例: always @ (negedge Reset or negedge Set or negedge CLKA)

        if (!Reset)

           NextState<=12;

        else if (!Set)

           NextState<=5;

        else

           NextState<=CurrentState;

上例为异步赋值,最后一个else才是时钟控制,前两个不受时钟控制,综合时形成带异步清零或置位。(书中说“不提倡使用异步赋值”)使其同步化的方法是将always中的敏感变量表中只有时钟作为触发源则为同步,既always中的处理都是在时钟的控制下进行的。

 

触发器、锁存器优化:

例:   always @ (posedge clockA)

           case (PreserState)

              0:begin

                   PresetState<=1;

                   Zont<=4'b0100;

                end

              1:begin

                   PresetState<=0;

                   Zont<=4'b0001;

                end

           endcase

Zont的赋值在clockA的上升沿触发的always语句块中,所以Zont就被综合成四位触发器,太浪费资源,改为如下:

      always @ (posedge clockA)

            case (PresetState)

               0:PresetState<=1;

               1:PresetState<=0;

            endcase

       always @ (PresetState)

            case (PresetState)

               0:Zont=4'b0100;

               1:Zont=4'b0001;

            endcase

 

又例:     always @ (Probe or Count)

                if (Probe)

                   Luck="Count";

综合后因Probe为0时Luck保留原值,所以综合成锁存器。若要去掉锁存器可以改为

       always @ (Probe or Count)

         if (Probe)

            Luck="Count";

         else

            Luck="0";

      或

       always @ (Probe or Count)

       begin

          Luck="0";

          if (Probe)

             Luck="Count";

       end 
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条