1
Files
quartus-8-bit-cpu/Decoder.sv
2023-03-30 00:21:01 +02:00

47 lines
1.2 KiB
Systemverilog

`default_nettype none
module Decoder(
input var logic clock,
input var logic reset,
output var logic fetch,
output var logic decode,
output var logic execute,
output var logic writeback
);
var logic was_reset;
var logic setvalue;
var logic[1:0] reset_val;
var logic[1:0] mode;
Counter #(.WIDTH(2)) mode_cnt(
.clock(clock),
.reset(0),
.decrement(0),
.setvalue(setvalue),
.valuein(reset_val),
.valueout(mode)
);
always @(posedge clock or posedge reset) if (reset) begin
// Set each output to 0 by setting was_reset.
was_reset = 1'b1;
// Also we already prepare the counter reset for the next clock, as the clock already
// happened when this is "executed".
setvalue = 1'b1;
reset_val = 2'b00;
end else if (was_reset == 1'b1) begin
// The counter uses the same clock as this, so the reset is performed "now".
// We can now "reset the reset" and continue counting regularly.
was_reset = 1'b0;
setvalue = 1'b0;
reset_val = 2'b00;
end
assign fetch = ~was_reset && (mode == 2'b00);
assign decode = ~was_reset && (mode == 2'b01);
assign execute = ~was_reset && (mode == 2'b10);
assign writeback = ~was_reset && (mode == 2'b11);
endmodule