25,FPGA_Verilog基础篇:verilog之generate生成块

*******私信博主请加V:FPGA_GO*******

///

1,FPGA_Verilog基础篇:Verilog发展进程-优快云博客

2,FPGA_Verilog基础篇:理解Verilog的四值逻辑-优快云博客

3,FPGA_Verilog基础篇:Verilog中数值的表示-优快云博客

4,FPGA_Verilog基础篇:信号声明类型-优快云博客

5,FPGA_Verilog基础篇:模块的端口声明-优快云博客

6,FPGA_Verilog基础篇:verilog语言的操作符-优快云博客

7,FPGA_Verilog基础篇:verilog基本逻辑运算-优快云博客

8,FPGA_Verilog基础篇:verilog关系操作的逻辑运算实现-优快云博客

9,FPGA_Verilog基础篇:veriolg算术运算-优快云博客

10,FPGA_Verilog基础篇:verilog移位操作-优快云博客

11,FPGA_Verilog基础篇:关系操作符简介-优快云博客

12,FPGA_Verilog基础篇:拼接运算符简介-优快云博客

13,FPGA_Verilog基础篇:verilog数值的位宽扩展规则-优快云博客

14,FPGA_Verilog基础篇:verilog移位与拼接实现-优快云博客

15,FPGA_Verilog基础篇:verilog双向inout接口表示_fpga inout端口-优快云博客

16,FPGA_Verilog基础篇:verilog之锁存器和触发器-优快云博客

17,FPGA_Verilog基础篇:verilog之for循环-优快云博客

18,FPGA_Verilog基础篇:verilog之函数用法-优快云博客

19,FPGA_Verilog基础篇:verilog之任务用法-优快云博客

20,FPGA_Verilog基础篇:verilog之任务与函数用法比较-优快云博客

21,FPGA_Verilog基础篇:verilog之宏define介绍-优快云博客

22,FPGA_Verilog基础篇:verilog之条件编译指令介绍-优快云博客

23,FPGA_Verilog基础篇:verilog之参数parameter介绍-优快云博客

24,FPGA_Verilog基础篇:verilog之本地参数localparam-优快云博客

25,FPGA_Verilog基础篇:verilog之generate生成块-优快云博客

26,FPGA_Verilog基础篇:verilog之常数规则-优快云博客

27,FPGA_Verilog基础篇:verilog中整数运算的位宽和符号规则-优快云博客

28,FPGA_Verilog基础篇:verilog中的字符串表示-优快云博客

29,FPGA_Verilog基础篇:verilog中带整数的算术表达式分析-优快云博客

30(结束篇),FPGA_Verilog基础篇:verilog中的数值运算规则总结-优快云博客

///

博主在前面几篇博文介绍了函数、任务、宏定义以及参数这些可以用来简化、优化逻辑代码的概念。今天这篇博客介绍的就是简化电路之集大成者——生成块generate。生成块是综合软件里运行的代码,它辅助生成电路,但在电路里不会显式体现。我们一定要学会区别电路本身的verilog代码和这些辅助代码!

生成块的关键词是“generate”,一个生成块的结构框架如下:

generate

       operations

endgenerate

其中,“operations”是生成块的功能部分,用来描述实际有用的逻辑。

生成块的功能分为条件、case和循环三个类型,下面分别介绍:

1,条件

所谓条件,无非就是if-else这样的结构,其语法为:

generate

       if(condition)

              operations_1

       else

              operations_2

endgenerate

operations的内容可以是例化的模块、verilog门原语、assign赋值或者always/initial过程块。

条件例子:

'define HIGH_SPEED 150

module adder_4bits_genrerateif

              #(parameter CLOCK_FREQUENCY = 100)

              (

                     input [3:0] a,b,

                     input CLK,RST,

                     output [3:0] sum,

                     output c

              );

       generate

              if(CLOCK_FREQUENCY>'HIGH_SPEED)

                     begin

                            adder_4bits_pipeline ADDER_INST(

                                   .CLK(CLK),

                                   .RST(RST),

                                   .sum(sum),

                                   .c(c)

                            );

                     end

              else

                     begin

                            adder_4bits COM_INST(

                                   .CLK(CLK),

                                   .RST(RST),

                                   .sum(sum),

                                   .c(c)

                            );

                     end

       endgenerate

endmodule

2,case

就和if与case的关系一样,生成块里少不了case来搭配。其case的生成块语法如下:

generate

       case(constant_express)

              value_1:operation_1

              value_2:operation_2

              ……

              value_n:operation_n

              default:operation_default

       endcase

endgenerate

operation的内容和if是一样的,可以是例化的模块、verilog门原语、assign赋值或者always/initial过程块。

case例子:

'define HIGH_SPEED 150

module adder_4bits_genrerateif

              #(parameter CLOCK_FREQUENCY = 100)

              (

                     input [3:0] a,b,

                     input CLK,RST,

                     output [3:0] sum,

                     output c

              );

             

       parameter HIGH_CHIP = 0;     

      localparam HIGH_CLK = (CLOCK_FREQUENCY>'HIGH_SPEED)

       generate

              case({HIGH_CLK,HIGH_CHIP})

                     2'b11:begin

                            adder_4bits_pipeline ADDER_INST(

                            .CLK(CLK),

                            .RST(RST),

                            .sum(sum),

                            .c(c)

                            );

                     end

                     2'b10:begin

                            adder_4bits COM_INST(

                            .CLK(CLK),

                            .RST(RST),

                            .sum(sum),

                            .c(c)

                            );

                     end

                     2'b01:begin

                            adder_4bits_pipeline ADDER_INST(

                            .CLK(CLK),

                            .RST(RST),

                            .sum(sum),

                            .c(c)

                            );

                     end

                     2'b00:begin

                            adder_4bits COM_INST(

                            .CLK(CLK),

                            .RST(RST),

                            .sum(sum),

                            .c(c)

                            );

                     end

              endcase

       endgenerate

endmodule

3,循环

生产块的循环语法稍微复杂一些,我们先介绍其语法结构:

generate

       genvar genvar_variable;

       for(genvar_variable=start_value;loop_condition;circle_express)

              begin:instance_name

                     operations

              end

endgenerate

其中,“start_value”,“loop_condition”,“circle_express”具有和循环语句for一样的含义。“operations”是每次循环的操作,只能是变量声明、模块、verilog门原语、assign赋值或者always/initial过程块。“genvar”是生成的变量索引关键字,可以在generate语句里面声明,也可以在generate语句外面声明,但只能用于generate语句。最大的不同是操作一定要有“begin-end”括在内部,而且begin之后要有冒号“:”和“instance_name”这个所谓的生成索引的名字。下面举3个例子:

generate-for例子1:(assign赋值)

module gray2bin1#(parameter SIZE = 8)

       (

       output [SIZE-1:0] bin,

       input  [SIZE-1:0] gray,    

       );

       genvar i;

       generate

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

              begin:bit

                     assign bin[i] = ^gray[SIZE-1:i]

              end

       endgenerate 

endmodule

generate-for例子2:(always 过程块)

genvar i;

       generate

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

              begin:delay

                     if(!rst)

                            D[i]<=1'b0;

                     else

                            D[i]<=D[i-1];

              end

       endgenerate 

generate-for例子3:(模块调用)

genvar i;

generate

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

       begin:ADDER

              adder ADDER_INST(

                     .CLK(CLK),

                     .RST(RST),

                     .in(din[i]),

                     .out(dout[i])

                     );

       end

endgenerate 

按照上面给出的generate的几种用法,咱们的代码有时候就会收获事半功倍的效果!

点赞加关注博主(IDFPGA小飞)的博文,咱们一起学习、一起进步吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值