Lab2_alu.v 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. module ALU(
  2. alu_out,
  3. instruction,
  4. inputA,
  5. inputB,
  6. clk,
  7. reset
  8. );
  9. //==== i/o definition ====
  10. output [7:0] alu_out;
  11. input [7:0] inputA,inputB;
  12. input [3:0] instruction;
  13. input clk,reset;
  14. //==== reg/wire definition ====
  15. reg [7:0] alu_out,X,reg_A,reg_B;
  16. wire [7:0] inputB_inv;
  17. reg [3:0] reg_ins;
  18. wire [7:0] sum;
  19. //==== sequential circuit ====
  20. always@( posedge clk or negedge reset ) begin
  21. if(~reset) begin
  22. alu_out <= 0;
  23. reg_A <= 0;
  24. reg_B <= 0;
  25. reg_ins <= 0;
  26. end
  27. else begin
  28. alu_out <= X;
  29. reg_A <= inputA;
  30. reg_B <= inputB;
  31. reg_ins <= instruction;
  32. end
  33. end
  34. assign inputB_inv = ~reg_B;
  35. always@( reg_A or reg_B or reg_ins or inputB_inv or sum ) begin
  36. case(reg_ins)
  37. 4'b0000: X = reg_A+reg_B;
  38. 4'b0001: X = reg_A-reg_B;
  39. 4'b0010: X = inputB_inv;
  40. 4'b0011: X = reg_A&reg_B;
  41. 4'b0100: X = reg_A|reg_B;
  42. default: X = reg_A^reg_B;
  43. endcase
  44. end
  45. endmodule