📄 ac51_exe_data.v
字号:
ea_base = 16'h0000; ea_indx = 8'h00; end endcaseend // always combassign effaddr = ea_base + ea_indx;always @(posedge clk or negedge rst) begin if(~rst) begin bnk0r0 <= 8'h00; bnk0r1 <= 8'h00; bnk1r0 <= 8'h00; bnk1r1 <= 8'h00; bnk2r0 <= 8'h00; bnk2r1 <= 8'h00; bnk3r0 <= 8'h00; bnk3r1 <= 8'h00; end else begin bnk0r0 <= bnk0r0_nxt; bnk0r1 <= bnk0r1_nxt; bnk1r0 <= bnk1r0_nxt; bnk1r1 <= bnk1r1_nxt; bnk2r0 <= bnk2r0_nxt; bnk2r1 <= bnk2r1_nxt; bnk3r0 <= bnk3r0_nxt; bnk3r1 <= bnk3r1_nxt; endend // alwaysalways @( pc_mux or pc_r or inst1_r or inst2_r or inst3_r or tmp or irdata_i or effaddr) begin case(pc_mux) `PCMUX_ABS: new_pc = {pc_r[15:11], inst1_r[7:5], inst2_r}; `PCMUX_LONG: new_pc = {inst2_r, inst3_r}; `PCMUX_POP: new_pc = {tmp, irdata_i}; `PCMUX_EA: new_pc = effaddr; `PCMUX_INT0: new_pc = 16'h0003; `PCMUX_INT1: new_pc = 16'h000b; `PCMUX_INT2: new_pc = 16'h0013; `PCMUX_INT3: new_pc = 16'h001b; `PCMUX_INT4: new_pc = 16'h0023; `PCMUX_INT5: new_pc = 16'h002b; default: new_pc = 16'h0000; endcaseend // always combalways @(posedge clk or negedge rst) begin if(~rst) cur_pc <= 16'h0000; else cur_pc <= cur_pc_nxt;end // alwaysalways @(cur_pc or cpc_mux or pc_r or pc_nxt) begin case(cpc_mux) `CPCMUX_PCR: cur_pc_nxt = pc_r; `CPCMUX_PCN: cur_pc_nxt = pc_nxt; default: cur_pc_nxt = cur_pc; endcaseend // always combalways @(ina_mux or acc or irdata_i or sp) begin case(ina_mux) `AMUX_ACC: ina = acc; `AMUX_IDATA: ina = irdata_i; `AMUX_SP: ina = sp; default: ina = 8'h00; endcaseend // always combalways @( inb_mux or inst2_r or inst3_r or irdata_i or b_reg or acc) begin case(inb_mux) `BMUX_INST2: inb = inst2_r; `BMUX_IDATA: inb = irdata_i; `BMUX_ONE: inb = 8'h01; `BMUX_BRG: inb = b_reg; `BMUX_ACC: inb = acc; `BMUX_INST3: inb = inst3_r; default: inb = 8'h00; endcaseend // always combalways @(posedge clk or negedge rst) begin if(~rst) tmp <= 8'h00; else tmp <= tmp_nxt;end // alwaysalways @(tmp or tmp_mux or outa or irdata_i) begin case(tmp_mux) `TMUX_OUTA: tmp_nxt = outa; `TMUX_IDATA: tmp_nxt = irdata_i; default: tmp_nxt = tmp; endcaseend // always combassign tmp_zero = ~(| tmp);always @(posedge clk or negedge rst) begin if(~rst) div_tmp <= 16'h0000; else div_tmp <= div_tmp_o;end // alwaysassign div_tmp_i = div_tmp;always @(rs_bits or inst1_r) begin rn_addr = {3'b000, rs_bits, inst1_r[2:0]};end // always combalways @( rs_bits or inst1_r or bnk0r0 or bnk0r1 or bnk1r0 or bnk1r1 or bnk2r0 or bnk2r1 or bnk3r0 or bnk3r1) begin ri_addr = 8'h00; case({rs_bits, inst1_r[0]}) 3'b000: ri_addr = bnk0r0; 3'b001: ri_addr = bnk0r1; 3'b010: ri_addr = bnk1r0; 3'b011: ri_addr = bnk1r1; 3'b100: ri_addr = bnk2r0; 3'b101: ri_addr = bnk2r1; 3'b110: ri_addr = bnk3r0; 3'b111: ri_addr = bnk3r1; endcaseend // always combalways @(inst2_r) begin bit_addr = 8'h00; if(inst2_r[7]) begin // SFR bit_addr = {inst2_r[7:3], 3'b000}; end else begin // 0x20-0x2f bit_addr = {4'b0010, inst2_r[6:3]}; endend // always combalways @( ibus_mux or inst2_r or inst3_r or rn_addr or ri_addr or bit_addr or sp or iwd_mux or acc or outa or outb or pc_r or irdata_i or cur_pc) begin iaddr = 8'h00; idirect = 1'b0; irmw = 1'b0; iwdata = 8'h00; iwen_i = 1'b0; case(ibus_mux) `IMUX_DRD2: begin iaddr = inst2_r; idirect = 1'b1; end `IMUX_DWR2: begin iaddr = inst2_r; idirect = 1'b1; iwen_i = 1'b1; end `IMUX_RNRD: begin iaddr = rn_addr; end `IMUX_RIRD: begin iaddr = ri_addr; end `IMUX_BTRD2: begin iaddr = bit_addr; idirect = 1'b1; end `IMUX_BTWR2: begin iaddr = bit_addr; idirect = 1'b1; iwen_i = 1'b1; end `IMUX_RNWR: begin iaddr = rn_addr; iwen_i = 1'b1; end `IMUX_RIWR: begin iaddr = ri_addr; iwen_i = 1'b1; end `IMUX_OUTA: begin iaddr = outa; iwen_i = 1'b1; end `IMUX_SP: begin iaddr = sp; end `IMUX_DWR3: begin iaddr = inst3_r; idirect = 1'b1; iwen_i = 1'b1; end `IMUX_DRD2RMW: begin iaddr = inst2_r; idirect = 1'b1; irmw = 1'b1; end `IMUX_BTRD2RMW: begin iaddr = bit_addr; idirect = 1'b1; irmw = 1'b1; end endcase case(iwd_mux) `IWDMUX_INST3: iwdata = inst3_r; `IWDMUX_ACC: iwdata = acc; `IWDMUX_OUTA: iwdata = outa; `IWDMUX_INST2: iwdata = inst2_r; `IWDMUX_PCL: iwdata = pc_r[7:0]; `IWDMUX_PCH: iwdata = pc_r[15:8]; `IWDMUX_IDATA: iwdata = irdata_i; `IWDMUX_OUTB: iwdata = outb; `IWDMUX_CPCL: iwdata = cur_pc[7:0]; `IWDMUX_CPCH: iwdata = cur_pc[15:8]; endcaseend // always combalways @( bnk0r0 or bnk0r1 or bnk1r0 or bnk1r1 or bnk2r0 or bnk2r1 or bnk3r0 or bnk3r1 or iwen_i or idirect or iaddr or iwdata) begin bnk0r0_nxt = bnk0r0; bnk0r1_nxt = bnk0r1; bnk1r0_nxt = bnk1r0; bnk1r1_nxt = bnk1r1; bnk2r0_nxt = bnk2r0; bnk2r1_nxt = bnk2r1; bnk3r0_nxt = bnk3r0; bnk3r1_nxt = bnk3r1; iwen = iwen_i; if(iwen_i) begin if({iaddr[7:5], iaddr[2:1]} == 5'b00000) begin iwen = 1'b0; case({iaddr[4:3], iaddr[0]}) 3'b000: bnk0r0_nxt = iwdata; 3'b001: bnk0r1_nxt = iwdata; 3'b010: bnk1r0_nxt = iwdata; 3'b011: bnk1r1_nxt = iwdata; 3'b100: bnk2r0_nxt = iwdata; 3'b101: bnk2r1_nxt = iwdata; 3'b110: bnk3r0_nxt = iwdata; 3'b111: bnk3r1_nxt = iwdata; endcase end if(idirect & iaddr[7]) begin iwen = 1'b0; end endend // always combalways @( sp or dptr or ie_reg or ip_reg or psw or acc or b_reg or idirect or iwen_i or iaddr or iwdata) begin // default sp_nxt2 = sp; dptr_nxt2 = dptr; ie_nxt2 = ie_reg; ip_nxt2 = ip_reg; psw_nxt2 = psw; acc_nxt2 = acc; b_nxt2 = b_reg; iowen = 1'b0; if(idirect & iwen_i) begin if(iaddr[7]) begin case(iaddr[6:0]) 7'h01: // SP sp_nxt2 = iwdata; 7'h02: // DPL dptr_nxt2 = {dptr[15:8], iwdata}; 7'h03: // DPH dptr_nxt2 = {iwdata, dptr[7:0]}; 7'h28: // IE ie_nxt2 = {iwdata[7], iwdata[5:0]}; 7'h38: // IP ip_nxt2 = iwdata[5:0]; 7'h50: begin // PSW psw_nxt2 = iwdata; end 7'h60: // ACC acc_nxt2 = iwdata; 7'h70: // B b_nxt2 = iwdata; default: iowen = 1'b1; endcase end endend // always combassign ioaddr = iaddr[6:0];assign iowdata = iwdata;assign iormw = irmw;always @(posedge clk or negedge rst) begin if(~rst) begin iaddr_d <= 8'h00; idirect_d <= 1'b0; end else begin iaddr_d <= iaddr; idirect_d <= idirect; endend // alwaysalways @( irdata or idirect_d or iaddr_d or iordata or bnk0r0 or bnk0r1 or bnk1r0 or bnk1r1 or bnk2r0 or bnk2r1 or bnk3r0 or bnk3r1 or sp or dptr or ie_reg or ip_reg or psw or acc or b_reg or iordata) begin irdata_i = irdata; if({iaddr_d[7:5], iaddr_d[2:1]} == 5'b00000) begin case({iaddr_d[4:3], iaddr_d[0]}) 3'b000: irdata_i = bnk0r0; 3'b001: irdata_i = bnk0r1; 3'b010: irdata_i = bnk1r0; 3'b011: irdata_i = bnk1r1; 3'b100: irdata_i = bnk2r0; 3'b101: irdata_i = bnk2r1; 3'b110: irdata_i = bnk3r0; 3'b111: irdata_i = bnk3r1; endcase end if(idirect_d) begin if(iaddr_d[7]) begin case(iaddr_d[6:0]) 7'h01: // SP irdata_i = sp; 7'h02: // DPL irdata_i = dptr[7:0]; 7'h03: // DPH irdata_i = dptr[15:8]; 7'h28: // IE irdata_i = {ie_reg[6], 1'b0, ie_reg[5:0]}; 7'h38: // IP irdata_i = {2'b00, ip_reg[5:0]}; 7'h50: // PSW irdata_i = psw; 7'h60: // ACC irdata_i = acc; 7'h70: // B irdata_i = b_reg; default: irdata_i = iordata; endcase end endend // always combalways @(inst2_r or irdata_i) begin bit_data = 1'b0; case(inst2_r[2:0]) 3'b000: bit_data = irdata_i[0]; 3'b001: bit_data = irdata_i[1]; 3'b010: bit_data = irdata_i[2]; 3'b011: bit_data = irdata_i[3]; 3'b100: bit_data = irdata_i[4]; 3'b101: bit_data = irdata_i[5]; 3'b110: bit_data = irdata_i[6]; 3'b111: bit_data = irdata_i[7]; endcaseend // always combalways @(pbus_mux or effaddr) begin case(pbus_mux) `PMUX_RD_EA: begin paddr = effaddr; pen = 1'b1; end default: begin paddr = 16'h0000; pen = 1'b0; end endcaseend // always combalways @(xbus_mux or dptr or p2 or ri_addr or acc) begin xaddr = 16'h0000; xen = 1'b0; xwdata = 8'h00; xwen = 1'b0; case(xbus_mux) `XMUX_DPTR_RD: begin xaddr = dptr; xen = 1'b1; end `XMUX_RI_RD: begin xaddr = {p2, ri_addr}; xen = 1'b1; end `XMUX_DPTR_WR: begin xaddr = dptr; xen = 1'b1; xwdata = acc; xwen = 1'b1; end `XMUX_RI_WR: begin xaddr = {p2, ri_addr}; xen = 1'b1; xwdata = acc; xwen = 1'b1; end endcaseend // always combendmodule// End of ac51_exe_data.v
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -