FPGA学习之路—应用程序—基于Verilog设计单总线8位ALU
FPGA學習之路——基于Verilog設計單總線8位ALU
定義
ALU(arithmetic and logic unit) 算術邏輯單元,簡稱ALU,是計算機的數學運算核心,也就是負責運算的組件,如將兩個數相減或者做邏輯運算等。基本其它的組件都用到了ALU,它有兩個單元,算術單元和邏輯單元。算術單元執行如加、減、乘、除操作,邏輯單元執行與、或、非、異或等操作。
ALU的輸入為操作數以及來自控制單元的控制命令(ADD R0,R1;),輸出為運算結果以及狀態信息。
ALU的設計流程如下圖所示。
單總線結構,是指所有部件都接到同一總線上,數據可以在任何兩個寄存器之間,或是在任一寄存器和ALU之間傳送。在同一時間內,只能有一個操作數放在總線上進行傳輸。
所以對本次的ALU設計而言,需要分兩次才能將兩個操作數輸入到ALU,且需要A、B兩個緩沖寄存器。優點是控制電路比較簡單,缺點是操作速度較慢。
功能
算術運算:帶進位加減法、不帶進位加減法
邏輯運算:與、或、異或、同或
移位操作:左移、右移、清零、取反
輸出包括計算結果dataout、進位標志CY、零標志ZN和溢出標志OV,以不帶進位加法為例說明輸出的計算過程。
A_ADD:begin{CYreg,dataout}<=RegA+RegB;ZNreg<=(RegA+RegB)?0:1;OVreg<=((RegA[7]==RegB[7])&&(RegA[7]!=dataout[7]))?1:0;end補碼加法運算溢出判斷三種方法:在代碼中我們用的法一。
[方法一]
Xf、Yf分別兩個數的符號位,Zf為運算結果符號位。
當Xf =Yf =0(兩數同為正),而Zf=1(結果為負)時,負溢出;
當出現Xf =Yf =1(兩數同為負),而Zf=0(結果為正),正溢出.
[方法二]
Cs表示符號位的進位,Cp表示最高數值位進位,⊕表示異或。
若 Cs⊕Cp =0 ,無溢出;
若 Cs⊕Cp =1 ,有溢出。
[方法三]
用變形補碼進行雙符號位運算(正數符為00,負數符號以11)
若運算結果的符號位為"01",則正溢出;
若結果雙符號為10,則負溢出;
若結果的雙符號位為00或11,無溢出
實驗結果
1、算術運算帶進位加法,A=23,B=42,C0=1。
從結果我們可以看到,data總線開始進行RegA,RegB數據的傳輸。在運算完成后,輸出結果又放到data總線上,實現了單總線的設計。運算結果66=23+42+1,驗證正確。
2、邏輯運算,以異或為例。可以從下圖看到異或邏輯正確。
3、移位操作,RegA=18,RegB=2,以(RegA<<RegB)左移為例,結果如下,可以看到結果正確。
心得
此模塊中的data總線為inout類型,在編寫代碼和調試過程中遇到部分問題,使用方法如下。
inout data; reg dataout; //需輸出的數據 reg link; //inout口方向控制 assign data=(link)?dataout:1'bz; //若輸出數據則將dataout與data連接。//若接收數據,則掛高阻態。1、inout端口不能被賦值為reg型,因此,不能用于always語句中。
2、對于inout端口的邏輯判斷,要用到?:條件表達式,來控制高阻的賦值。當需要inout輸入數據時,給高阻態。當需要給inout輸出數據時,與相應的輸出結果寄存器連接。
3、寫tb文件時,給inout數據進行賦值也是用assign的類似操作。
4、設置inout的高阻態時,高阻態的數據位數要與inout的位數一致,否則會“萬里江山一片紅”。
實驗項目下載鏈接
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的FPGA学习之路—应用程序—基于Verilog设计单总线8位ALU的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一步步学习javascript基础篇(8
- 下一篇: centos 7上ambari安装试用