我是靠谱客的博主 愉快期待,最近开发中收集的这篇文章主要介绍Verilog 之 generate语句块用法一、generate-for-复制模块二、generate-if-判断模块三、generate-case-判断模块,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 一、generate-for-复制模块
  • 二、generate-if-判断模块
  • 三、generate-case-判断模块

   genvar与generate是Verilog 2001才有的,功能非常强大,可以配合条件语句、分支语句等做一些有规律的例化或者赋值等操作,对于提高简洁代码很有帮助,同时也减少了人为的影响。
   generate的主要功能就是对module,net,reg,parameter,assign,always,task,function等语句进行复制,这些语句可以包括 assign连续赋值语句、always语句、initial语句、模块实例引用的语句、门级实例引用语句等,genvar是generate语句中的一种变量类型。
  generate语句有 generate-for,generate-if,generate-case三种语句。

一、generate-for-复制模块

  generate_for主要用于复制模块

  • 必须有genvar关键字定义for语句的变量。
  • for语句的内容必须加begin和end(即使就一句)。
  • for语句必须有个名字。

例1:assign语句实现

module test(bin,gray);
       parameter SIZE=8;
       output [SIZE-1:0] bin;
       input [SIZE-1:0] gray;
       
       genvar i; //genvar i;也可以定义到generate语句里面
       generate
              for(i=0;i<SIZE;i=i+1)
              begin:bit
                     assign bin[i]=^gray[SIZE-1:i];
              end
       endgenerate
endmodule      

//generate语句块等同于下面语句
  assign bin[0]=^gray[SIZE-1:0];
  assign bin[1]=^gray[SIZE-1:1];
  assign bin[2]=^gray[SIZE-1:2];
  assign bin[3]=^gray[SIZE-1:3];
  assign bin[4]=^gray[SIZE-1:4];
  assign bin[5]=^gray[SIZE-1:5];
  assign bin[6]=^gray[SIZE-1:6];
  assign bin[7]=^gray[SIZE-1:7];

例2:always语句实现

module for_test1(indata, t0, t1, t2, t3);
         input [7:0] indata;          //输入8位位宽indata
         output [1:0] t0, t1, t2, t3; //输出2位位宽t0,t1,t2,t3;                             
         reg [1:0] temp [3:0];        //定义位宽为2,深度为4的temp

         genvar i;                                               
         generate for(i=0; i<4; i=i+1 )//generate for模块复制
            begin : gfor_block       
                always @ (*)         
                    temp[i] = indata [2*i+1:2*i]
            end                      
         endgenerate                                              

        assign t0 = temp[0];            //t0等于temp[0]
        assign t1 = temp[1];            //t1等于temp[1]   
        assign t2 = temp[2];            //t2等于temp[2]
        assign t3 = temp[3];            //t3等于temp[3]

endmodule
//generate语句块等同于下面语句
always @ (*)
    temp[0] = indata[1:0];
always @ (*)
    temp[1] = indata[3:2];
always @ (*)
    temp[2] = indata[5:4];
always @ (*)
    temp[3] = indata[7:6];

二、generate-if-判断模块

  generate_if是根据模块的参数parameter来作为判断条件,(parameter必须是常量)来产生满足条件的电路。该结构可以在设计模块中有条件调用(调用又叫做实例引用)以下verilog结构:

  • 模块;
  • 用户定义原语,门级原语;
  • 连续赋值语句;
  • initial或always块;
module if_test(a,  b,  c,  d);
       input a, b, c;         //输入信号a,b,c
       output d;               //输出信号d
      
       localparam WIDE = 8;    //参数模块,用于选择产生的电路

       generate
          if(WIDE <10)        //当WIDE小于10,d等于abc相或
              assign  d   =   a | b | c;
          else                //当WIDE大于等于10,d等于abc相与
              assign  d   =   a & b & c;
       endgenerate

endmodule
//等价于(参数parameter)条件判断
//当WIDE等于8时,d等于abc相或;当WIDE等于12时,d等于abc相与

三、generate-case-判断模块

  generate_case与generate_if是一样的,都是根据模块的参数(必须是常量)作为条件判断,来生成满足条件的电路,不同的地方仅仅是改成使用case 的语法。case生成语句可以在设计模块中有条件调用(调用又叫做实例引用)以下verilog结构:

  • 模块;
  • 用户定义原语,门级原语;
  • 连续赋值语句;
  • initial或always块;
//case生成语句实现位加法器
module addr(co,sum,a0,a1,ci);

    //参数定义
    parameter  N = 4  //默认总线位宽为4

    input [N-1:0]a0,a1;
    input ci;
    output[N-1:0]sum;
    output co;
    //根据总线位宽,有条件地调用(实例引用)不同类型的加法器
    //参数N在调用(实例引用)时可以重新定义,
    //不同类型(位宽)的加法器根据不同的N来决定
    generate
        case(N) 
        //当N=1或N=2时分别选用位宽为1或者位宽为2的加法器
            1:adder_1bit   adder1(co,sum,a0,a1,ci);//实例1位加法器模块
            2:adder_1bit   adder1(co,sum,a0,a1,ci);//实例2位加法器模块
            default:adder_cla #(N)  adder3(co,sum,a0,a1,ci);//实例N位加法器模块
        endcase
    endgenerate

endmodule

最后

以上就是愉快期待为你收集整理的Verilog 之 generate语句块用法一、generate-for-复制模块二、generate-if-判断模块三、generate-case-判断模块的全部内容,希望文章能够帮你解决Verilog 之 generate语句块用法一、generate-for-复制模块二、generate-if-判断模块三、generate-case-判断模块所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部