|
今天周末,稍微总结了一下最近一段时间以来自己开发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 [SIZE-1:0] bin;
input [SIZE-1:0] gray;
reg [SIZE-1:0] bin;
genvar i; // genvar用于声明生成变量,生成变量只能用在生成块之间
generate
for(i=0; i<SIZE; i=i+1)
begin: bit
always @(gray[SIZE-1:i]) // fixed part select
bin[i] = ^gray[SIZE-1:i];
end
endgenerate
endmodule
等同于下面的语句
always @(gray[SIZE-1:0]) // fixed part select
bin[0] = ^gray[SIZE-1:0];
always @(gray[SIZE-1:1]) // fixed part select
bin[1] = ^gray[SIZE-1:1];
always @(gray[SIZE-1:2]) // fixed part select
bin[2] = ^gray[SIZE-1:2];
always @(gray[SIZE-1:3]) // fixed part select
bin[3] = ^gray[SIZE-1:3];
always @(gray[SIZE-1:4]) // fixed part select
bin[4] = ^gray[SIZE-1:4];
always @(gray[SIZE-1:5]) // fixed part select
bin[5] = ^gray[SIZE-1:5];
always @(gray[SIZE-1:6]) // fixed part select
bin[6] = ^gray[SIZE-1:6];
always @(gray[SIZE-1:7]) // fixed part select
bin[7] = ^gray[SIZE-1:7];
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
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|