OpenCores
URL https://opencores.org/ocsvn/8051/8051/trunk

Subversion Repositories 8051

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 138 to Rev 139
    Reverse comparison

Rev 138 → Rev 139

/trunk/rtl/verilog/oc8051_defines.v
90,7 → 90,7
`define OC8051_ALU_RLC 4'b1011
`define OC8051_ALU_RR 4'b1100
`define OC8051_ALU_RRC 4'b1101
`define OC8051_ALU_PCS 4'b1110
`define OC8051_ALU_INC 4'b1110
`define OC8051_ALU_XCH 4'b1111
 
//
/trunk/rtl/verilog/oc8051_indi_addr.v
45,6 → 45,9
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.5 2003/01/13 14:14:41 simont
// replace some modules
//
// Revision 1.4 2002/09/30 17:33:59 simont
// prepared header
//
55,95 → 58,64
// synopsys translate_on
 
 
module oc8051_indi_addr (clk, rst, rd_addr, wr_addr, data_in, wr, wr_bit, rn_out, ri_out, sel, bank);
module oc8051_indi_addr (clk, rst, wr_addr, data_in, wr, wr_bit, ri_out, sel, bank);
//
// clk (in) clock
// rst (in) reset
// addr (in) write address [oc8051_ram_wr_sel.out]
// data_in (in) data input (alu destination1) [oc8051_alu.des1]
// wr (in) write [oc8051_decoder.wr -r]
// wr_bit (in) write bit addresable [oc8051_decoder.bit_addr -r]
// data_out (out) data output [oc8051_ram_rd_sel.ri, oc8051_ram_wr_sel.ri -r]
// sel (in) select register [oc8051_op_select.op1_out[0] ]
// bank (in) select register bank: [oc8051_psw.data_out[4:3] ]
//
 
 
input clk, rst, wr, wr_bit;
input [1:0] bank;
input [2:0] sel;
input [7:0] data_in;
input [7:0] rd_addr, wr_addr;
input clk, // clock
rst, // reset
wr, // write
sel, // select register
wr_bit; // write bit addressable
input [1:0] bank; // select register bank
input [7:0] data_in; // data input
input [7:0] wr_addr; // write address
 
output [7:0] rn_out, ri_out;
output [7:0] ri_out;
 
reg [7:0] rn_out;
 
reg [7:0] buff [31:0];
//reg [7:0] buff [31:0];
reg wr_bit_r;
wire rd_ram, rd_ind;
 
 
wire tmp;
assign tmp = ~|wr_addr[7:5];
reg [7:0] buff [0:7];
 
//
//write to buffer
always @(posedge clk or posedge rst)
begin
if (rst) begin
buff[0] <= #1 8'h00;
buff[1] <= #1 8'h00;
buff[2] <= #1 8'h00;
buff[3] <= #1 8'h00;
buff[4] <= #1 8'h00;
buff[5] <= #1 8'h00;
buff[6] <= #1 8'h00;
buff[7] <= #1 8'h00;
buff[8] <= #1 8'h00;
buff[9] <= #1 8'h00;
buff[10] <= #1 8'h00;
buff[11] <= #1 8'h00;
buff[12] <= #1 8'h00;
buff[13] <= #1 8'h00;
buff[14] <= #1 8'h00;
buff[15] <= #1 8'h00;
buff[16] <= #1 8'h00;
buff[17] <= #1 8'h00;
buff[18] <= #1 8'h00;
buff[19] <= #1 8'h00;
buff[20] <= #1 8'h00;
buff[21] <= #1 8'h00;
buff[22] <= #1 8'h00;
buff[23] <= #1 8'h00;
buff[24] <= #1 8'h00;
buff[25] <= #1 8'h00;
buff[26] <= #1 8'h00;
buff[27] <= #1 8'h00;
buff[28] <= #1 8'h00;
buff[29] <= #1 8'h00;
buff[30] <= #1 8'h00;
buff[31] <= #1 8'h00;
end else if ((wr) && !(wr_bit_r) && (tmp)) begin
buff[wr_addr[4:0]] <= #1 data_in;
buff[3'b000] <= #1 8'h00;
buff[3'b001] <= #1 8'h00;
buff[3'b010] <= #1 8'h00;
buff[3'b011] <= #1 8'h00;
buff[3'b100] <= #1 8'h00;
buff[3'b101] <= #1 8'h00;
buff[3'b110] <= #1 8'h00;
buff[3'b111] <= #1 8'h00;
end else begin
if ((wr) & !(wr_bit_r)) begin
case (wr_addr)
8'h00: buff[3'b000] <= #1 data_in;
8'h01: buff[3'b001] <= #1 data_in;
8'h08: buff[3'b010] <= #1 data_in;
8'h09: buff[3'b011] <= #1 data_in;
8'h10: buff[3'b100] <= #1 data_in;
8'h11: buff[3'b101] <= #1 data_in;
8'h18: buff[3'b110] <= #1 data_in;
8'h19: buff[3'b111] <= #1 data_in;
endcase
end
end
end
 
//
//read from buffer
assign rd_ram = (rd_addr== wr_addr);
assign rd_ind = ({3'h0, bank, 2'b00, sel[0]}==wr_addr);
assign ri_out = ( rd_ind & (wr) & !wr_bit) ? data_in : buff[{bank, 2'b00, sel[0]}];
 
always @(posedge clk or posedge rst)
if (rst) begin
rn_out <= #1 8'h00;
end else if ( rd_ram & (wr) & !wr_bit) begin
rn_out <= #1 data_in;
end else begin
rn_out <= #1 buff[rd_addr[4:0]];
end
assign ri_out = (({3'b000, bank, 2'b00, sel}==wr_addr) & (wr) & !wr_bit_r) ?
data_in : buff[{bank, sel}];
 
 
 
always @(posedge clk or posedge rst)
if (rst) begin
wr_bit_r <= #1 1'b0;
/trunk/rtl/verilog/oc8051_alu.v
46,6 → 46,9
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.13 2003/04/29 08:35:12 simont
// fix bug in substraction.
//
// Revision 1.12 2003/04/25 17:15:51 simont
// change branch instruction execution (reduse needed clock periods).
//
68,8 → 71,8
 
 
 
module oc8051_alu (clk, rst, op_code, src1, src2, src3, srcCy, srcAc, bit_in, des1, des2, desCy,
desAc, desOv);
module oc8051_alu (clk, rst, op_code, src1, src2, src3, srcCy, srcAc, bit_in,
des1, des2, des_acc, desCy, desAc, desOv);
//
// op_code (in) operation code [oc8051_decoder.alu_op -r]
// src1 (in) first operand [oc8051_alu_src1_sel.des]
85,14 → 88,14
// desOv (out) Overflow output [oc8051_psw.ov_in]
//
 
input srcCy, srcAc, bit_in, clk, rst;
input [3:0] op_code;
input [7:0] src1, src2, src3;
output desCy, desAc, desOv;
output [7:0] des1, des2;
input srcCy, srcAc, bit_in, clk, rst;
input [3:0] op_code;
input [7:0] src1, src2, src3;
output desCy, desAc, desOv;
output [7:0] des1, des2, des_acc;
 
reg desCy, desAc, desOv;
reg [7:0] des1, des2;
reg [7:0] des1, des2, des_acc;
 
 
//
129,6 → 132,11
reg da_tmp;
//reg [8:0] da1;
 
//
// inc
//
wire [15:0] inc, dec;
 
oc8051_multiply oc8051_mul1(.clk(clk), .rst(rst), .enable(enable_mul), .src1(src1), .src2(src2), .des1(mulsrc1), .des2(mulsrc2), .desOv(mulOv));
oc8051_divide oc8051_div1(.clk(clk), .rst(rst), .enable(enable_div), .src1(src1), .src2(src2), .des1(divsrc1), .des2(divsrc2), .desOv(divOv));
 
164,14 → 172,20
assign subb = {1'b0,!sub8[3]};
assign subc = sub9-suba-subb;
 
/* inc */
assign inc = {src2, src1} + {15'h0, 1'b1};
assign dec = {src2, src1} - {15'h0, 1'b1};
 
always @(op_code or src1 or src2 or srcCy or srcAc or bit_in or src3 or mulsrc1 or mulsrc2 or mulOv or divsrc1 or divsrc2 or divOv or addc or add8 or add4 or sub4 or sub8 or subc or da_tmp)
always @(op_code or src1 or src2 or srcCy or srcAc or bit_in or src3 or mulsrc1
or mulsrc2 or mulOv or divsrc1 or divsrc2 or divOv or addc or add8 or add4
or sub4 or sub8 or subc or da_tmp or inc or dec)
begin
 
case (op_code)
//operation add
`OC8051_ALU_ADD: begin
des1 = {addc[0],add8[2:0],add4[3:0]};
des_acc = {addc[0],add8[2:0],add4[3:0]};
des1 = src1;
des2 = src3+ {7'b0, addc[1]};
desCy = addc[1];
desAc = add4[4];
182,7 → 196,8
end
//operation subtract
`OC8051_ALU_SUB: begin
des1 = {subc[0],sub8[2:0],sub4[3:0]};
des_acc = {subc[0],sub8[2:0],sub4[3:0]};
des1 = src1;
des2 = 8'h00;
desCy = !subc[1];
desAc = !sub4[4];
193,7 → 208,8
end
//operation multiply
`OC8051_ALU_MUL: begin
des1 = mulsrc1;
des_acc = mulsrc1;
des1 = src1;
des2 = mulsrc2;
desOv = mulOv;
desCy = 1'b0;
203,7 → 219,8
end
//operation divide
`OC8051_ALU_DIV: begin
des1 = divsrc1;
des_acc = divsrc1;
des1 = src1;
des2 = divsrc2;
desOv = divOv;
desAc = 1'bx;
214,13 → 231,15
//operation decimal adjustment
`OC8051_ALU_DA: begin
 
if (srcAc==1'b1 | src1[3:0]>4'b1001) {da_tmp, des1[3:0]} = {1'b0, src1[3:0]}+ 5'b00110;
else {da_tmp, des1[3:0]} = {1'b0, src1[3:0]};
if (srcAc==1'b1 | src1[3:0]>4'b1001) {da_tmp, des_acc[3:0]} = {1'b0, src1[3:0]}+ 5'b00110;
else {da_tmp, des_acc[3:0]} = {1'b0, src1[3:0]};
 
if (srcCy==1'b1 | src1[7:4]>4'b1001)
{desCy, des1[7:4]} = {srcCy, src1[7:4]}+ 5'b00110 + {4'b0, da_tmp};
else {desCy, des1[7:4]} = {srcCy, src1[7:4]} + {4'b0, da_tmp};
{desCy, des_acc[7:4]} = {srcCy, src1[7:4]}+ 5'b00110 + {4'b0, da_tmp};
else {desCy, des_acc[7:4]} = {srcCy, src1[7:4]} + {4'b0, da_tmp};
 
des1 = src1;
 
des2 = 8'h00;
desAc = 1'b0;
desOv = 1'b0;
230,6 → 249,7
//operation not
// bit operation not
`OC8051_ALU_NOT: begin
des_acc = ~src1;
des1 = ~src1;
des2 = 8'h00;
desCy = !srcCy;
241,6 → 261,7
//operation and
//bit operation and
`OC8051_ALU_AND: begin
des_acc = src1 & src2;
des1 = src1 & src2;
des2 = 8'h00;
desCy = srcCy & bit_in;
252,6 → 273,7
//operation xor
// bit operation xor
`OC8051_ALU_XOR: begin
des_acc = src1 ^ src2;
des1 = src1 ^ src2;
des2 = 8'h00;
desCy = srcCy ^ bit_in;
263,6 → 285,7
//operation or
// bit operation or
`OC8051_ALU_OR: begin
des_acc = src1 | src2;
des1 = src1 | src2;
des2 = 8'h00;
desCy = srcCy | bit_in;
274,7 → 297,8
//operation rotate left
// bit operation cy= cy or (not ram)
`OC8051_ALU_RL: begin
des1 = {src1[6:0], src1[7]};
des_acc = {src1[6:0], src1[7]};
des1 = src1 ;
des2 = 8'h00;
desCy = srcCy | !bit_in;
desAc = 1'bx;
284,7 → 308,8
end
//operation rotate left with carry and swap nibbles
`OC8051_ALU_RLC: begin
des1 = {src1[6:0], srcCy};
des_acc = {src1[6:0], srcCy};
des1 = src1 ;
des2 = {src1[3:0], src1[7:4]};
desCy = src1[7];
desAc = 1'b0;
294,7 → 319,8
end
//operation rotate right
`OC8051_ALU_RR: begin
des1 = {src1[0], src1[7:1]};
des_acc = {src1[0], src1[7:1]};
des1 = src1 ;
des2 = 8'h00;
desCy = srcCy & !bit_in;
desAc = 1'b0;
304,7 → 330,8
end
//operation rotate right with carry
`OC8051_ALU_RRC: begin
des1 = {srcCy, src1[7:1]};
des_acc = {srcCy, src1[7:1]};
des1 = src1 ;
des2 = 8'h00;
desCy = src1[0];
desAc = 1'b0;
313,25 → 340,32
enable_div = 1'b0;
end
//operation pcs Add
/* `OC8051_ALU_PCS: begin
if (src1[7]) begin
{desCy, des1} = {1'b0, src2} + {1'b0, src1};
des2 = {1'b0, src3} - {8'h0, !desCy};
end else {des2, des1} = {src3,src2} + {8'h00, src1};
`OC8051_ALU_INC: begin
if (srcCy) begin
des_acc = dec[7:0];
des1 = dec[7:0];
des2 = dec[15:8];
end else begin
des_acc = inc[7:0];
des1 = inc[7:0];
des2 = inc[15:8];
end
desCy = 1'b0;
desAc = 1'b0;
desOv = 1'b0;
enable_mul = 1'b0;
enable_div = 1'b0;
end*/
end
//operation exchange
//if carry = 0 exchange low order digit
`OC8051_ALU_XCH: begin
if (srcCy)
begin
des_acc = src2;
des1 = src2;
des2 = src1;
end else begin
des_acc = {src1[7:4],src2[3:0]};
des1 = {src1[7:4],src2[3:0]};
des2 = {src2[7:4],src1[3:0]};
end
342,6 → 376,7
enable_div = 1'b0;
end
default: begin
des_acc = src1;
des1 = src1;
des2 = src2;
desCy = srcCy;
/trunk/rtl/verilog/oc8051_memory_interface.v
44,6 → 44,9
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.5 2003/04/25 17:15:51 simont
// change branch instruction execution (reduse needed clock periods).
//
// Revision 1.4 2003/04/16 10:04:09 simont
// chance idat_ir to 24 bit wide
//
89,10 → 92,10
intr, int_v, int_ack,
 
//alu
des1, des2,
des_acc, des1, des2,
 
//sfr's
dptr, ri, rn_mem, sp, sp_w, rn, acc, reti);
dptr, ri, sp, sp_w, rn, acc, reti);
 
input bit_in, sfr_bit, dack_i;
input [2:0] mem_act;
104,7 → 107,7
 
reg bit_out, reti;
reg [7:0] iram_out, sp_r;
reg [2:0] rd_addr_r;
reg rd_addr_r;
input clk, rst, wr_i, wr_bit_i;
output wr_o, wr_bit_o;
 
119,7 → 122,7
//
/////////////////////////////
input iack_i;
input [7:0] des1, des2;
input [7:0] des_acc, des1, des2;
output [15:0] iadr_o;
 
wire ea_rom_sel;
129,7 → 132,7
// ext_addr_sel
//
/////////////////////////////
input [7:0] ri, rn_mem, ddat_i;
input [7:0] ri, ddat_i;
input [15:0] dptr;
 
output dstb_o, dwe_o;
216,7 → 219,7
assign bank = rn[4:3];
assign imm = op2_out;
assign imm2 = op3_out;
assign alu = {des2,des1};
assign alu = {des2, des_acc};
assign ea_rom_sel = ea && ea_int;
assign wr_o = wr_i;
assign wr_bit_o = wr_bit_i;
234,15 → 237,12
//
// ram_select
//
/////////////////////////////
always @(rd_addr_r or in_ram or sfr or bit_in or sfr_bit or rn_mem or rd_ind)
///////////////////////////// ??????????????????????
always @(rd_addr_r or in_ram or sfr or bit_in or sfr_bit or rd_ind)
begin
if (rd_addr_r[2] && !rd_ind) begin
if (rd_addr_r && !rd_ind) begin
iram_out = sfr;
bit_out = sfr_bit;
end else if (~|rd_addr_r[2:0]) begin
iram_out = rn_mem;
bit_out = bit_in;
end else begin
iram_out = in_ram;
bit_out = bit_in;
257,18 → 257,18
 
always @(rd_sel or sp or ri or rn or imm or op1_out or dadr_o[15:0] or bank)
begin
case (rd_sel)
`OC8051_RRS_RN : rd_addr = {3'h0, rn};
`OC8051_RRS_I : rd_addr = ri;
`OC8051_RRS_D : rd_addr = imm;
`OC8051_RRS_SP : rd_addr = sp;
case (rd_sel)
`OC8051_RRS_RN : rd_addr = {3'h0, rn};
`OC8051_RRS_I : rd_addr = ri;
`OC8051_RRS_D : rd_addr = imm;
`OC8051_RRS_SP : rd_addr = sp;
 
`OC8051_RRS_B : rd_addr = `OC8051_SFR_B;
`OC8051_RRS_DPTR : rd_addr = `OC8051_SFR_DPTR_LO;
`OC8051_RRS_PSW : rd_addr = `OC8051_SFR_PSW;
`OC8051_RRS_ACC : rd_addr = `OC8051_SFR_ACC;
default : rd_addr = 2'bxx;
endcase
`OC8051_RRS_B : rd_addr = `OC8051_SFR_B;
`OC8051_RRS_DPTR : rd_addr = `OC8051_SFR_DPTR_LO;
`OC8051_RRS_PSW : rd_addr = `OC8051_SFR_PSW;
`OC8051_RRS_ACC : rd_addr = `OC8051_SFR_ACC;
default : rd_addr = 2'bxx;
endcase
 
end
 
277,15 → 277,15
//
always @(wr_sel or sp_w or rn_r or imm_r or ri_r or imm2_r or op1_r or dadr_o[15:0])
begin
case (wr_sel)
`OC8051_RWS_RN : wr_addr = {3'h0, rn_r};
`OC8051_RWS_I : wr_addr = ri_r;
`OC8051_RWS_D : wr_addr = imm_r;
`OC8051_RWS_SP : wr_addr = sp_w;
`OC8051_RWS_D3 : wr_addr = imm2_r;
`OC8051_RWS_B : wr_addr = `OC8051_SFR_B;
default : wr_addr = 2'bxx;
endcase
case (wr_sel)
`OC8051_RWS_RN : wr_addr = {3'h0, rn_r};
`OC8051_RWS_I : wr_addr = ri_r;
`OC8051_RWS_D : wr_addr = imm_r;
`OC8051_RWS_SP : wr_addr = sp_w;
`OC8051_RWS_D3 : wr_addr = imm2_r;
`OC8051_RWS_B : wr_addr = `OC8051_SFR_B;
default : wr_addr = 2'bxx;
endcase
end
 
always @(posedge clk or posedge rst)
312,7 → 312,7
// output address is alu destination
// (instructions MOVC)
 
assign iadr_ot = istb_t ? iadr_t : pc;
assign iadr_ot = (istb_t & !iack_i) ? iadr_t : pc;
assign iadr_o = iadr_ot;
 
 
332,7 → 332,7
end else if (ea_rom_sel && !imem_wait && istb_t) begin
istb_t <= #1 1'b0;
end else if (mem_act==`OC8051_MAS_CODE) begin
iadr_t <= #1 {des2, des1};
iadr_t <= #1 alu;
istb_t <= #1 1'b1;
imem_wait <= #1 1'b1;
end
497,7 → 497,7
//
/////////////////////////////
 
always @(pc_buf or op1_out or pc_wait or int_buff or int_buff1 or alu[7:0] or ea_rom_sel or iack_i)
always @(pc_buf or op1_out or pc_wait or int_buff or int_buff1 or ea_rom_sel or iack_i)
begin
if (int_buff || int_buff1) begin
//
655,7 → 655,7
ri_r <= #1 8'h00;
imm_r <= #1 8'h00;
imm2_r <= #1 8'h00;
rd_addr_r <= #1 3'h0;
rd_addr_r <= #1 1'b0;
op1_r <= #1 8'h0;
dack_ir <= #1 1'b0;
sp_r <= #1 1'b0;
664,7 → 664,7
ri_r <= #1 ri;
imm_r <= #1 imm;
imm2_r <= #1 imm2;
rd_addr_r <= #1 rd_addr[7:5];
rd_addr_r <= #1 rd_addr[7];
op1_r <= #1 op1_out;
dack_ir <= #1 dack_i;
sp_r <= #1 sp;
/trunk/rtl/verilog/oc8051_sfr.v
44,6 → 44,9
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.12 2003/04/29 11:24:31 simont
// fix bug in case execution of two data dependent instructions.
//
// Revision 1.11 2003/04/25 17:15:51 simont
// change branch instruction execution (reduse needed clock periods).
//
89,6 → 92,7
module oc8051_sfr (rst, clk,
adr0, adr1, dat0,
dat1, dat2, bit_in,
des_acc,
we, wr_bit,
bit_out,
wr_sfr, acc,
95,7 → 99,7
ram_wr_sel, ram_rd_sel,
sp, sp_w,
bank_sel,
desAc, desOv,
desAc, desOv,
srcAc, cy,
psw_set, rmw,
comp_sel,
166,6 → 170,7
ram_wr_sel;
input [7:0] adr0, //address 0 input
adr1, //address 1 input
des_acc,
dat1, //data 1 input (des1)
dat2; //data 2 input (des2)
 
300,13 → 305,13
oc8051_acc oc8051_acc1(.clk(clk),
.rst(rst),
.bit_in(bit_in),
.data_in(dat1),
.data2_in(dat2),
.wr(we),
.wr_bit(wr_bit_r),
.data_in(des_acc),
.data2_in(dat2),
.wr(we),
.wr_bit(wr_bit_r),
.wr_sfr(wr_sfr),
.wr_addr(adr1),
.data_out(acc),
.wr_addr(adr1),
.data_out(acc),
.p(p));
 
 
313,10 → 318,10
//
// b register
// B
oc8051_b_register oc8051_b_register (.clk(clk),
.rst(rst),
oc8051_b_register oc8051_b_register (.clk(clk),
.rst(rst),
.bit_in(bit_in),
.data_in(dat1),
.data_in(des_acc),
.wr(we),
.wr_bit(wr_bit_r),
.wr_addr(adr1),
342,7 → 347,7
oc8051_dptr oc8051_dptr1(.clk(clk),
.rst(rst),
.addr(adr1),
.data_in(dat1),
.data_in(des_acc),
.data2_in(dat2),
.wr(we),
.wr_bit(wr_bit_r),
/trunk/rtl/verilog/oc8051_top.v
44,6 → 44,9
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.26 2003/04/29 11:24:31 simont
// fix bug in case execution of two data dependent instructions.
//
// Revision 1.25 2003/04/25 17:15:51 simont
// change branch instruction execution (reduse needed clock periods).
//
230,7 → 233,6
dptr_hi,
dptr_lo,
ri,
rn_mem,
data_out,
op1,
op2,
282,6 → 284,7
wire [7:0] src1, //alu sources 1
src2, //alu sources 2
src3, //alu sources 3
des_acc,
des1, //alu destination 1
des2; //alu destinations 2
wire desCy, //carry out
357,7 → 360,7
//
//alu
oc8051_alu oc8051_alu1(.rst(wb_rst_i),
.clk(wb_clk_i),
.clk(wb_clk_i),
.op_code(alu_op),
.src1(src1),
.src2(src2),
364,6 → 367,7
.src3(src3),
.srcCy(alu_cy),
.srcAc(srcAc),
.des_acc(des_acc),
.des1(des1),
.des2(des2),
.desCy(desCy),
414,7 → 418,7
.b_in(bit_out),
.cy(cy),
.acc(acc),
.des(des1)
.des(des_acc)
);
 
 
445,14 → 449,12
//
oc8051_indi_addr oc8051_indi_addr1 (.clk(wb_clk_i),
.rst(wb_rst_i),
.rd_addr(rd_addr),
.wr_addr(wr_addr),
.data_in(wr_dat),
.data_in(wr_dat),
.wr(wr_o),
.wr_bit(bit_addr_o),
.rn_out(rn_mem),
.ri_out(ri),
.sel(op1_cur),
.ri_out(ri),
.sel(op1_cur[0]),
.bank(bank_sel));
 
 
468,15 → 470,16
.wr_bit_i(bit_addr),
.wr_bit_o(bit_addr_o),
.wr_dat(wr_dat),
.des_acc(des_acc),
.des1(des1),
.des2(des2),
.rd_addr(rd_addr),
.rd_addr(rd_addr),
.wr_addr(wr_addr),
.wr_ind(wr_ind),
.bit_in(bit_data),
.bit_in(bit_data),
.in_ram(ram_data),
.sfr(sfr_out),
.sfr_bit(sfr_bit),
.sfr(sfr_out),
.sfr_bit(sfr_bit),
.bit_out(bit_out),
.iram_out(ram_out),
 
487,34 → 490,34
.istb_o(istb_o),
 
// internal instruction rom
.op1_i(op1_i),
.op2_i(op2_i),
.op1_i(op1_i),
.op2_i(op2_i),
.op3_i(op3_i),
 
// data memory
.dadr_o(wbd_adr_o),
.dadr_o(wbd_adr_o),
.ddat_o(wbd_dat_o),
.dwe_o(wbd_we_o),
.dwe_o(wbd_we_o),
.dstb_o(wbd_stb_o),
.ddat_i(wbd_dat_i),
.ddat_i(wbd_dat_i),
.dack_i(wbd_ack_i),
 
// from decoder
.rd_sel(ram_rd_sel),
.wr_sel(ram_wr_sel),
.rd_sel(ram_rd_sel),
.wr_sel(ram_wr_sel),
.rn({bank_sel, op1_cur}),
.rd_ind(rd_ind),
.rd(rd),
.mem_act(mem_act),
.mem_act(mem_act),
.mem_wait(mem_wait),
 
// external access
.ea(ea_in),
.ea(ea_in),
.ea_int(ea_int),
 
// instructions outputs to cpu
.op1_out(op1_n),
.op2_out(op2_n),
.op1_out(op1_n),
.op2_out(op2_n),
.op3_out(op3_n),
 
// interrupt interface
533,8 → 536,7
.sp_w(sp_w),
.dptr({dptr_hi, dptr_lo}),
.ri(ri),
.rn_mem(rn_mem),
.acc(acc),
.acc(acc),
.sp(sp)
);
 
546,10 → 548,11
.clk(wb_clk_i),
.adr0(rd_addr[7:0]),
.adr1(wr_addr[7:0]),
.dat0(sfr_out),
.dat1(wr_dat),
.dat2(des2),
.we(wr_o && !wr_ind),
.dat0(sfr_out),
.dat1(wr_dat),
.dat2(des2),
.des_acc(des_acc),
.we(wr_o && !wr_ind),
.bit_in(desCy),
.bit_out(sfr_bit),
.wr_bit(bit_addr_o),
/trunk/rtl/verilog/oc8051_decoder.v
45,6 → 45,9
// CVS Revision History
//
// $Log: not supported by cvs2svn $
// Revision 1.17 2003/04/25 17:15:51 simont
// change branch instruction execution (reduse needed clock periods).
//
// Revision 1.16 2003/04/09 16:24:03 simont
// change wr_sft to 2 bit wire.
//
1039,7 → 1042,7
pc_sel = `OC8051_PIS_SO2;
comp_sel = `OC8051_CSS_BIT;
rmw = `OC8051_RMW_N;
stb_i = 1'b1;
stb_i = 1'b0;
bit_addr = 1'b1;
end
`OC8051_JBC : begin
1048,7 → 1051,7
pc_sel = `OC8051_PIS_DC;
comp_sel = `OC8051_CSS_BIT;
rmw = `OC8051_RMW_N;
stb_i = 1'b1;
stb_i = 1'b0;
bit_addr = 1'b1;
end
`OC8051_JC : begin
1057,7 → 1060,7
pc_sel = `OC8051_PIS_SO1;
comp_sel = `OC8051_CSS_CY;
rmw = `OC8051_RMW_N;
stb_i = 1'b1;
stb_i = 1'b0;
bit_addr = 1'b0;
end
`OC8051_JMP_D : begin
1076,7 → 1079,7
pc_sel = `OC8051_PIS_SO2;
comp_sel = `OC8051_CSS_BIT;
rmw = `OC8051_RMW_N;
stb_i = 1'b1;
stb_i = 1'b0;
bit_addr = 1'b1;
end
`OC8051_JNC : begin
1085,7 → 1088,7
pc_sel = `OC8051_PIS_SO1;
comp_sel = `OC8051_CSS_CY;
rmw = `OC8051_RMW_N;
stb_i = 1'b1;
stb_i = 1'b0;
bit_addr = 1'b0;
end
`OC8051_JNZ : begin
1094,7 → 1097,7
pc_sel = `OC8051_PIS_SO1;
comp_sel = `OC8051_CSS_AZ;
rmw = `OC8051_RMW_N;
stb_i = 1'b1;
stb_i = 1'b0;
bit_addr = 1'b0;
end
`OC8051_JZ : begin
1103,7 → 1106,7
pc_sel = `OC8051_PIS_SO1;
comp_sel = `OC8051_CSS_AZ;
rmw = `OC8051_RMW_N;
stb_i = 1'b1;
stb_i = 1'b0;
bit_addr = 1'b0;
end
`OC8051_LCALL :begin
1392,7 → 1395,7
pc_sel = `OC8051_PIS_SO1;
comp_sel = `OC8051_CSS_DC;
rmw = `OC8051_RMW_N;
stb_i = 1'b1;
stb_i = 1'b0;
bit_addr = 1'b0;
end
`OC8051_SUBB_D : begin
1800,7 → 1803,7
ram_wr_sel <= #1 `OC8051_RWS_RN;
src_sel1 <= #1 `OC8051_AS1_RAM;
src_sel2 <= #1 `OC8051_AS2_ZERO;
alu_op <= #1 `OC8051_ALU_SUB;
alu_op <= #1 `OC8051_ALU_INC;
wr <= #1 1'b1;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_1;
1811,7 → 1814,7
ram_wr_sel <= #1 `OC8051_RWS_RN;
src_sel1 <= #1 `OC8051_AS1_RAM;
src_sel2 <= #1 `OC8051_AS2_ZERO;
alu_op <= #1 `OC8051_ALU_SUB;
alu_op <= #1 `OC8051_ALU_INC;
wr <= #1 1'b1;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_1;
1822,10 → 1825,10
ram_wr_sel <= #1 `OC8051_RWS_RN;
src_sel1 <= #1 `OC8051_AS1_RAM;
src_sel2 <= #1 `OC8051_AS2_ZERO;
alu_op <= #1 `OC8051_ALU_ADD;
alu_op <= #1 `OC8051_ALU_INC;
wr <= #1 1'b1;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_1;
cy_sel <= #1 `OC8051_CY_0;
src_sel3 <= #1 `OC8051_AS3_DC;
wr_sfr <= #1 `OC8051_WRS_N;
end
1978,7 → 1981,7
ram_wr_sel <= #1 `OC8051_RWS_I;
src_sel1 <= #1 `OC8051_AS1_RAM;
src_sel2 <= #1 `OC8051_AS2_ZERO;
alu_op <= #1 `OC8051_ALU_SUB;
alu_op <= #1 `OC8051_ALU_INC;
wr <= #1 1'b1;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_1;
1989,10 → 1992,10
ram_wr_sel <= #1 `OC8051_RWS_I;
src_sel1 <= #1 `OC8051_AS1_RAM;
src_sel2 <= #1 `OC8051_AS2_ZERO;
alu_op <= #1 `OC8051_ALU_ADD;
alu_op <= #1 `OC8051_ALU_INC;
wr <= #1 1'b1;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_1;
cy_sel <= #1 `OC8051_CY_0;
src_sel3 <= #1 `OC8051_AS3_DC;
wr_sfr <= #1 `OC8051_WRS_N;
end
2343,7 → 2346,7
ram_wr_sel <= #1 `OC8051_RWS_DC;
src_sel1 <= #1 `OC8051_AS1_ACC;
src_sel2 <= #1 `OC8051_AS2_ZERO;
alu_op <= #1 `OC8051_ALU_SUB;
alu_op <= #1 `OC8051_ALU_INC;
wr <= #1 1'b0;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_1;
2354,7 → 2357,7
ram_wr_sel <= #1 `OC8051_RWS_D;
src_sel1 <= #1 `OC8051_AS1_RAM;
src_sel2 <= #1 `OC8051_AS2_ZERO;
alu_op <= #1 `OC8051_ALU_SUB;
alu_op <= #1 `OC8051_ALU_INC;
wr <= #1 1'b1;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_1;
2376,7 → 2379,7
ram_wr_sel <= #1 `OC8051_RWS_D;
src_sel1 <= #1 `OC8051_AS1_RAM;
src_sel2 <= #1 `OC8051_AS2_ZERO;
alu_op <= #1 `OC8051_ALU_SUB;
alu_op <= #1 `OC8051_ALU_INC;
wr <= #1 1'b1;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_1;
2387,10 → 2390,10
ram_wr_sel <= #1 `OC8051_RWS_DC;
src_sel1 <= #1 `OC8051_AS1_ACC;
src_sel2 <= #1 `OC8051_AS2_ZERO;
alu_op <= #1 `OC8051_ALU_ADD;
alu_op <= #1 `OC8051_ALU_INC;
wr <= #1 1'b0;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_1;
cy_sel <= #1 `OC8051_CY_0;
src_sel3 <= #1 `OC8051_AS3_DC;
wr_sfr <= #1 `OC8051_WRS_ACC1;
end
2398,10 → 2401,10
ram_wr_sel <= #1 `OC8051_RWS_D;
src_sel1 <= #1 `OC8051_AS1_RAM;
src_sel2 <= #1 `OC8051_AS2_ZERO;
alu_op <= #1 `OC8051_ALU_ADD;
alu_op <= #1 `OC8051_ALU_INC;
wr <= #1 1'b1;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_1;
cy_sel <= #1 `OC8051_CY_0;
src_sel3 <= #1 `OC8051_AS3_DC;
wr_sfr <= #1 `OC8051_WRS_N;
end
2418,9 → 2421,9
end
`OC8051_JB : begin
ram_wr_sel <= #1 `OC8051_RWS_DC;
src_sel1 <= #1 `OC8051_AS1_OP3;
src_sel2 <= #1 `OC8051_AS2_PCL;
alu_op <= #1 `OC8051_ALU_PCS;
src_sel1 <= #1 `OC8051_AS1_DC;
src_sel2 <= #1 `OC8051_AS2_DC;
alu_op <= #1 `OC8051_ALU_NOP;
wr <= #1 1'b0;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_0;
2429,9 → 2432,9
end
`OC8051_JBC :begin
ram_wr_sel <= #1 `OC8051_RWS_DC;
src_sel1 <= #1 `OC8051_AS1_OP3;
src_sel2 <= #1 `OC8051_AS2_PCL;
alu_op <= #1 `OC8051_ALU_PCS;
src_sel1 <= #1 `OC8051_AS1_DC;
src_sel2 <= #1 `OC8051_AS2_DC;
alu_op <= #1 `OC8051_ALU_NOP;
wr <= #1 1'b0;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_0;
2440,9 → 2443,9
end
`OC8051_JC : begin
ram_wr_sel <= #1 `OC8051_RWS_DC;
src_sel1 <= #1 `OC8051_AS1_OP2;
src_sel2 <= #1 `OC8051_AS2_PCL;
alu_op <= #1 `OC8051_ALU_PCS;
src_sel1 <= #1 `OC8051_AS1_DC;
src_sel2 <= #1 `OC8051_AS2_DC;
alu_op <= #1 `OC8051_ALU_NOP;
wr <= #1 1'b0;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_0;
2462,9 → 2465,9
end
`OC8051_JNB : begin
ram_wr_sel <= #1 `OC8051_RWS_DC;
src_sel1 <= #1 `OC8051_AS1_OP3;
src_sel2 <= #1 `OC8051_AS2_PCL;
alu_op <= #1 `OC8051_ALU_PCS;
src_sel1 <= #1 `OC8051_AS1_DC;
src_sel2 <= #1 `OC8051_AS2_DC;
alu_op <= #1 `OC8051_ALU_NOP;
wr <= #1 1'b0;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_0;
2473,9 → 2476,9
end
`OC8051_JNC : begin
ram_wr_sel <= #1 `OC8051_RWS_DC;
src_sel1 <= #1 `OC8051_AS1_OP2;
src_sel2 <= #1 `OC8051_AS2_PCL;
alu_op <= #1 `OC8051_ALU_PCS;
src_sel1 <= #1 `OC8051_AS1_DC;
src_sel2 <= #1 `OC8051_AS2_DC;
alu_op <= #1 `OC8051_ALU_NOP;
wr <= #1 1'b0;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_0;
2484,9 → 2487,9
end
`OC8051_JNZ :begin
ram_wr_sel <= #1 `OC8051_RWS_DC;
src_sel1 <= #1 `OC8051_AS1_OP2;
src_sel2 <= #1 `OC8051_AS2_PCL;
alu_op <= #1 `OC8051_ALU_PCS;
src_sel1 <= #1 `OC8051_AS1_DC;
src_sel2 <= #1 `OC8051_AS2_DC;
alu_op <= #1 `OC8051_ALU_NOP;
wr <= #1 1'b0;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_0;
2495,9 → 2498,9
end
`OC8051_JZ : begin
ram_wr_sel <= #1 `OC8051_RWS_DC;
src_sel1 <= #1 `OC8051_AS1_OP2;
src_sel2 <= #1 `OC8051_AS2_PCL;
alu_op <= #1 `OC8051_ALU_PCS;
src_sel1 <= #1 `OC8051_AS1_DC;
src_sel2 <= #1 `OC8051_AS2_DC;
alu_op <= #1 `OC8051_ALU_NOP;
wr <= #1 1'b0;
psw_set <= #1 `OC8051_PS_NOT;
cy_sel <= #1 `OC8051_CY_0;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.