Mojo Board FPGA EP.2 - การต่อ MIPS ALU วงจรลำดับ !
MIPS. ย่อมาจาก million instructions per second แปลว่า ล้านคำสั่งต่อวินาที เป็นหน่วยวัดความเร็วของการทำงานตามโปรแกรมใดโปรแกรมหนึ่งของตัวประมวลผล หรือของคอมพิวเตอร์แต่ละยี่ห้อว่า สามารถประมวลผลได้กี่ล้านคำสั่งต่อวินาที ยิ่งมากแสดงว่ายิ่งทำงานได้เร็ว
ALU. ย่อมาจาก arithmetic and logical unit เป็นส่วนหนึ่งของหน่วยประมวลผลกลางของเครื่องคอมพิวเตอร์ที่ทำหน้าที่คำนวณทางคณิตศาสตร์ และเปรียบเทียบทางตรรกะ ดู central processing unit ประกอบ
เป็นการประมาณผลคำสั่งแบบ aritmetic and logical จำนวนมหาศาลยิ่งมีจำนวนมากยิ่งประมวลผลได้เร็ว
ตัวอย่างโค๊ด MIPS ALU แบบ verilog
=====================================================================
=====================================================================
ALU. ย่อมาจาก arithmetic and logical unit เป็นส่วนหนึ่งของหน่วยประมวลผลกลางของเครื่องคอมพิวเตอร์ที่ทำหน้าที่คำนวณทางคณิตศาสตร์ และเปรียบเทียบทางตรรกะ ดู central processing unit ประกอบ
เป็นการประมาณผลคำสั่งแบบ aritmetic and logical จำนวนมหาศาลยิ่งมีจำนวนมากยิ่งประมวลผลได้เร็ว
ตัวอย่างโค๊ด MIPS ALU แบบ verilog
=====================================================================
| `timescale 1ns / 1ps | |
| /* | |
| ** UCSD CSE 141L Lab2/3 Provided Module | |
| ** ------------------------------------------------------------------- | |
| ** ALU Module for Single-Cycle MIPS Processor for Altera FPGAs | |
| ** | |
| ** Change Log: | |
| ** 1/13/2012 - Adrian Caulfield - Initial Implementation | |
| */ | |
| module alu( | |
| input [5:0] Func_in, | |
| input [31:0] A_in, | |
| input [31:0] B_in, | |
| output reg [31:0] O_out, | |
| output reg Branch_out, | |
| output reg Jump_out | |
| ); | |
| //add/sub | |
| //--------------------------------------------------------------------------- | |
| reg [31:0] AdderInputB; | |
| reg AdderCarryIn; | |
| reg [31:0] AdderOut; | |
| //and/or/xor/nor | |
| //--------------------------------------------------------------------------- | |
| reg [31:0] LogicOut; | |
| //slt | |
| //--------------------------------------------------------------------------- | |
| reg [31:0] SltOut; | |
| //---------------------------------------------------------------------------- | |
| //branches | |
| reg [31:0] BranchOut; | |
| reg Sign; | |
| reg Zero; | |
| reg LTZ; | |
| reg LEZ; | |
| reg GTZ; | |
| reg GEZ; | |
| reg Eq; | |
| reg DoBranch,DoJump; | |
| always @(*) begin | |
| //add/sub | |
| if (Func_in[1]) begin | |
| AdderInputB = ~B_in; | |
| end else begin | |
| AdderInputB = B_in; | |
| end | |
| AdderOut = A_in + AdderInputB + Func_in[1]; | |
| //logic | |
| case (Func_in[1:0]) | |
| 2'b00: | |
| LogicOut = A_in & B_in; | |
| 2'b01: | |
| LogicOut = A_in | B_in; | |
| 2'b10: | |
| LogicOut = A_in ^ B_in; | |
| 2'b11: | |
| LogicOut = ~(A_in | B_in); | |
| endcase | |
| //set less thans | |
| //------------------------------------------------ | |
| if (Func_in[0]) begin | |
| SltOut = A_in < B_in; | |
| end else begin | |
| SltOut = $signed(A_in) < $signed(B_in); | |
| end | |
| //branches and jumps | |
| //--------------------------------------------------------- | |
| BranchOut = A_in; | |
| Sign = A_in[31]; | |
| Zero = A_in[31:0] == 32'b0; | |
| LTZ = Sign; | |
| LEZ = Sign || Zero; | |
| GTZ = ~Sign && ~Zero; | |
| GEZ = ~Sign; | |
| Eq = A_in == B_in; | |
| DoBranch = 1'b0; | |
| DoJump = 1'b0; | |
| case (Func_in[2:0]) | |
| 3'b000: //BLTZ | |
| DoBranch = LTZ; | |
| 3'b001: //BGEZ | |
| DoBranch = GEZ; | |
| 3'b010: //J/JAL | |
| DoJump = 1'b1; | |
| 3'b011: //JR/JALR | |
| DoJump = 1'b1; | |
| 3'b100: //BEQ | |
| DoBranch = Eq; | |
| 3'b101: //BNE | |
| DoBranch = ~Eq; | |
| 3'b110: //BLEZ | |
| DoBranch = LEZ; | |
| 3'b111: //BGTZ | |
| DoBranch = GTZ; | |
| default: | |
| DoBranch = 1'b0; | |
| endcase | |
| //calculate final alu result | |
| //--------------------------------------------------------- | |
| Branch_out = 1'b0; | |
| Jump_out = 1'b0; | |
| if (Func_in[5:2] == 4'b1000) begin | |
| O_out = AdderOut; | |
| end else if (Func_in[5:2] == 4'b1001) begin | |
| O_out = LogicOut; | |
| end else if (Func_in[5:3] == 3'b101) begin | |
| O_out = SltOut; | |
| end else if (Func_in[5:3] == 3'b111) begin | |
| O_out = BranchOut; | |
| Branch_out = DoBranch; | |
| Jump_out = DoJump; | |
| end else begin | |
| O_out = B_in; | |
| end | |
| end | |
| endmodule |
=====================================================================

ความคิดเห็น
แสดงความคิดเห็น