[處理器芯片]-5 超標量CPU實現之ALU

ALU(Arithmetic Logic Unit,算術邏輯單元),是CPU執行單元中最主要的組成部分。

1 主要功能

算術運算:執行加法、減法、乘法和除法等算術運算。

邏輯運算:執行與、或、非、異或等邏輯運算。

移位運算:執行邏輯左移、邏輯右移、算術右移等移位運算。

比較運算:執行大小比較等比較運算。

超標量CPU中的加法器、減法器、乘法器、除法器和移位器在硬件實現中,依賴于組合邏輯和時序邏輯的設計。加法器通過基本的半加器和全加器實現,減法器利用二進制補碼和加法實現,移位器則通過簡單的位操作實現,乘法器可以采用Booth算法或陣列乘法器,除法器則通過順序減法和移位實現。通過這些基礎電路的優化和組合,超標量CPU能夠高效執行復雜的算術操作。

2 加法器(Adder)

加法器是用于執行二進制加法的基本電路。常見的加法器包括半加器、全加器和多位加法器(如行波進位加法器、先行進位加法器)。

1)半加器(Half Adder)

半加器用于兩個單比特的加法:輸入兩個單比特 `A` 和 `B`,輸出和 `Sum` 和進位 `Carry`

邏輯實現。

module HalfAdder(input A, B, output Sum, Carry);

????assign Sum = A ^ B; ??// 異或運算

????assign Carry = A & B; // 與運算

endmodule

2)全加器(Full Adder)

全加器用于兩個單比特和前一位進位的加法:輸入兩個單比特 `A` 和 `B`,前一位進位 `Cin`,輸出和 `Sum` 和進位 `Cout`。

邏輯實現

module FullAdder(input A, B, Cin, output Sum, Cout);

????assign Sum = A ^ B ^ Cin; ????????????// 異或運算

????assign Cout = (A & B) | (Cin & (A ^ B)); // 與或運算

endmodule

3)多位加法器(Ripple Carry Adder)

行波進位加法器是由多個全加器級聯而成:輸入兩個多比特二進制數 `A` 和 `B`,輸出和 `Sum` 和進位 `Cout`

邏輯實現

module RippleCarryAdder #(parameter WIDTH = 8)(input [WIDTH-1:0] A, B, output [WIDTH-1:0] Sum, output Cout);

????wire [WIDTH:0] Carry; // 進位鏈

????assign Carry[0] = 0;

????

????genvar i;

????generate

????????for (i = 0; i < WIDTH; i = i + 1) begin: add_bit

????????????FullAdder FA (.A(A[i]), .B(B[i]), .Cin(Carry[i]), .Sum(Sum[i]), .Cout(Carry[i+1]));

????????end

????endgenerate

????

????assign Cout = Carry[WIDTH];

endmodule

3 減法器(Subtractor)

減法可以通過加法實現,使用二進制補碼進行減法操作,即:`A - B` 可以表示為 `A + (~B + 1)`。

4位減法器邏輯實現

module Subtractor #(parameter WIDTH = 4)(input [WIDTH-1:0] A, B, output [WIDTH-1:0] Diff);

????wire [WIDTH-1:0] B_complement;

????assign B_complement = ~B + 1; // 計算B的補碼

????RippleCarryAdder #(WIDTH) RCA (.A(A), .B(B_complement), .Sum(Diff), .Cout());

endmodule

4 乘法器(Multiplier)

乘法器用于執行二進制乘法,現代乘法器通常由部分積生成器(Partial Product Generator)、部分積壓縮器(Partial Product Compressor)和最終加法器(Final Adder)構成。

工作原理

乘法運算單元是處理器中的關鍵組件之一,基本原理是將被乘數(Multiplicand)和乘數(Multiplier)分解成若干部分積(Partial Products),然后將這些部分積進行累加得到最終的乘積。乘法運算單元可以采用不同類型的乘法器,如布爾乘法器、串行乘法器、并行乘法器等,具體選擇取決于性能和面積的要求。

主要組件

3.1)部分積生成器

部分積生成器的任務是根據乘數的每一位生成對應的部分積。每一個部分積是被乘數與乘數某一位的乘積。

例如,對于 4 位乘數和被乘數:

- 乘數 `B`:\( B_3B_2B_1B_0 \)

- 被乘數 `A`:\( A_3A_2A_1A_0 \)

生成的部分積為:

- 第 0 位:`P_0 = B_0 * A`

- 第 1 位:`P_1 = B_1 * A << 1`

- 第 2 位:`P_2 = B_2 * A << 2`

- 第 3 位:`P_3 = B_3 * A << 3`

Booth 算法

Booth 算法進行乘法操作可以有效減少部分積生成的位數,從而減少計算量,其基本思想是利用乘數的位模式,將部分積中連續的1和0序列合并為一個更大的值或更小的值,以減少需要執行的加法和移位操作。

1)Booth 編碼:對乘數進行 Booth 編碼,將每兩位乘數轉換為一個 Booth 編碼值,可以是0、1或-1。

2)循環運算:從最低位開始,對每兩位乘數進行 Booth 編碼并執行相應的加法和移位操作,生成部分積的一部分。

3)部分積累加:每次循環產生的部分積通過累加器累加,最終得到完整的部分積。

實現示例

輸入:被乘數A = 1010 (十進制:10)

??????乘數B = 0110 (十進制:6)

Booth 編碼:0101 (十進制:5)

???????????1100 (十進制:-4)

循環運算:

1)A 的最低位為 0,保持部分積不變。

2)A 的第二低位為 1,部分積左移一位并加上 B。

???部分積:00000000

??????????+ 0110

??????????--------

??????????00000110

3)A 的第三低位為 1,部分積左移一位并加上 B。

???部分積:00000110

??????????+ 0110

??????????--------

??????????00010000 (此時部分積的低4位即為結果)

部分積 P = 0001 0000 (十進制:16)

基于Booth算法的乘法器邏輯實現

module BoothMultiplier #(parameter WIDTH = 4)(input [WIDTH-1:0] A, B, output [2*WIDTH-1:0] Product);

????reg [2*WIDTH-1:0] P;

????reg [WIDTH-1:0] Q;

????reg Q_1;

????integer i;

????always @(A or B) begin

????????P = 0;

????????Q = B;

????????Q_1 = 0;

????????for (i = 0; i < WIDTH; i = i + 1) begin

????????????case ({Q[0], Q_1})

????????????????2'b01: P = P + (A << i);

????????????????2'b10: P = P - (A << i);

????????????????default: ;

????????????endcase

????????????Q_1 = Q[0];

????????????Q = Q >> 1;

????????end

????end

????assign Product = P;

endmodule

3.2)部分積壓縮器

部分積壓縮器用于減少部分積的層數,將得到的部分積需要按權值錯位相加,以得到最終的乘積結果。這個過程通常通過樹型結構的加法器實現,可以采用Wallace樹、Dadda樹等,需要確保加法過程中的進位被正確傳遞。

Wallace 樹壓縮

Wallace樹是一種常見的部分積壓縮器,利用全加器和半加器將部分積逐層壓縮。

邏輯實現

module WallaceTree(input [3:0] A, input [3:0] B, output [7:0] Product);

????wire [15:0] partial_products;

????// 生成部分積

????assign partial_products[3:0] = A & {4{B[0]}};

????assign partial_products[7:4] = A & {4{B[1]}};

????assign partial_products[11:8] = A & {4{B[2]}};

????assign partial_products[15:12] = A & {4{B[3]}};

????// 聲明中間結果

????wire [7:0] sum1, sum2, sum3, carry1, carry2, carry3;

????// 第一級壓縮

????assign sum1 = {partial_products[3:1], 1'b0} + partial_products[7:4];

????assign carry1 = {4'b0, partial_products[11:8]} + {4'b0, partial_products[15:12]};

????// 第二級壓縮

????assign sum2 = {carry1[3:1], 1'b0} + sum1[7:4];

????assign carry2 = carry1[7:4] + sum1[3:0];

????// 最后一級壓縮

????assign sum3 = sum2 + carry2;

????assign carry3 = {carry2[3:1], 1'b0};

????// 最終加法

????assign Product = sum3 + carry3;

endmodule

3.3)最終加法器(Final Adder)

最終加法器用于將壓縮后的部分積進行累加,得到最終的乘積,常見的加法可以參照第一章節內容,包括行波進位加法器和先行進位加法器。

結果輸出,將最終的乘積結果存儲在結果寄存器中,以便后續的使用或傳輸。

邏輯實現

module FinalAdder(input [7:0] sum, input [7:0] carry, output [7:0] Product);

????assign Product = sum + carry;

endmodule

4位乘法器實現示例

module Multiplier4Bit(input [3:0] A, B, output [7:0] Product);

????wire [3:0] P0, P1, P2, P3;

????// 部分積生成

????assign P0 = B[0] ? A : 4'b0000;

????assign P1 = B[1] ? (A << 1) : 4'b0000;

????assign P2 = B[2] ? (A << 2) : 4'b0000;

????assign P3 = B[3] ? (A << 3) : 4'b0000;

????// 部分積壓縮(Wallace Tree)

????wire [7:0] sum1, sum2, sum3, carry1, carry2, carry3;

????assign {carry1, sum1} = {4'b0, P0} + {2'b0, P1, 2'b0};

????assign {carry2, sum2} = {4'b0, P2, 4'b0} + {4'b0, P3};

????assign {carry3, sum3} = sum1 + carry1;

????// 最終加法

????assign Product = sum3 + carry2;

endmodule

5 除法器(Divider)

除法器用于執行二進制除法。常見的方法包括恢復余數法和非恢復余數法。

恢復余數法:通過順序減法和移位實現:

邏輯實現

module RestoringDivider #(parameter WIDTH = 4)(input [WIDTH-1:0] Dividend, Divisor, output [WIDTH-1:0] Quotient, Remainder);

????reg [2*WIDTH-1:0] A, Q, M;

????integer i;

????always @(Dividend or Divisor) begin

????????A = 0;

????????Q = Dividend;

????????M = Divisor << WIDTH;

????????

????????for (i = 0; i < WIDTH; i = i + 1) begin

????????????A = (A << 1) | Q[WIDTH-1];

????????????Q = Q << 1;

????????????A = A - M;

????????????if (A[2*WIDTH-1]) begin

????????????????Q[0] = 0;

????????????????A = A + M;

????????????end else begin

????????????????Q[0] = 1;

????????????end

????????end

????end

????assign Quotient = Q[WIDTH-1:0];

????assign Remainder = A[WIDTH-1:0];

endmodule

6 移位器(Shifter)

移位器用于執行二進制數的移位操作(左移和右移),可以是邏輯移位、算術移位或循環移位。

邏輯移位器:邏輯左移和右移邏輯實現

module LogicalShifter #(parameter WIDTH = 8)(input [WIDTH-1:0] A, input [2:0] Shift, output [WIDTH-1:0] Result);

????assign Result = (Shift[2]) ? {8'b0, A[WIDTH-1:8]} :

????????????????????(Shift[1]) ? {4'b0, A[WIDTH-1:4]} :

????????????????????(Shift[0]) ? {2'b0, A[WIDTH-1:2]} :

????????????????????A;

Endmodule

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15951.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15951.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15951.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

動態路由實驗—OSPF

動態路由協議實驗-------OSPF 鏈路狀態路由選擇協議又被稱為最短路徑優先協議&#xff0c;它基SPF&#xff08;shortest path first &#xff09;算法 實驗要求&#xff1a;各個PC之間能夠互通 1.四臺PC配置如下 PC1 PC2 PC3 PC4 2.配置各個交換機的口子的IP R1 <HUAWE…

Room注解無效原因

在Android項目中&#xff0c;如果父模塊使用Kotlin&#xff0c;而子模塊用Java編寫&#xff0c;并且在子模塊中使用了Room庫&#xff0c;那么你會發現需要使用kapt而不是annotationProcessor來處理Room注解。這里有幾個原因和背景知識&#xff1a; 1. 項目配置的影響 父模塊的…

spiderfoot一鍵掃描IP信息(KALI工具系列九)

目錄 1、KALI LINUX簡介 2、spiderfoot工具簡介 3、在KALI中使用spiderfoot 3.1 目標主機IP&#xff08;win&#xff09; 3.2 KALI的IP 4、命令示例 4.1 web訪問 4.2 掃描并進行DNS解析 4.3 全面掃描 5、總結 1、KALI LINUX簡介 Kali Linux 是一個功能強大、多才多…

YOLOv8+PyQt:實時檢測(攝像頭、視頻)

1.YOLO&#xff1a;CPU實時檢測&#xff08;攝像頭、視頻&#xff09;https://blog.csdn.net/qq_45445740/article/details/106557451 2.YOLOv8PyQt&#xff0c;實現攝像頭或視頻的實時檢測 需要安裝 PySide6 和 ultralytics pip install PySide6 pip install ultralyticsfr…

基于docxtpl的模板生成Word

docxtpl是一個用于生成Microsoft Word文檔的模板引擎庫。它結合了docx模塊和Jinja2模板引擎&#xff0c;使用戶能夠使用Microsoft Word模板文件并在其中填充動態數據。這個庫提供了一種方便的方式來生成個性化的Word文檔&#xff0c;并支持條件語句、循環語句和變量等控制結構&…

如何在 Elasticsearch 中選擇精確 kNN 搜索和近似 kNN 搜索

作者&#xff1a;來自 Elastic Carlos Delgado kNN 是什么&#xff1f; 語義搜索&#xff08;semantic search&#xff09;是相關性排名的強大工具。 它使你不僅可以使用關鍵字&#xff0c;還可以考慮文檔和查詢的實際含義。 語義搜索基于向量搜索&#xff08;vector search&…

Angular Ivy:新渲染引擎的性能提升與優化

Angular Ivy是Angular 9及更高版本中引入的默認渲染引擎&#xff0c;它取代了以前的View Engine。Ivy的目標是提高Angular的性能、減少包大小和提高開發者的生產力。 1. AOT編譯的改進&#xff1a; 在Ivy中&#xff0c;Angular使用了更早的AOT&#xff08;Ahead-of-Time&…

在AnolisOS8.9系統安裝docker-compose

在AnolisOS8.9系統安裝docker-compose 下載docker-compose之前請先確保docker已經安裝完&#xff0c;教程可以參考 在阿里Anolis OS 8.9龍蜥操作系統安裝docker 下載最新版的docker-compose文件 sudo curl -L https://github.com/docker/compose/releases/download/v2.21.0…

大數據工具之HIVE-參數調優,調度亂碼(二)

一、調度亂碼 在利用HUE工具,搭建WORKFLOW流程的過程中,如果直接執行hivesql數據正常,不會出現亂碼現象,如果利用WORKFLOW搭建的流程,進行數據的拉取,會出現數據中文亂碼現象,這些亂碼主要是由于select 中的硬編碼中文導致出現的現象 具體現象如下: select case when …

百度 提前批 國際化廣告部 (深圳-機器學習/數據挖掘/自然語言處理工程師) 一面+二面面經

文章目錄 0、面試情況1、一面1.1、簡歷上的項目介紹了個遍1.2、dbscan原理1.3、為什么梯度的負方向就是損失函數下降最快的方向&#xff1f;1.4、bn原理&#xff0c;為什么bn能解決過擬合&#xff0c;1.5、auc原理&#xff0c;為什么ctr或你的廣告推薦里用auc指標&#xff1f;1…

TG5032CGN TCXO 超高穩定10pin端子型適用于汽車動力轉向控制器

TG5032CGN TCXO / VC-TCXO是一款應用廣泛的晶振&#xff0c;具有超高穩定性&#xff0c;CMOS輸出和使用晶體基振的削波正弦波輸出形式。且有低相位噪聲優勢&#xff0c;是溫補晶體振蕩器(TCXO)和壓控晶體振蕩器(VCXO)結合的產物&#xff0c;具有TCXO和VCXO的共同優點&#xff0…

后臺接口返回void但是response有設置合適的相關信息,前端調用接口解析Blob數據下載excel文件

1、pom.xml文件增加依賴&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></dependency> 2、接口代碼如下&#xff1a; /*** 企業列表--導出*/GetMapping(value "/downloadTenantL…

微信小程序上線必備:SSL證書申請以及安裝

一、認識ssl證書 1、ssl證書是什么&#xff1f; SSL證書&#xff0c;全稱Secure Socket Layer Certificate&#xff0c;是一種數字證書&#xff0c;它遵循SSL&#xff08;現在通常指TLS&#xff0c;Transport Layer Security&#xff09;協議標準&#xff0c;用于在客戶端&…

SpringCloud系列(26)--OpenFeign超時控制

前言&#xff1a;在上一章節中我們簡單的介紹了如何使用OprnFeign去調用微服務&#xff0c;因為消費側和服務側是兩個不同的微服務&#xff0c;這樣可能會出現超時的現象&#xff0c;例如服務側需要3秒處理任何才能返回結果&#xff0c;但消費側可能2秒就斷開連接了&#xff0c…

【深度學習】2.單層感知機

目標&#xff1a; 實現一個簡單的二分類模型的訓練過程&#xff0c;通過模擬數據集進行訓練和優化&#xff0c;訓練目標是使模型能夠根據輸入特征正確分類數據。 演示: 1.通過PyTorch生成了一個模擬的二分類數據集&#xff0c;包括特征矩陣data_x和對應的標簽數據data_y。標簽…

加密與安全_AES RSA 密鑰對生成及PEM格式的代碼實現

文章目錄 RSA&#xff08;非對稱&#xff09;和AES&#xff08;對稱&#xff09;加密算法一、RSA&#xff08;Rivest-Shamir-Adleman&#xff09;二、AES&#xff08;Advanced Encryption Standard&#xff09; RSA加密三種填充模式一、RSA填充模式二、常見的RSA填充模式組合三…

新業務 新市場 | 靈途科技新品亮相馬來西亞亞洲防務展

5月6日&#xff0c;靈途科技攜新品模組與武漢長盈通光電&#xff08;股票代碼&#xff1a;688143&#xff09;攜手參加第18屆馬來西亞亞洲防務展。首次亮相海外&#xff0c;靈途科技便收獲全球客戶的廣泛關注&#xff0c;為公司海外市場開拓打下堅實基礎。 靈途科技與長盈通共同…

Dbs封裝_連接池

1.Dbs封裝 每一個數據庫都對應著一個dao 每個dao勢必存在公共部分 我們需要將公共部分抽取出來 封裝成一個工具類 保留個性化代碼即可 我們的工具類一般命名為xxxs 比如Strings 就是字符串相關的工具類 而工具類 我們將其放置于util包中我們以是否有<T>區分泛型方法和非泛…

Python并發編程學習記錄

1、初識并發編程 1.1、串行&#xff0c;并行&#xff0c;并發 串行(serial)&#xff1a;一個cpu上按順序完成多個任務&#xff1b; 并行(parallelism)&#xff1a;任務數小于或等于cup核數&#xff0c;多個任務是同時執行的&#xff1b; 并發(concurrency)&#xff1a;一個…

計算機SCI期刊,IF=8+,專業性強,潛力新刊!

一、期刊名稱 Journal of Big data 二、期刊簡介概況 期刊類型&#xff1a;SCI 學科領域&#xff1a;計算機科學 影響因子&#xff1a;8.1 中科院分區&#xff1a;2區 出版方式&#xff1a;開放出版 版面費&#xff1a;$1990 三、期刊征稿范圍 《大數據雜志》發表了關于…