SHA-256演算法在FPGA上的實現 帶子模組說明和介面定義
前面文章講解了在FPGA上實現SHA-256的原理性討論。
ofollow,noindex">SHA-256演算法在FPGA上的實現
本文在前文的基礎上進行了若干修正,增加了子模組的功能說明以及子模組之間的連線關係。本文是今天課堂討論的整理。

SHA256_IP在FPGA上的實現
總的設計思路
我們希望儘可能多地使用現成的Altera IP來搭建我們的設計。我們的設計中會用到HPS2FPGA lightweighted bridge來掛接需要進行少量資料互動的模組如PIO和中斷,用HPS2FPGA bridge來掛接需要傳遞大量資料的模組如雙口memory,用PIO口來實現控制暫存器和狀態暫存器的功能,用interrupt模組來觸發ARM的中斷。上圖中那兩塊雙口memory用來儲存資料M和Kj。
這些模組的使用均可以在Altera的圖形化系統開發工具Qsys中實現。
在Qsys中可以直接從IP庫中選擇需要的IP,通過滑鼠拖拽來例化IP,通過滑鼠操作來將所有IP和HPS/ARM連線起來組成一個SoC系統。在Qsys可以對每個IP進行設定,如設定基礎地址,偏移地址,位寬,大小,輸入輸出屬性等。
SHA-256 core的說明
上圖中SHA-256 core實現SHA-256壓縮演算法的所有核心功能,如CH(x,y,z), Maj(x,y,x), Sigma0, Sigma1等。 這個模組均為組合邏輯,輸入輸出如上圖所示。
該模組並行實現了複雜的數學運算。這就是為什麼基於FPGA的SHA-256實現可以秒殺基於最強大CPU的軟體SHA-256實現。
關於PIO START的說明
這是一個新引入的模組,其主要功能是啟動硬體加速器。我們約定如果這個模組的值被軟體設為‘1’時,硬體加速器被初始化,所有計數器(Counter 1...N ,Counter 0...63)被複位,加速器工作狀態被複位,然後加速器開始工作。
這個模組的輸出連到了狀態機的輸入。由於軟體寫為’1’後不可能立刻再清為0,狀態機中必須加入上升沿檢測來保證硬體加速器不會被反覆重啟。
軟體需要在程式最開始時將該暫存器設為0,然後設定其他所有模組,最後再將該暫存器設為1。
關於Counter 0...63的說明
每個512bit message block需要經過64次迭代。Counter 0...63用來記錄每個message block已經經過了多少次迭代。這個計數器在硬體加速器啟動時被複位,然後進行模64計數,即當計數達到64時就回到0。
這個計數器可以用來生成Kj memory的讀地址,與Counter1...N一起可以生成M memory的讀地址。這個計數器還要用來控制Wj Gen模組的執行。
所有雙口memory的FPGA側輸入訊號的生成,包括地址,片選CS,讀寫訊號Wr/Rd等均由狀態機 State Machine模組實現。
這個模組是整個SHA-256 IP的核心模組。其實現以後再講。
關於Counter 1...N的說明
Counter1...N用來記錄多少個512bit Message Block已經被處理。我們要求這是一個8bit計數器,所以我們的設計最大支援的報文是512bit*256。這個值決定了memory M的大小。
當Counter0...63被計滿一次時這個計數器的值加1。由於處理報文的長度是隨機的,我們引入另外一個暫存器PIO CNT_N來儲存報文M中有多少個512bit message block,即N值。
當計數器Counter1...N的值等於PIO CNT_N中的N值時運算結束。此時Buffer register a...h中的值就是最終的雜湊值。
關於Wj Gen模組的說明
雙口memory M中存放了所有的報文。根據SHA-256的規範,當j小於16時Wj直接來自512bit message block的切片,當j大於15時,Wj由過去的Wj生成。
所以該模組中需要實現深度為15寬度為32bit的移位暫存器,以及σ0和σ1的功能。
該模組需要用到計數器 Counter 0...63.
關於Interrupt gen模組的說明
該模組的功能是在所有運算結束時生成ARM的中斷訊號。當ARM接收到該中斷時就會通過PIO register result a...h來讀取最終的雜湊結果。
該模組讀取Counter 1...N 和Counter 0...63來判斷所有運算是不是已經結束。
buffer register a...h
Buffer register a...h中存放當前512bit message block的壓縮結果。
p.s 今天徹底被Visio打敗了
蒙哥馬利元帥曾經把人分為四種,智慧又勤勞的應該當參謀,智慧又懶惰的可以當將領,愚蠢又懶惰的可以當士兵,愚蠢又勤快的應該槍斃。
今天用Visio畫圖的時候不小心碰到了一個什麼設定,那個自動走線變得極其靈敏又荒謬。這樣的功能只能拿去關掉。