verilog/kt8/decode.v
2017-02-07 18:42:45 -06:00

57 lines
1.4 KiB
Verilog
Executable File

//KT8 instruction decoder
//Lots of random logic to do the correct thing for each instruction
module decode(instruction_i,
r_value_i,
jump_up_o,
jump_down_o,
jump_distance_o,
b_value_o,
b_current_i,
load_a_o,
load_b_o,
load_r_o,
ram_wr_o,
ram_data_i );
input [7:0] instruction_i, r_value_i, ram_data_i, b_current_i;
output [7:0] b_value_o;
output [3:0] jump_distance_o;
output jump_up_o, jump_down_o;
output load_a_o, load_b_o, load_r_o;
output ram_wr_o;
reg jump_up_o, jump_down_o;
reg [3:0] jump_distance_o;
//program counter control
always @(*)
if instruction_i[7:4] == b'1100 begin
//FJMP
jump_up_o = 1;
jump_down_o = 0;
jump_distance_o = instruction_i[3:0];
end else if instruction_i[7:4] == b'1101 begin
//BJMP
jump_up_o = 0;
jump_down_o = 1;
jump_distance_o = instruction_i[3:0];
end else if (instruction_i == h'E0) && (r_value_i == 0) begin
//SKIPZ and R==0, so skip
jump_up_o = 1;
jump_down_o = 0;
jump_distance_o = 2;
end else if (instruction_i == h'E1) && (r_value_i != 0) begin
//SKIPNZ and R!=0, so skip
jump_up_o = 1;
jump_down_o = 0;
jump_distance_o = 2;
end else begin
//normal count up
jump_up_o = 0;
jump_down_o = 0;
jump_distance_o = 0;
end