URL
https://opencores.org/ocsvn/rtf65002/rtf65002/trunk
Subversion Repositories rtf65002
Compare Revisions
- This comparison shows the changes necessary to convert path
/rtf65002/trunk
- from Rev 22 to Rev 23
- ↔ Reverse comparison
Rev 22 → Rev 23
/rtl/verilog/byte_jsl.v
43,7 → 43,6
stb_o <= 1'b0; |
we_o <= 1'b0; |
sel_o <= 4'h0; |
adr_o <= 34'h0; |
dat_o <= 32'h0; |
state <= BUS_ERROR; |
end |
91,7 → 90,6
stb_o <= 1'b0; |
we_o <= 1'b0; |
sel_o <= 4'h0; |
adr_o <= 34'h0; |
dat_o <= 32'h0; |
state <= BUS_ERROR; |
end |
139,7 → 137,6
stb_o <= 1'b0; |
we_o <= 1'b0; |
sel_o <= 4'h0; |
adr_o <= 34'h0; |
dat_o <= 32'h0; |
state <= BUS_ERROR; |
end |
188,7 → 185,6
stb_o <= 1'b0; |
we_o <= 1'b0; |
sel_o <= 4'h0; |
adr_o <= 34'h0; |
dat_o <= 32'h0; |
state <= BUS_ERROR; |
end |
/rtl/verilog/byte_jsr.v
43,7 → 43,6
stb_o <= 1'b0; |
we_o <= 1'b0; |
sel_o <= 4'h0; |
adr_o <= 34'h0; |
dat_o <= 32'h0; |
state <= BUS_ERROR; |
end |
92,7 → 91,6
stb_o <= 1'b0; |
we_o <= 1'b0; |
sel_o <= 4'h0; |
adr_o <= 34'h0; |
dat_o <= 32'h0; |
state <= BUS_ERROR; |
end |
163,7 → 161,6
stb_o <= 1'b0; |
we_o <= 1'b0; |
sel_o <= 4'h0; |
adr_o <= 34'h0; |
dat_o <= 32'h0; |
state <= BUS_ERROR; |
end |
/rtl/verilog/decode.v
43,7 → 43,7
`INY: begin res <= y + 32'd1; pc <= pc + 32'd1; end |
`DEA: begin res <= acc - 32'd1; pc <= pc + 32'd1; end |
`INA: begin res <= acc + 32'd1; pc <= pc + 32'd1; end |
`TSX: begin res <= isp; pc <= pc + 32'd1; end |
`TSX,`TSA: begin res <= isp; pc <= pc + 32'd1; end |
`TXS,`TXA,`TXY: begin res <= x; pc <= pc + 32'd1; end |
`TAX,`TAY,`TAS: begin res <= acc; pc <= pc + 32'd1; end |
`TYA,`TYX: begin res <= y; pc <= pc + 32'd1; end |
61,6 → 61,7
4'h6: res <= dp8; |
4'h7: res <= abs8; |
4'h8: res <= {vbr[31:1],nmoi}; |
4'h9: res <= derr_address; |
4'hE: res <= {spage[31:8],sp}; |
4'hF: res <= isp; |
endcase |
125,6 → 126,8
`LDX_IMM16,`LDA_IMM16: begin res <= {{16{ir[23]}},ir[23:8]}; pc <= pc + 32'd3; end |
`LDX_IMM8,`LDA_IMM8: begin res <= {{24{ir[15]}},ir[15:8]}; pc <= pc + 32'd2; end |
|
`SUB_SP: begin res <= isp - {{24{ir[15]}},ir[15:8]}; pc <= pc + 32'd2; end |
|
`LDX_ZPX,`LDY_ZPX: |
begin |
radr <= zpx32xy_address; |
190,6 → 193,13
pc <= pc + 32'd4; |
state <= STORE1; |
end |
`ST_DSP: |
begin |
wadr <= {{24{ir[23]}},ir[23:16]} + isp; |
wdat <= rfoa; |
pc <= pc + 32'd3; |
state <= STORE1; |
end |
`ST_ABS: |
begin |
wadr <= ir[47:16]; |
264,6 → 274,15
load_what <= `WORD_310; |
state <= LOAD_MAC1; |
end |
`ADD_DSP,`SUB_DSP,`OR_DSP,`AND_DSP,`EOR_DSP: |
begin |
a <= rfoa; |
Rt <= ir[15:12]; |
radr <= {{24{ir[23]}},ir[23:16]} + isp; |
pc <= pc + 32'd3; |
load_what <= `WORD_310; |
state <= LOAD_MAC1; |
end |
`ADD_IX,`SUB_IX,`OR_IX,`AND_IX,`EOR_IX,`ST_IX: |
begin |
a <= rfoa; |
704,6 → 723,8
state <= LOAD_MAC1; |
pc <= pc + 32'd2; |
end |
`MVN: state <= MVN1; |
`MVP: state <= MVP1; |
default: // unimplemented opcode |
begin |
radr <= isp_dec; |
/rtl/verilog/php.v
47,7 → 47,6
stb_o <= 1'b0; |
we_o <= 1'b0; |
sel_o <= 4'h0; |
adr_o <= 34'h0; |
dat_o <= 32'h0; |
state <= BUS_ERROR; |
end |
/rtl/verilog/rtf65002d.v
100,6 → 100,7
`define ADD_ABS 8'h6D |
`define ADD_ABSX 8'h7D |
`define ADD_RIND 8'h72 |
`define ADD_DSP 8'h63 |
|
`define SUB_IMM8 8'hE5 |
`define SUB_IMM16 8'hF9 |
110,6 → 111,7
`define SUB_ABS 8'hED |
`define SUB_ABSX 8'hFD |
`define SUB_RIND 8'hF2 |
`define SUB_DSP 8'hE3 |
|
// CMP = SUB r0,.... |
|
163,6 → 165,7
`define AND_ABSY 8'h39 |
`define AND_RIND 8'h32 |
`define AND_I 8'h32 |
`define AND_DSP 8'h23 |
|
`define OR_IMM8 8'h05 |
`define OR_IMM16 8'h19 |
173,6 → 176,7
`define OR_ABS 8'h0D |
`define OR_ABSX 8'h1D |
`define OR_RIND 8'h12 |
`define OR_DSP 8'h03 |
|
`define ORA_IMM 8'h09 |
`define ORA_ZP 8'h05 |
197,6 → 201,7
`define EOR_ABSY 8'h59 |
`define EOR_RIND 8'h52 |
`define EOR_I 8'h52 |
`define EOR_DSP 8'h43 |
|
// LD is OR rt,r0,.... |
|
206,6 → 211,7
`define ST_ABS 8'h8D |
`define ST_ABSX 8'h9D |
`define ST_RIND 8'h92 |
`define ST_DSP 8'h83 |
|
`define ORB_ZPX 8'hB5 |
`define ORB_IX 8'hA1 |
376,6 → 382,9
`define BEQ_RR 8'hE2 |
`define INT0 8'hDC |
`define INT1 8'hDD |
`define SUB_SP 8'h4B |
`define MVP 8'h44 |
`define MVN 8'h54 |
|
`define NOTHING 4'd0 |
`define SR_70 4'd1 |
392,6 → 401,7
`define IA_70 4'd12 |
`define IA_158 4'd13 |
`define BYTE_71 4'd14 |
`define WORD_312 4'd15 |
|
module icachemem(wclk, wr, adr, dat, rclk, pc, insn); |
input wclk; |
746,6 → 756,11
parameter INSN_BUS_ERROR = 7'd106; |
parameter LOAD_MAC1 = 7'd107; |
parameter LOAD_MAC2 = 7'd108; |
parameter MVN1 = 7'd109; |
parameter MVN2 = 7'd110; |
parameter MVN3 = 7'd111; |
parameter MVP1 = 7'd112; |
parameter MVP2 = 7'd113; |
|
input rst_md; // reset mode, 1=emulation mode, 0=native mode |
input rst_i; |
799,6 → 814,7
wire [31:0] isp_dec = isp - 32'd1; |
wire [31:0] isp_inc = isp + 32'd1; |
reg [31:0] pc; |
reg [31:0] opc; |
wire [31:0] pcp1 = pc + 32'd1; |
wire [31:0] pcp2 = pc + 32'd2; |
wire [31:0] pcp3 = pc + 32'd3; |
876,6 → 892,7
wire [31:0] rdat; |
reg [3:0] load_what; |
reg [3:0] store_what; |
reg [31:0] derr_address; |
reg imiss; |
reg dmiss; |
reg icacheOn,dcacheOn; |
907,6 → 924,7
wire isRTI = ir[7:0]==`RTI; |
wire isRTL = ir[7:0]==`RTL; |
wire isRTS = ir[7:0]==`RTS; |
wire isMove = ir[7:0]==`MVP || ir[7:0]==`MVN; |
wire ld_muldiv = state==DECODE && ir[7:0]==`RR; |
wire md_done; |
wire clk; |
1293,13 → 1311,17
begin |
radr <= isp_dec; |
wadr <= isp_dec; |
wdat <= pc; |
wdat <= opc; |
if (em | isOrb | isStb) |
derr_address <= adr_o[31:0]; |
else |
derr_address <= adr_o[33:2]; |
cyc_o <= 1'b1; |
stb_o <= 1'b1; |
we_o <= 1'b1; |
sel_o <= 4'hF; |
adr_o <= {isp_dec,2'b00}; |
dat_o <= pc; |
dat_o <= opc; |
vect <= {vbr[31:9],9'd508,2'b00}; |
state <= IRQ1; |
end |
1307,17 → 1329,56
begin |
radr <= isp_dec; |
wadr <= isp_dec; |
wdat <= pc; |
wdat <= opc; |
cyc_o <= 1'b1; |
stb_o <= 1'b1; |
we_o <= 1'b1; |
sel_o <= 4'hF; |
adr_o <= {isp_dec,2'b00}; |
dat_o <= pc; |
dat_o <= opc; |
vect <= {vbr[31:9],9'd509,2'b00}; |
state <= IRQ1; |
end |
|
MVN1: |
begin |
radr <= x; |
x <= x + 32'd1; |
retstate <= MVN2; |
load_what <= `WORD_312; |
state <= LOAD_MAC1; |
end |
MVN2: |
begin |
wadr <= y; |
wdat <= b; |
y <= y + 32'd1; |
acc <= acc - 32'd1; |
state <= STORE1; |
end |
MVN3: |
begin |
state <= IFETCH; |
if (acc==32'hFFFFFFFF) |
pc <= pc + 32'd1; |
end |
MVP1: |
begin |
radr <= x; |
x <= x - 32'd1; |
retstate <= MVP2; |
load_what <= `WORD_312; |
state <= LOAD_MAC1; |
end |
MVP2: |
begin |
wadr <= y; |
wdat <= b; |
y <= y - 32'd1; |
acc <= acc - 32'd1; |
state <= STORE1; |
end |
|
endcase |
|
`include "cache_controller.v" |
/rtl/verilog/store.v
48,7 → 48,10
// Clear any previously set lock status |
STORE2: |
if (ack_i) begin |
state <= IFETCH; |
if (isMove) |
state <= MVN3; |
else |
state <= IFETCH; |
lock_o <= 1'b0; |
cyc_o <= 1'b0; |
stb_o <= 1'b0; |
63,7 → 66,10
else if (write_allocate) begin |
dmiss <= `TRUE; |
state <= WAIT_DHIT; |
retstate <= IFETCH; |
if (isMove) |
retstate <= MVN3; |
else |
retstate <= IFETCH; |
end |
end |
else if (err_i) begin |
72,7 → 78,6
stb_o <= 1'b0; |
we_o <= 1'b0; |
sel_o <= 4'h0; |
adr_o <= 34'h0; |
dat_o <= 32'h0; |
state <= BUS_ERROR; |
end |
/rtl/verilog/load_mac.v
43,6 → 43,11
res <= rdat; |
state <= IFETCH; |
end |
`WORD_312: |
begin |
b <= rdat; |
state <= retstate; |
end |
`BYTE_70: |
begin |
b8 <= rdat8; |
191,6 → 196,11
res <= dat_i; |
state <= IFETCH; |
end |
`WORD_312: |
begin |
b <= dat_i; |
state <= retstate; |
end |
`BYTE_70: |
begin |
b8 <= dati; |
326,7 → 336,6
stb_o <= 1'b0; |
we_o <= 1'b0; |
sel_o <= 4'h0; |
adr_o <= 34'h0; |
dat_o <= 32'h0; |
state <= BUS_ERROR; |
end |
/rtl/verilog/ifetch.v
22,6 → 22,7
// |
IFETCH: |
begin |
opc <= pc; |
if (nmi_edge & !imiss & gie) begin // imiss indicates cache controller is active and this state is in a waiting loop |
nmi_edge <= 1'b0; |
wai <= 1'b0; |
220,7 → 221,7
case(ir[7:0]) |
`TAY,`TXY,`DEY,`INY: begin y <= res; nf <= resn32; zf <= resz32; end |
`TAX,`TYX,`TSX,`DEX,`INX: begin x <= res; nf <= resn32; zf <= resz32; end |
`TAS,`TXS: begin isp <= res; gie <= 1'b1; end |
`TAS,`TXS,`SUB_SP: begin isp <= res; gie <= 1'b1; end |
`TSA,`TYA,`TXA,`INA,`DEA: begin acc <= res; nf <= resn32; zf <= resz32; end |
`TRS: |
begin |