zoukankan      html  css  js  c++  java
  • Verilog学习笔记基本语法篇(七)········ 生成块

    生成块可以动态的生成Verilog代码。可以用于对矢量中的多个位进行重复操作、多个模块的实例引用的重复操作、根据参数确定程序中是否包含某段代码。生成语句可以控制变量的声明、任务和函数的调用、还能对实例引用进行全面的控制。在编程时,应用关键字generate_endgenerate来说明生成的实例范围。

    生成实例可以是一下的以下一种或多种类型:

    1)模块 ;  2)用户定语原语 ; 3)门级原语 ;  4)连续赋值语句;   5)initial 和 always 块。

    生成实例中语序的数据类型:

    1)wire型 reg型;

    2)integer型,real型,time型,realtime型;

    3)event型。

    生成的数据、实例、任务、函数都具有唯一的标识名,可以被层次引用。(任务和函数的声明可以出现在生成范围之中,但是不能出现在循环过程当中)

    不允许出现在生成范围之中的模块项声明:

    1)参数、局部参数;

    2)输入、输出、输入/输出声明;

    3)指定块。

    在Verilog中有三种常见生成语句的方法:

    1)循环生成;   2)条件生成;  4)case生成。

    A)循环生成语句

     循环生成语句允许使用者对下面的模块或模块项进行多次的实例引用;

    1)变量声明;    2)模块;    3)用户定义原语、门级原语;  4)连续赋值语句;   5)initial 和 always 块。

    例:用循环生成语句描述的脉动加法器

    //本地生成一个门级脉动加法器

    module ripple_adder(co,sum,a0,a1,ci);

    parameter   N=4;

    output  [N-1,0]   sum;

    output  co;

    input    [N-1,0] a0,a1;

    input    ci;

    wire  [N-1,0] carry        //本地线网生成语句

    assign   carry[0] = ci;   //指定进位变量的第0位等于进位的输入

    genvar i ;                    //声明临时变量,该变量只用于生成块的循环中,在确定的仿真代码中是不存在的。

    generate  

       for( i=0; i<N; i=i+1)  

         begin:r_loop

          wire t1,t2,t3;

           xor  g1(t1, a0[i], a1[i]);

           xor  g2(sum[i], t1, carry[i]);

           and  g3(t2, a0[i], a1[i])

           and  g4(t3, t1, carry[i])

           or    g5(carry[i=1], t2, t3)

        end

    endgenerate

    //根据上面的循环生成,Verilog编译器会自动生成以下相对层次实例名

    //xor: r_loop[0].g1, r_loop[1].g1, r_loop[2].g1, r_loop[3].g1;

    //       r_loop[0].g2, r_loop[1].g2, r_loop[2].g2, r_loop[3].g2;

    //and:r_loop[0].g3, r_loop[1].g3, r_loop[2].g3, r_loop[3].g3;

    //       r_loop[0].g4, r_loop[1].g4, r_loop[2].g4, r_loop[3].g4;

    //or :  r_loop[0].g5, r_loop[1].g5, r_loop[2].g5, r_loop[3].g5;

    //根据上面的生成实例用下面这些线网连接起来

    //Nets:r_loop[0].t1, r_loop[0].t2, r_loop[0].t3;

    //         r_loop[1].t1, r_loop[1].t2, r_loop[1].t3; 

    //         r_loop[2].t1, r_loop[2].t2, r_loop[2].t3; 

    //         r_loop[3].t1, r_loop[3].t2, r_loop[3].t3;

    assign  co=carry[N];

    endmodule

    B)条件生成语句     

    条件生成语句类似于 if_else_if 的生成构造,该结构可以在设计模块中根据经过仔细推敲并确定表达式,有条件的调用以下结构:

    1)模块;  2)用于定义的原语,门级原语;  3)连续赋值语句;  4)initial 或always 块。

    C)case生成语句 

    case生成语句可以调用以下的结构:

    1)模块;  2)用于定义的原语,门级原语;   3)连续赋值语句;  4)initial 或 always块。

    由定义来看,在if 和 case的生成语句中,不能够声明变量。

  • 相关阅读:
    Pizza Pie Charts – 基于 Snap SVG 框架的响应式饼图
    超好玩!10款神奇的字符图案 & 词汇云生成工具
    『摄影欣赏』15幅迷人的来自世界各地的婴儿照片【组图】
    CSS 魔法系列:纯 CSS 绘制图形(各种形状的钻石)
    【特别推荐】10款唯美浪漫的婚礼 & 结婚纪念网站模板
    25款创新的 PSD 格式搜索框设计素材【免费下载】
    时尚前沿:15个创意的 3D 字体设计艺术作品欣赏
    Resumable.js – 基于 HTML5 File API 的文件上传
    经典设计:17个最有效的学习着陆页设计的例子
    图标集锦:10套免费的社交媒体 & 社交网站图标
  • 原文地址:https://www.cnblogs.com/SYoong/p/5858996.html
Copyright © 2011-2022 走看看