我是靠谱客的博主 愉快期待,最近开发中收集的这篇文章主要介绍Verilog 之 generate语句块用法一、generate-for-复制模块二、generate-if-判断模块三、generate-case-判断模块,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
文章目录
- 一、generate-for-复制模块
- 二、generate-if-判断模块
- 三、generate-case-判断模块
genvar与generate是Verilog 2001才有的,功能非常强大,可以配合条件语句、分支语句等做一些有规律的例化或者赋值等操作,对于提高简洁代码很有帮助,同时也减少了人为的影响。
generate的主要功能就是对module,net,reg,parameter,assign,always,task,function等语句进行复制,这些语句可以包括 assign连续赋值语句、always语句、initial语句、模块实例引用的语句、门级实例引用语句等,genvar是generate语句中的一种变量类型。
generate语句有 generate-for,generate-if,generate-case三种语句。
一、generate-for-复制模块
generate_for主要用于复制模块
- 必须有genvar关键字定义for语句的变量。
- for语句的内容必须加begin和end(即使就一句)。
- for语句必须有个名字。
例1:assign语句实现
module test(bin,gray);
parameter SIZE=8;
output [SIZE-1:0] bin;
input [SIZE-1:0] gray;
genvar i; //genvar i;也可以定义到generate语句里面
generate
for(i=0;i<SIZE;i=i+1)
begin:bit
assign bin[i]=^gray[SIZE-1:i];
end
endgenerate
endmodule
//generate语句块等同于下面语句
assign bin[0]=^gray[SIZE-1:0];
assign bin[1]=^gray[SIZE-1:1];
assign bin[2]=^gray[SIZE-1:2];
assign bin[3]=^gray[SIZE-1:3];
assign bin[4]=^gray[SIZE-1:4];
assign bin[5]=^gray[SIZE-1:5];
assign bin[6]=^gray[SIZE-1:6];
assign bin[7]=^gray[SIZE-1:7];
例2:always语句实现
module for_test1(indata, t0, t1, t2, t3);
input [7:0] indata; //输入8位位宽indata
output [1:0] t0, t1, t2, t3; //输出2位位宽t0,t1,t2,t3;
reg [1:0] temp [3:0]; //定义位宽为2,深度为4的temp
genvar i;
generate for(i=0; i<4; i=i+1 )//generate for模块复制
begin : gfor_block
always @ (*)
temp[i] = indata [2*i+1:2*i]
end
endgenerate
assign t0 = temp[0]; //t0等于temp[0]
assign t1 = temp[1]; //t1等于temp[1]
assign t2 = temp[2]; //t2等于temp[2]
assign t3 = temp[3]; //t3等于temp[3]
endmodule
//generate语句块等同于下面语句
always @ (*)
temp[0] = indata[1:0];
always @ (*)
temp[1] = indata[3:2];
always @ (*)
temp[2] = indata[5:4];
always @ (*)
temp[3] = indata[7:6];
二、generate-if-判断模块
generate_if是根据模块的参数parameter来作为判断条件,(parameter必须是常量)来产生满足条件的电路。该结构可以在设计模块中有条件调用(调用又叫做实例引用)以下verilog结构:
- 模块;
- 用户定义原语,门级原语;
- 连续赋值语句;
- initial或always块;
module if_test(a, b, c, d);
input a, b, c; //输入信号a,b,c
output d; //输出信号d
localparam WIDE = 8; //参数模块,用于选择产生的电路
generate
if(WIDE <10) //当WIDE小于10,d等于abc相或
assign d = a | b | c;
else //当WIDE大于等于10,d等于abc相与
assign d = a & b & c;
endgenerate
endmodule
//等价于(参数parameter)条件判断
//当WIDE等于8时,d等于abc相或;当WIDE等于12时,d等于abc相与
三、generate-case-判断模块
generate_case与generate_if是一样的,都是根据模块的参数(必须是常量)作为条件判断,来生成满足条件的电路,不同的地方仅仅是改成使用case 的语法。case生成语句可以在设计模块中有条件调用(调用又叫做实例引用)以下verilog结构:
- 模块;
- 用户定义原语,门级原语;
- 连续赋值语句;
- initial或always块;
//case生成语句实现位加法器
module addr(co,sum,a0,a1,ci);
//参数定义
parameter N = 4 //默认总线位宽为4
input [N-1:0]a0,a1;
input ci;
output[N-1:0]sum;
output co;
//根据总线位宽,有条件地调用(实例引用)不同类型的加法器
//参数N在调用(实例引用)时可以重新定义,
//不同类型(位宽)的加法器根据不同的N来决定
generate
case(N)
//当N=1或N=2时分别选用位宽为1或者位宽为2的加法器
1:adder_1bit adder1(co,sum,a0,a1,ci);//实例1位加法器模块
2:adder_1bit adder1(co,sum,a0,a1,ci);//实例2位加法器模块
default:adder_cla #(N) adder3(co,sum,a0,a1,ci);//实例N位加法器模块
endcase
endgenerate
endmodule
最后
以上就是愉快期待为你收集整理的Verilog 之 generate语句块用法一、generate-for-复制模块二、generate-if-判断模块三、generate-case-判断模块的全部内容,希望文章能够帮你解决Verilog 之 generate语句块用法一、generate-for-复制模块二、generate-if-判断模块三、generate-case-判断模块所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复