blob: 9499aa8e852d35f72a0dc36ae5bfe9313a9d9f06 [file] [log] [blame]
// 8 inputs
// 8 outputs
// 4 bit input value (switches)
// reset
// do arithmetic
// 2 bits for +, -, ^, <<
// I would have done & and | but doing those operations with
// an 8-bit number and 3-bit number wasn't that useful
// 2 7-segment displays
module sophialiCMU_math (
input logic [7:0] io_in,
output logic [7:0] io_out
);
logic clock, reset, en;
logic [2:0] in;
logic [1:0] arithOp;
always_comb begin
clock = io_in[0];
reset = io_in[1];
en = io_in[2];
in = io_in[3:5];
arithOp = io_in[6:7];
end
logic enable;
enum logic {IDLE, GO} state, nextState;
// ALU
always_ff @(posedge clock, posedge reset) begin
if (reset)
io_out <= 0;
else begin
if (enable)
unique case (arithOp)
2'b00: io_out <= io_out + in; // add
2'b01: io_out <= io_out - in; // subtract
2'b10: io_out <= io_out ^ {5'b0, in}; // XOR per bit
2'b11: io_out <= io_out << in; // Left-shift per bit
endcase
end
end
// FF to ensure button for enable isn't continuously set
always_ff @(posedge clock, posedge reset) begin
if (reset)
state <= IDLE;
else begin
state <= nextState;
end
end
assign enable = (state == IDLE && nextState == GO);
always_comb begin
if (state == IDLE) begin
nextState = (en) ? GO : IDLE;
end
else
nextState = (en) ? GO : IDLE;
end
endmodule: sophialiCMU_math