mirror of
https://github.com/supleed2/ELEC40006-P1-CW.git
synced 2024-12-22 21:45:49 +00:00
Added decoder logic for STR and LDR
This commit is contained in:
parent
a1cf89e644
commit
719c9ede2b
1052
CPUProject.bdf
1052
CPUProject.bdf
File diff suppressed because it is too large
Load diff
|
@ -41,7 +41,7 @@ set_global_assignment -name DEVICE AUTO
|
||||||
set_global_assignment -name TOP_LEVEL_ENTITY CPUProject
|
set_global_assignment -name TOP_LEVEL_ENTITY CPUProject
|
||||||
set_global_assignment -name ORIGINAL_QUARTUS_VERSION 18.1.0
|
set_global_assignment -name ORIGINAL_QUARTUS_VERSION 18.1.0
|
||||||
set_global_assignment -name PROJECT_CREATION_TIME_DATE "12:38:11 MAY 20, 2020"
|
set_global_assignment -name PROJECT_CREATION_TIME_DATE "12:38:11 MAY 20, 2020"
|
||||||
set_global_assignment -name LAST_QUARTUS_VERSION "19.1.0 Lite Edition"
|
set_global_assignment -name LAST_QUARTUS_VERSION "18.1.0 Standard Edition"
|
||||||
set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
|
set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
|
||||||
set_global_assignment -name TIMING_ANALYZER_MULTICORNER_ANALYSIS ON
|
set_global_assignment -name TIMING_ANALYZER_MULTICORNER_ANALYSIS ON
|
||||||
set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL
|
set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL
|
||||||
|
|
BIN
CPUProject.qws
Normal file
BIN
CPUProject.qws
Normal file
Binary file not shown.
|
@ -205,6 +205,13 @@ refer to the applicable agreement for further details.
|
||||||
(text "stack_rw" (rect 151 347 187 359)(font "Arial" ))
|
(text "stack_rw" (rect 151 347 187 359)(font "Arial" ))
|
||||||
(line (pt 208 352)(pt 192 352)(line_width 1))
|
(line (pt 208 352)(pt 192 352)(line_width 1))
|
||||||
)
|
)
|
||||||
|
(port
|
||||||
|
(pt 208 368)
|
||||||
|
(output)
|
||||||
|
(text "s5" (rect 0 0 9 12)(font "Arial" ))
|
||||||
|
(text "s5" (rect 178 363 187 375)(font "Arial" ))
|
||||||
|
(line (pt 208 368)(pt 192 368)(line_width 1))
|
||||||
|
)
|
||||||
(drawing
|
(drawing
|
||||||
(rectangle (rect 16 16 192 384)(line_width 1))
|
(rectangle (rect 16 16 192 384)(line_width 1))
|
||||||
)
|
)
|
||||||
|
|
66
DECODE.v
66
DECODE.v
|
@ -25,58 +25,62 @@ module DECODE
|
||||||
output E2,
|
output E2,
|
||||||
output stack_en,
|
output stack_en,
|
||||||
output stack_rst,
|
output stack_rst,
|
||||||
output stack_rw
|
output stack_rw,
|
||||||
|
output s5
|
||||||
);
|
);
|
||||||
|
|
||||||
wire msb = instr[15]; //MSB of the instruction word
|
wire msb = instr[15]; //MSB of the instruction word
|
||||||
wire ls = instr[14]; //LOAD or STORE bit
|
wire ls = instr[14]; //LDA or STA bit
|
||||||
wire [2:0] Rls = instr[13:11]; //Register in the LOAD/STORE operation
|
wire [2:0] Rls = instr[13:11]; //Register in the LDA/STA operation
|
||||||
wire [10:0] addr = instr[10:0]; //Memory address in the LOAD/STORE operation
|
wire [10:0] addr = instr[10:0]; //Memory address in the LDA/STA operation
|
||||||
wire [5:0] op = instr[14:9]; //Opcode in regular instructions
|
wire [5:0] op = instr[14:9]; //Opcode in regular instructions
|
||||||
wire [2:0] Rd = instr[8:6]; //Destination register in command
|
wire [2:0] Rd = instr[8:6]; //Destination register in command
|
||||||
wire [2:0] Rs1 = instr[5:3]; //Source register 1 in command
|
wire [2:0] Rs1 = instr[5:3]; //Source register 1 in command
|
||||||
wire [2:0] Rs2 = instr[2:0]; //Source register 2 in command
|
wire [2:0] Rs2 = instr[2:0]; //Source register 2 in command
|
||||||
|
|
||||||
//Different opcodes (refer to documentation):
|
//Different opcodes (refer to documentation):
|
||||||
wire LOAD = msb & ~ls;
|
wire LDA = msb & ~ls;
|
||||||
wire STORE = msb & ls;
|
wire STA = msb & ls;
|
||||||
wire UJMP = ~msb & ~op[5] & ~op[4] & ~op[3] & ~op[2];
|
wire JMP = ~msb & ~op[5] & ~op[4] & ~op[3] & ~op[2];
|
||||||
wire JMP = ~msb & ((~op[5] & ~op[4] & ~op[3] & op[2]) | (~op[5] & ~op[4] & op[3] & ~op[2]));
|
wire JCX = ~msb & ((~op[5] & ~op[4] & ~op[3] & op[2]) | (~op[5] & ~op[4] & op[3] & ~op[2]));
|
||||||
wire MUL = ~msb & ~op[5] & op[4] & op[3] & op[2] & ~op[1] & ~op[0];
|
wire MUL = ~msb & ~op[5] & op[4] & op[3] & op[2] & ~op[1] & ~op[0];
|
||||||
wire MLA = ~msb & ~op[5] & op[4] & op[3] & op[2] & ~op[1] & op[0];
|
wire MLA = ~msb & ~op[5] & op[4] & op[3] & op[2] & ~op[1] & op[0];
|
||||||
wire MLS = ~msb & ~op[5] & op[4] & op[3] & op[2] & op[1] & ~op[0];
|
wire MLS = ~msb & ~op[5] & op[4] & op[3] & op[2] & op[1] & ~op[0];
|
||||||
wire PSH = ~msb & op[5] & ~op[4] & op[3] & ~op[2] & ~op[1] & ~op[0];
|
wire PSH = ~msb & op[5] & ~op[4] & op[3] & ~op[2] & ~op[1] & ~op[0];
|
||||||
wire POP = ~msb & op[5] & ~op[4] & op[3] & ~op[2] & ~op[1] & op[0];
|
wire POP = ~msb & op[5] & ~op[4] & op[3] & ~op[2] & ~op[1] & op[0];
|
||||||
|
wire LDR = ~msb & op[5] & ~op[4] & op[3] & ~op[2] & op[1] & ~op[0];
|
||||||
|
wire STR = ~msb & op[5] & ~op[4] & op[3] & ~op[2] & op[1] & op[0];
|
||||||
wire NOP = ~msb & op[5] & op[4] & op[3] & op[2] & op[1] & ~op[0];
|
wire NOP = ~msb & op[5] & op[4] & op[3] & op[2] & op[1] & ~op[0];
|
||||||
wire STP = ~msb & op[5] & op[4] & op[3] & op[2] & op[1] & op[0];
|
wire STP = ~msb & op[5] & op[4] & op[3] & op[2] & op[1] & op[0];
|
||||||
|
|
||||||
assign R0_count = EXEC1 & (~(UJMP | (JMP & COND_result) | STP));
|
assign R0_count = EXEC1 & (~(JMP | (JCX & COND_result) | STP));
|
||||||
assign R0_en = (EXEC1 & (~(STORE | NOP | STP | LOAD | PSH) & ~Rd[2] & ~Rd[1] & ~Rd[0] | UJMP | JMP & COND_result)) | (EXEC2 & LOAD & ~Rls[2] & ~Rls[1] & ~Rls[0]) | (EXEC2 & (MUL | MLA | MLS | POP) & ~Rd[2] & ~Rd[1] & ~Rd[0]);
|
assign R0_en = (EXEC1 & (~(STA | NOP | STP | LDA | PSH) & ~Rd[2] & ~Rd[1] & ~Rd[0] | JMP | JCX & COND_result)) | (EXEC2 & LDA & ~Rls[2] & ~Rls[1] & ~Rls[0]) | (EXEC2 & (MUL | MLA | MLS | POP | STR) & ~Rd[2] & ~Rd[1] & ~Rd[0]);
|
||||||
assign R1_en = (EXEC1 & ~(UJMP | JMP | STORE | LOAD | MUL | MLA | MLS | NOP | STP | POP | PSH) & ~Rd[2] & ~Rd[1] & Rd[0]) | (EXEC2 & LOAD & ~Rls[2] & ~Rls[1] & Rls[0]) | (EXEC2 & (MUL | MLA | MLS | POP) & ~Rd[2] & ~Rd[1] & Rd[0]);
|
assign R1_en = (EXEC1 & ~(JMP | JCX | STA | LDA | MUL | MLA | MLS | NOP | STP | POP | PSH) & ~Rd[2] & ~Rd[1] & Rd[0]) | (EXEC2 & LDA & ~Rls[2] & ~Rls[1] & Rls[0]) | (EXEC2 & (MUL | MLA | MLS | POP | STR) & ~Rd[2] & ~Rd[1] & Rd[0]);
|
||||||
assign R2_en = (EXEC1 & ~(UJMP | JMP | STORE | LOAD | MUL | MLA | MLS | NOP | STP | POP | PSH) & ~Rd[2] & Rd[1] & ~Rd[0]) | (EXEC2 & LOAD & ~Rls[2] & Rls[1] & ~Rls[0]) | (EXEC2 & (MUL | MLA | MLS | POP) & ~Rd[2] & Rd[1] & ~Rd[0]);
|
assign R2_en = (EXEC1 & ~(JMP | JCX | STA | LDA | MUL | MLA | MLS | NOP | STP | POP | PSH) & ~Rd[2] & Rd[1] & ~Rd[0]) | (EXEC2 & LDA & ~Rls[2] & Rls[1] & ~Rls[0]) | (EXEC2 & (MUL | MLA | MLS | POP | STR) & ~Rd[2] & Rd[1] & ~Rd[0]);
|
||||||
assign R3_en = (EXEC1 & ~(UJMP | JMP | STORE | LOAD | MUL | MLA | MLS | NOP | STP | POP | PSH) & ~Rd[2] & Rd[1] & Rd[0]) | (EXEC2 & LOAD & ~Rls[2] & Rls[1] & Rls[0]) | (EXEC2 & (MUL | MLA | MLS | POP) & ~Rd[2] & Rd[1] & Rd[0]);
|
assign R3_en = (EXEC1 & ~(JMP | JCX | STA | LDA | MUL | MLA | MLS | NOP | STP | POP | PSH) & ~Rd[2] & Rd[1] & Rd[0]) | (EXEC2 & LDA & ~Rls[2] & Rls[1] & Rls[0]) | (EXEC2 & (MUL | MLA | MLS | POP | STR) & ~Rd[2] & Rd[1] & Rd[0]);
|
||||||
assign R4_en = (EXEC1 & ~(UJMP | JMP | STORE | LOAD | MUL | MLA | MLS | NOP | STP | POP | PSH) & Rd[2] & ~Rd[1] & ~Rd[0]) | (EXEC2 & LOAD & Rls[2] & ~Rls[1] & ~Rls[0]) | (EXEC2 & (MUL | MLA | MLS | POP) & Rd[2] & ~Rd[1] & ~Rd[0]);
|
assign R4_en = (EXEC1 & ~(JMP | JCX | STA | LDA | MUL | MLA | MLS | NOP | STP | POP | PSH) & Rd[2] & ~Rd[1] & ~Rd[0]) | (EXEC2 & LDA & Rls[2] & ~Rls[1] & ~Rls[0]) | (EXEC2 & (MUL | MLA | MLS | POP | STR) & Rd[2] & ~Rd[1] & ~Rd[0]);
|
||||||
assign R5_en = (EXEC1 & ~(UJMP | JMP | STORE | LOAD | MUL | MLA | MLS | NOP | STP | POP | PSH) & Rd[2] & ~Rd[1] & Rd[0]) | (EXEC2 & LOAD & Rls[2] & ~Rls[1] & Rls[0]) | (EXEC2 & (MUL | MLA | MLS | POP) & Rd[2] & ~Rd[1] & Rd[0]);
|
assign R5_en = (EXEC1 & ~(JMP | JCX | STA | LDA | MUL | MLA | MLS | NOP | STP | POP | PSH) & Rd[2] & ~Rd[1] & Rd[0]) | (EXEC2 & LDA & Rls[2] & ~Rls[1] & Rls[0]) | (EXEC2 & (MUL | MLA | MLS | POP | STR) & Rd[2] & ~Rd[1] & Rd[0]);
|
||||||
assign R6_en = (EXEC1 & ~(UJMP | JMP | STORE | LOAD | MUL | MLA | MLS | NOP | STP | POP | PSH) & Rd[2] & Rd[1] & ~Rd[0]) | (EXEC2 & LOAD & Rls[2] & Rls[1] & ~Rls[0]) | (EXEC2 & (MUL | MLA | MLS | POP) & Rd[2] & Rd[1] & ~Rd[0]);
|
assign R6_en = (EXEC1 & ~(JMP | JCX | STA | LDA | MUL | MLA | MLS | NOP | STP | POP | PSH) & Rd[2] & Rd[1] & ~Rd[0]) | (EXEC2 & LDA & Rls[2] & Rls[1] & ~Rls[0]) | (EXEC2 & (MUL | MLA | MLS | POP | STR) & Rd[2] & Rd[1] & ~Rd[0]);
|
||||||
assign R7_en = (EXEC1 & ~(UJMP | JMP | STORE | LOAD | MUL | MLA | MLS | NOP | STP | POP | PSH) & Rd[2] & Rd[1] & Rd[0]) | (EXEC2 & LOAD & Rls[2] & Rls[1] & Rls[0]) | (EXEC2 & (MUL | MLA | MLS | POP) & Rd[2] & Rd[1] & Rd[0]);
|
assign R7_en = (EXEC1 & ~(JMP | JCX | STA | LDA | MUL | MLA | MLS | NOP | STP | POP | PSH) & Rd[2] & Rd[1] & Rd[0]) | (EXEC2 & LDA & Rls[2] & Rls[1] & Rls[0]) | (EXEC2 & (MUL | MLA | MLS | POP | STR) & Rd[2] & Rd[1] & Rd[0]);
|
||||||
assign s1[2] = (~(UJMP | STORE | LOAD | NOP | STP | PSH | POP) & Rs1[2]) | (STORE & Rls[2]) | (PSH & Rs1[2]);
|
assign s1[2] = (~(JMP | STA | LDA | NOP | STP | POP) & Rs1[2]) | (STA & Rls[2]);
|
||||||
assign s1[1] = (~(UJMP | STORE | LOAD | NOP | STP | PSH | POP) & Rs1[1]) | (STORE & Rls[1]) | (PSH & Rs1[1]);
|
assign s1[1] = (~(JMP | STA | LDA | NOP | STP | POP) & Rs1[1]) | (STA & Rls[1]);
|
||||||
assign s1[0] = (~(UJMP | STORE | LOAD | NOP | STP | PSH | POP) & Rs1[0]) | (STORE & Rls[0]) | (PSH & Rs1[0]);
|
assign s1[0] = (~(JMP | STA | LDA | NOP | STP | POP) & Rs1[0]) | (STA & Rls[0]);
|
||||||
assign s2[2] = (~(UJMP | STORE | LOAD | NOP | STP | PSH | POP) & Rs2[2]);
|
assign s2[2] = (~(JMP | STA | LDA | NOP | STP | POP | PSH | LDR | STR) & Rs2[2]);
|
||||||
assign s2[1] = (~(UJMP | STORE | LOAD | NOP | STP | PSH | POP) & Rs2[1]);
|
assign s2[1] = (~(JMP | STA | LDA | NOP | STP | POP | PSH | LDR | STR) & Rs2[1]);
|
||||||
assign s2[0] = (~(UJMP | STORE | LOAD | NOP | STP | PSH | POP) & Rs2[0]);
|
assign s2[0] = (~(JMP | STA | LDA | NOP | STP | POP | PSH | LDR | STR) & Rs2[0]);
|
||||||
assign s3[2] = (~(STORE | LOAD | NOP | STP | PSH | POP) & Rd[2]);
|
assign s3[2] = (~(STA | LDA | NOP | STP | PSH | POP | LDR) & Rd[2]);
|
||||||
assign s3[1] = (~(STORE | LOAD | NOP | STP | PSH | POP) & Rd[1]);
|
assign s3[1] = (~(STA | LDA | NOP | STP | PSH | POP | LDR) & Rd[1]);
|
||||||
assign s3[0] = (~(STORE | LOAD | NOP | STP | PSH | POP) & Rd[0]);
|
assign s3[0] = (~(STA | LDA | NOP | STP | PSH | POP | LDR) & Rd[0]);
|
||||||
assign s4 = ~LOAD;
|
assign s4 = ~(LDA | LDR);
|
||||||
assign RAMd_wren = EXEC1 & STORE;
|
assign RAMd_wren = EXEC1 & (STA | STR);
|
||||||
assign RAMd_en = EXEC1 & (STORE | LOAD);
|
assign RAMd_en = EXEC1 & (STA | LDA | STR | LDR);
|
||||||
assign RAMi_en = FETCH;
|
assign RAMi_en = FETCH;
|
||||||
assign ALU_en = LOAD | STORE;
|
assign ALU_en = LDA | STA;
|
||||||
assign E2 = EXEC1 & (LOAD | MUL | MLA | MLS | POP);
|
assign E2 = EXEC1 & (LDA | MUL | MLA | MLS | POP);
|
||||||
assign stack_en = (EXEC1 & PSH) | ((EXEC1 | EXEC2) & POP);
|
assign stack_en = (EXEC1 & PSH) | ((EXEC1 | EXEC2) & POP);
|
||||||
assign stack_rst = STP;
|
assign stack_rst = STP;
|
||||||
assign stack_rw = EXEC1 & PSH;
|
assign stack_rw = EXEC1 & PSH;
|
||||||
|
assign s5 = (EXEC1 & STR) | (EXEC2 & LDR);
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
Loading…
Reference in a new issue