*******私信博主请加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的几种用法,咱们的代码有时候就会收获事半功倍的效果!
点赞加关注博主(ID:FPGA小飞)的博文,咱们一起学习、一起进步吧~