Verilog之generate语句块⽤法
⽂章⽬录
genvar与generate是Verilog 2001才有的,功能⾮常强⼤,可以配合条件语句、分⽀语句等做⼀些有规律的例化或者赋值等操作,对于提⾼简洁代码很有帮助,同时也减少了⼈为的影响。
generate的主要功能就是对module,net,reg,parameter,assign,always,task,function等语句进⾏复制,这些语句可以包括 assign连续赋值语句、always语句、initial语句、模块实例引⽤的语句、门级实例引⽤语句等,genvar是generate语句中的⼀种变量类型。
generate语句有 generate-for,generate-if,generate-ca三种语句。
⼀、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;
蟑螂花>我的一天作文600字初中el//当WIDE⼤于等于10,d等于abc相与
assign d = a & b & c;
endgenerate
endmodule
/
/等价于(参数parameter)条件判断
//当WIDE等于8时,d等于abc相或;当WIDE等于12时,d等于abc相与
三、generate-ca-判断模块
generate_ca与generate_if是⼀样的,都是根据模块的参数(必须是常量)作为条件判断,来⽣成满⾜条件的电路,不同的地⽅仅仅是改成使⽤ca 的语法。ca⽣成语句可以在设计模块中有条件调⽤(调⽤⼜叫做实例引⽤)以下verilog结构:
模块;
⽤户定义原语,门级原语;
连续赋值语句;
initial或always块;
//ca⽣成语句实现位加法器
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
ca(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位加法器模块 endca
endgenerate
endmodule