天天看點

【 Verilog HDL 】基本運算邏輯的Verilog HDL 模型

加法器

用 Verilog HDL 來描述加法器是相當容易的,隻需要把運算表達式寫出就可以了,見下例。

module add_4( X, Y, sum, C);
input [3 : 0] X, Y;
output [3: 0] sum;
output C;
assign {C, Sum } = X + Y;
endmodule      

而 16 位加法器隻需要擴大位數即可,見下例:

module add_16( X, Y, sum, C);

input [15 : 0] X, Y;
output [15 : 0] sum;
output C;

assign {C, Sum } = X + Y;

endmodule      

這樣設計的加法器在行為仿真時是沒有延時的。借助綜合器,可以根據以上 Verilog HDL源代碼自動将其綜合成典型的加法器電路結構。綜合器有許多選項可供設計者選擇,以便用來控制自動生成電路的性能。設計者可以考慮提高電路的速度,也可以考慮節省電路元件以減少電路占用矽片的面積。綜合器會自動根據選項為你挑選一種基本加法器的結構。

有的高性能綜合器還可以根據使用者對運算速度的要求插入流水線結構,來提高運算器的性能。可見在綜合工具的資源庫中存有許多種基本的電路結構,通過編譯系統的分析,自動為設計者選擇一種電路結構,随着綜合器的日益成熟它的功能将越來越強。然後設計者還需通過布局布線工具生成具有布線延遲的電路,再進行後仿真,便可知道該加法器的實際延時。根據實際的延遲便可以确定使用該運算邏輯的最高頻率。若需要重複使用該運算器,則需要在控制資料流動的狀态機中為其安排必要的時序。

乘法器

用 Verilog HDL 來描述乘法器是相當容易的,隻需要把運算表達式寫出就可以了,見下例。

module mult_4( X, Y, Product);

input [3 : 0] X, Y;
output [7 : 0] Product;

assign Product = X * Y;

endmodule      

而 8 位乘法器隻需要擴大位數即可,見下例:

module mult_8( X, Y, Product);
input [7 : 0] X, Y;
output [15 : 0] Product;

assign Product = X * Y;

endmodule      

這樣設計的乘法器在行為仿真時是沒有延時的。借助綜合器,可以根據以上 VerilogHDL 源代碼自動将其綜合成典型的乘法器電路結構。綜合器有許多選項可供設計者選擇,以便用來控制自動生成電路的性能。設計者可以考慮提高速度,也可以考慮節省電路元件以減少電路占用矽片的面積。綜合器會自動根據選項和限制檔案為你挑選一種基本乘法器的結構。有的高性能綜合器還可以根據使用者對運算速度的要求插入流水線結構,來提高運算器的性能。随着綜合工具的發展,其資源庫中将存有越來越多種類的基本電路結構,通過編譯系統的分析,自動為設計者選擇一種更符合設計者要求的電路結構。然後設計者通過布局布線工具生成具有布線延遲的電路,再進行後仿真,便可精确地知道該乘法器的實際延時。根據實際的延遲便可以确定使用該運算邏輯的最高頻率。若需要重複使用該運算器,便可以根據此資料在控制資料流動的狀态機中為其安排必要的時序。是以借助于硬體描述語言和綜合工具大大加快了計算邏輯電路設計的過程。

比較器

用 Verilog HDL 來設計 比較電路是很容易的。下面就是一個位數可以由使用者定義的比較電路子產品:

module compare_n ( X, Y, XGY, XSY, XEY);
input [width-1:0] X, Y;
output XGY, XSY, XEY;
reg XGY, XSY, XEY;
parameter width = 8;
always @ ( X or Y ) // 每當 X 或 Y 變化時
begin
    if ( X = = Y )
        XEY = 1; // 設定 X 等于 Y的信号為 1
    else XEY = 0;
    if (X > Y)
        XGY = 1; // 設定 X 大于 Y的信号為 1
    else XGY = 0;
    if (X < Y)
        XSY = 1; // 設定 X 小于 Y的信号為 1
    else XSY = 0;
end
endmodule      

綜合工具能自動把以上原代碼綜合成一個八位比較器。如果在執行個體引用時分别改變參數width 值為 16 和 32 綜合工具就能自動把以上原代碼分别綜合成 16 位和 32 位的比較器。

多路器

用 Verilog HDL 來設計多路選擇器電路是很容易的。下面就是帶使能控制信号的資料位寬可以由使用者定義的八路資料選擇器子產品:

module Mux_8( addr,in1, in2, in3, in4, in5, in6, in7, in8, Mout, nCS);

input [2:0] addr;
input [width-1] in1, in2, in3, in4, in5, in6, in7, in8;
output [width-1] Mout;
parameter width = 8;

always @ (addr or in1 or in2 or in3 or in4 or in5 or in6 or in7 or in8)
begin
    if (!ncs)
        case(addr)
        3’b000: Mout = in1;
        3’b001: Mout = in2;
        3’b010: Mout = in3;
        3’b011: Mout = in4;
        3’b100: Mout = in5;
        3’b101: Mout = in6;
        3’b110: Mout = in7;
        3’b111: Mout = in8;
        endcase
    else
        Mout = 0;
end

endmodule      

綜合工具能自動把以上原代碼綜合成一個資料位寬為 8 的八路選一資料多路器。如果在執行個體引用時分别改變參數 width 值為 16 和 32,綜合工具就能自動把以上原代碼分别綜合成資料寬度為 16 位和 32 位的八選一資料多路器。