搜索
bottom↓
回复: 5

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

[复制链接]

出0入0汤圆

发表于 2014-7-13 16:30:06 | 显示全部楼层 |阅读模式
今天周末,稍微总结了一下最近一段时间以来自己开发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, 杜汶泽)

出0入0汤圆

发表于 2014-7-13 22:57:10 | 显示全部楼层
赞一个,我基本翻书来整,没记过

出0入0汤圆

 楼主| 发表于 2014-7-13 23:27:57 | 显示全部楼层
lanliang714 发表于 2014-7-13 22:57
赞一个,我基本翻书来整,没记过

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

出0入0汤圆

发表于 2014-7-14 00:18:13 | 显示全部楼层
本帖最后由 全频阻塞干扰 于 2014-7-14 00:23 编辑
cxhy 发表于 2014-7-13 23:27
感觉论坛竟然比博客还冷清,挺失望的,,,呵呵


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

出0入0汤圆

 楼主| 发表于 2014-7-14 08:43:34 | 显示全部楼层
全频阻塞干扰 发表于 2014-7-14 00:18
周末的原因吧?
只用过generate for  孤陋寡闻了
谢谢分享呀

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

出0入211汤圆

发表于 2014-8-2 16:29:49 来自手机 | 显示全部楼层
我觉得楼主写的不错是正儿八经的总结,我看了受益,感谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表