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
赞一个,我基本翻书来整,没记过
感觉论坛竟然比博客还冷清,挺失望的,,,呵呵 本帖最后由 全频阻塞干扰 于 2014-7-14 00:23 编辑
cxhy 发表于 2014-7-13 23:27
感觉论坛竟然比博客还冷清,挺失望的,,,呵呵
周末的原因吧?
只用过generate for孤陋寡闻了
谢谢分享呀
PS:请教下博客地址 全频阻塞干扰 发表于 2014-7-14 00:18
周末的原因吧?
只用过generate for孤陋寡闻了
谢谢分享呀
不敢说请教,博客上没啥东西,就不献丑额 我觉得楼主写的不错是正儿八经的总结,我看了受益,感谢
页:
[1]