學習筆記:FPGA學習之generate語句的基本知識

一,爲什麼要學習generate?

在設計中,很多情況下,需要編寫很多結構相同而參數不同的賦值語句或者邏輯語句,如果參數量很大的情況下,原本的列舉就會顯得心有餘而力不足。c語言中常用for語句來解決此類問題,verilog則爲我們提供了generate語句。

二,generate的基本概念及語法

generate語句的最主要功能就是對module,reg,assign,always,task等語句或者模塊進行復制。

generate語句有generate_for,generate_if,generate_case三種語句。

1,generate_for語句

注意:

(1)必須使用genvar申明一個正整數變量,用做for循環的判斷。(genvar是generate語句中的一種變量類型,用在generate_for中聲明正整數變量)

(2)需要複製的語句必須寫到begin_end語句裏面。就算只有一句。

(3)begin_end需要有一個類似於模塊名的名字。

例1,利用generate_for來複制assign語句

module generate_for(
    input [7:0]data_in,
    output [1:0]t0,
    output [1:0]t1,
    output [1:0]t2,
    output [1:0]t3
);

wire [1:0]temp[3:0];//定義位寬爲2,深度爲4的temp

genvar i;
generate 
for(i=0;i<4;i=i+1)
    begin:gfor
        assign temp[i]=data_in[2*i+1:2*i];
    end
endgenerate

assign t0=temp[0];
assign t1=temp[1];
assign t2=temp[2];
assign t3=temp[3];

endmodule
`timescale 1ns/1ps
module tb;
reg [7:0]data_in;
wire [1:0]t0;
wire [1:0]t1;
wire [1:0]t2;
wire [1:0]t3;

initial 
begin
    data_in=8'd0;
    #200;
    data_in=8'b1100_0011;
    #200;
    data_in=8'b0011_1100;
    #300;    
end

generate_fro generate_inst(
    .data_in(data_in),
    .t0(t0),
    .t1(t1),
    .t2(t2),
    .t3(t3)
);

endmodule

2,generate_if語句

generate_for用於複製模塊,二generate_if則是根據模塊的參數(必須是常量)作爲條件判斷,來產生滿足條件的電路。相當於判斷語句。

module generate_if(
    input t0,
    input t1,
    input t2,
    output d
);

localparam S=6;

generate
    if(S<7)
        assign d=t0|t1|t2;
    else
        assign d=t0&t1&t2;
endgenerate

endmodule

                    

由上面我們可以看出模塊參數不同,選擇的電路就不相同。

3,generate_case語句

 generate_case其實和generate_if一樣,都是根據參數(都必須爲常量)作爲判斷條件,來產生滿足條件的電路,不同於使用了case語法而已。

module generate_case(
    input t0,
    input t1,
    input t2,
    output d
);

localparam S=8;

generate
    case(S)
        0:
            assign d=t0|t1|t2;
        1:
            assign d=t0&t1&t2;
        default:
            assign d=t0&t1|t2;
    endcase
endgenerate

endmodule

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章