cxhy 发表于 2014-7-13 16:30:06

FPGA开发经验之generate的用法以及条件编译

今天周末,稍微总结了一下最近一段时间以来自己开发FPGA时候遇到的问题,以及对收集到的资料进行一个汇总。



Generate-for
Generate-if
Generate-case


Generate-for 语句
① generate-for语句必须用genvar关键字定义for的索引变量
② for的内容必须用begin…end块包起来哪怕只有一句
③ begin…end块必须起个名字

例1
module gray2bin2 (bin, gray);
parameter SIZE = 8;          // this module is parameterizable
output bin;
input gray;
reg bin;

genvar i;      // genvar用于声明生成变量,生成变量只能用在生成块之间
generate
for(i=0; i<SIZE; i=i+1)
begin: bit
always @(gray)      // fixed part select
bin = ^gray;
end
endgenerate
endmodule
等同于下面的语句
always @(gray) // fixed part select
bin = ^gray;
always @(gray) // fixed part select
bin = ^gray;
always @(gray) // fixed part select
bin = ^gray;
always @(gray) // fixed part select
bin = ^gray;
always @(gray) // fixed part select
bin = ^gray;
always @(gray) // fixed part select
bin = ^gray;
always @(gray) // fixed part select
bin = ^gray;
always @(gray) // fixed part select
bin = ^gray;

generate-if语句 以及条件编译
所谓的条件编译就是在代码中指定其中一部分只有在设置了特定的标志以后,这一部分才会被编译

例1
module generate_if (a,b,c,y);
input a,b,c;
output y;
localparam SIZE = 12;   // 参数常量
generate
if (SIZE < 8)   
   assign y = a & b & c;
else if (SIZE == 8)
   assign y = a & b | c;
else
   assign y = a | b | c;   // 最后该语句生成电路
endgenerate
endmodule

条件编译
`ifdef宏名标识符
      程序段1
       `else
      程序段2
      `endif
其作用是当宏名被定义过(在此之前已经被`define定义过),则对程序段1进行编译,程序段2则被忽略;否则就编译程序段2。

module ifdef_test(out);
output out;
`define wow
`define nest_one
`define second_nest
`define nest_two
`ifdef wow
        initial $display("wow is defined");
        `ifdef nest_one
                initial $display("nest_one is defined");
                `ifdef nest_two
                        initial $display("nest_two is defined");
                `else
                        initial $display("nest_two is not defined");
                `endif
        `else
                initial $display("nest_one is not defined");
        `endif
`else
        initial $display("wow is not defined");
        `ifdef second_nest
                initial $display("second_nest is defined");
        `else
                initial $display("second_nest is not defined");
        `endif
`endif
Endmodule

Generate-case
Generate-case的使用方法和generate-if类似,仅仅采用的是case语句。
例1
generate
case(WIDTH)
1: adder_1bit x1(co, sum, a, b, ci);
// 1-bit adder implementation
2: adder_2bit x1(co, sum, a, b, ci);
// 2-bit adder implementation
default: adder_cla #(WIDTH) x1(co, sum, a, b, ci);
// others - carry look-ahead adder
endcase
// The generated instance name is x1
endgenerate

lanliang714 发表于 2014-7-13 22:57:10

赞一个,我基本翻书来整,没记过

cxhy 发表于 2014-7-13 23:27:57

lanliang714 发表于 2014-7-13 22:57
赞一个,我基本翻书来整,没记过

感觉论坛竟然比博客还冷清,挺失望的,,,呵呵

全频阻塞干扰 发表于 2014-7-14 00:18:13

本帖最后由 全频阻塞干扰 于 2014-7-14 00:23 编辑

cxhy 发表于 2014-7-13 23:27
感觉论坛竟然比博客还冷清,挺失望的,,,呵呵

周末的原因吧?
只用过generate for孤陋寡闻了
谢谢分享呀
PS:请教下博客地址

cxhy 发表于 2014-7-14 08:43:34

全频阻塞干扰 发表于 2014-7-14 00:18
周末的原因吧?
只用过generate for孤陋寡闻了
谢谢分享呀


不敢说请教,博客上没啥东西,就不献丑额

hushaoxin 发表于 2014-8-2 16:29:49

我觉得楼主写的不错是正儿八经的总结,我看了受益,感谢
页: [1]
查看完整版本: FPGA开发经验之generate的用法以及条件编译