generate_case_for的使用

这里综合一下目前在网上看到generate、case和for组合应用时的使用注意事项。

1. generate case

条件生成语句中的generate case语句框架为:

//case条件必须为常量
generate
	case(const)
//...
	endcase
endgenerate

例子:

module generate_case #(
parameter SEL = 1
	)(
	output [3:0] out
    );
    generate
    	case(SEL)
    	1: begin
    		assign out = 4'b0001;
    	end
    	2: begin
    		assign out = 4'b0010;
    	end
    	3: begin
    		assign out = 4'b0100;
    	end
    	default: begin
    		assign out = 4'b0000;
    	end
    	endcase    	
    endgenerate
endmodule

1、因为generate不能写到always块里面(不管是单独用、和case还是和for组合),如果它内部又不含always块,那么它赋值只能用assign
1、如果generate它内部含always块,那么根据所含是组合或者时序逻辑选择不同赋值方式

2. generate for

2.1 generate的for不含always块

generate for的语句框架为:

genvar i;
generate
	for(i=a,i<b,i=i+1)   begin: name
//...
	end
endgenerate

格雷码转二进制的例子:
因为for不在always块中,赋值要采用assign,而且assign的执行没有先后,所以下面两种写法等效

 module gray2bin #(
	parameter N = 4
)(
	input [N-1:0] gray,
	output [N-1:0] bin
 
    );
	
	assign bin[N-1] = gray[N-1];
	
	genvar i;
	generate
	/* for(i = N-2; i >= 0; i = i - 1) begin: gray_2_bin     //第一种
		assign bin[i] = bin[i + 1] ^ gray[i];
	end */
	for(i = 0; i <= N-2; i = i + 1) begin: be				//第二种
		assign bin[i] = bin[i + 1] ^ gray[i];
	end
	endgenerate
endmodule 

2.2 generate的for含always的组合逻辑

module top_module( 
    input [7:0] in,
    output [7:0] out
);
    reg out;
    genvar i;
    generate
        for(i = 0; i < 8; i = i + 1) begin : bit_reverse
            always@(*) begin
                out[i] = in[7 - i]; 
            end
        end
        
    endgenerate
 
endmodule
///////////////////////////////////////////////等效
module top_module( 
    input [7:0] in,
    output [7:0] out
);
    reg [7:0] out;
    always@(*) begin: bit_reverse
        integer i;
        for(i = 0;i <8; i = i + 1) begin
            out[i] = in[7-i];
        end
    end
 
endmodule

2.3 generate的for含always的时序逻辑

module top_module(
	input sysclk,
	input [3:0] a,
	output [3:0] temp
);
	reg [3:0] temp = 0;
	genvar i;
	generate
for (i = 0; i < 4 ; i = i + 1) begin: timing_logic
    always @(posedge sysclk) begin
        temp[i] <= a[i];
    end
end
endgenerate
 
endmodule
///////////////////////////////////////////////等效
module top_module(
input sysclk,
input [3:0] a,
output [3:0] temp
);
reg [3:0] temp = 0;
 
 
 
always @(posedge sysclk) begin: timing_logic
integer i;
  for (i = 0; i < 4 ; i = i + 1) begin
    temp[i] <= a[i];
    end
end
 
 
endmodule

1、用在generate的循环中的标尺变量必须定义为genvar类型
2、for循环必须有begin_end,即使for只有一条循环语句
3、for循环必须有名字,那个name是自己定义的字符串

3. 不含generate的for

//组合逻辑
module top_module( 
    input [7:0] in,
    output [7:0] out
);
    reg [7:0] out;
    always@(*) begin: bit_reverse
        integer i;
        for(i = 0;i <8; i = i + 1) begin
            out[i] = in[7-i];
        end
    end
endmodule
//时序逻辑
module top_module(
input sysclk,
input [3:0] a,
output [3:0] temp
);

reg [3:0] temp = 0;
 
always @(posedge sysclk) begin: timing_logic
	integer i;
	for (i = 0; i < 4 ; i = i + 1) begin
    	temp[i] <= a[i];
    end
end
endmodule

1、变量i不在generate内,所以用integer定义
2、for循环必须有begin_end,即使for只有一条循环语句
3、always块必须有名字

展开阅读全文

Windows版YOLOv4目标检测实战:训练自己的数据集

04-26
©️2020 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值