您的位置:首页 > 其它

Verilog的generate的用法

2016-08-31 14:45 579 查看
生成语句可以动态的生成verilog代码,当对矢量中的多个位进行重复操作时,或者当进行多个模块的实例引用的重复操作时,或者根据参数的定义来确定程序中是否应该包含某段Verilog代码的时候,使用生成语句能大大简化程序的编写过程。

       生成语句生成的实例范围,关键字generate-endgenerate用来指定该范围。生成实例可以是以下的一个或多个类型:

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

       generate语句有generate-for,generate-if,generate-case三种语句。

generate-for语句

(1) 必须有genvar关键字定义for语句的变量。

(2)for语句的内容必须加begin和end(即使就一句)。

(3)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     

等同于下面语句

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:

generate

       genvar i;

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

       begin:shifter

              always@(pose
c029
dge clk)

                     shifter[i]<=(i==0)?din:shifter[i-1];

       end

endgenerate

相当于

always@(posedge clk)

       shifter[0]<=din;

always@(posedge clk)

       shifter[1]<=shifter[0];

always@(posedge clk)

       shifter[2]<=shifter[1];

.................

       ......................

always@(posedge clk)

       shifter[SIZE]<=shifter[SIZE-1];

generate-if,generate-case和generate-for语句类似。

转载自:http://lihaichuan.blog.51cto.com/498079/1118866
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  fpga Verilog