alu.v
上传用户:bltddc
上传日期:2020-07-09
资源大小:4428k
文件大小:2k
源码类别:

SCSI/ASPI

开发平台:

VHDL

  1. module alu (
  2.    op,
  3.    a,
  4.    b,
  5.    y,
  6.    cin,
  7.    cout,
  8.    zout
  9. );
  10. input  [3:0] op; // ALU Operation
  11. input  [7:0] a; // 8-bit Input a
  12. input  [7:0] b; // 8-bit Input b
  13. output [7:0] y; // 8-bit Output
  14. input cin;
  15. output cout;
  16. output zout;
  17. //
  18. // Copyright (c) 1999 Thomas Coonan (tcoonan@mindspring.com)
  19. //
  20. //    This source code is free software; you can redistribute it
  21. //    and/or modify it in source code form under the terms of the GNU
  22. //    General Public License as published by the Free Software
  23. //    Foundation; either version 2 of the License, or (at your option)
  24. //    any later version.
  25. //
  26. //    This program is distributed in the hope that it will be useful,
  27. //    but WITHOUT ANY WARRANTY; without even the implied warranty of
  28. //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  29. //    GNU General Public License for more details.
  30. //
  31. //    You should have received a copy of the GNU General Public License
  32. //    along with this program; if not, write to the Free Software
  33. //    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  34. //
  35. // Reg declarations for outputs
  36. reg cout;
  37. reg zout;
  38. reg [7:0] y;
  39. // Internal declarations
  40. reg addercout; // Carry out straight from the adder itself.
  41.  
  42. parameter ALUOP_ADD  = 4'b0000;
  43. parameter ALUOP_SUB  = 4'b1000;
  44. parameter ALUOP_AND  = 4'b0001;
  45. parameter ALUOP_OR   = 4'b0010;
  46. parameter ALUOP_XOR  = 4'b0011;
  47. parameter ALUOP_COM  = 4'b0100;
  48. parameter ALUOP_ROR  = 4'b0101;
  49. parameter ALUOP_ROL  = 4'b0110;
  50. parameter ALUOP_SWAP = 4'b0111;
  51. always @(a or b or cin or op) begin
  52.    case (op) // synopsys parallel_case
  53.       ALUOP_ADD:  {addercout,  y}  = a + b;
  54.       ALUOP_SUB:  {addercout,  y}  = a - b; // Carry out is really "borrow"
  55.       ALUOP_AND:  {addercout,  y}  = {1'b0, a & b};
  56.       ALUOP_OR:   {addercout,  y}  = {1'b0, a | b};
  57.       ALUOP_XOR:  {addercout,  y}  = {1'b0, a ^ b};
  58.       ALUOP_COM:  {addercout,  y}  = {1'b0, ~a};
  59.       ALUOP_ROR:  {addercout,  y}  = {a[0], cin, a[7:1]};
  60.       ALUOP_ROL:  {addercout,  y}  = {a[7], a[6:0], cin};
  61.       ALUOP_SWAP: {addercout,  y}  = {1'b0, a[3:0], a[7:4]};
  62.       default:    {addercout,  y}  = {1'b0, 8'h00};
  63.    endcase
  64. end
  65. always @(y)
  66.    zout = (y == 8'h00);
  67. always @(addercout or op)
  68.    if (op == ALUOP_SUB) cout = ~addercout; // Invert adder's carry to get borrow
  69.    else                 cout =  addercout;
  70.       
  71. endmodule