📄 ac51_exe_data.v
字号:
//// ac51_exe_data.v//// ac51 microcontroller core//// Version 0.6//// Copyright 2008, Hideyuki Abe. All rights reserved.// Distributed under the terms of the MIT License.//`include "ac51_defs.v"module ac51_exe_data( clk, rst, pc_nxt, inst1, inst2, inst3, inst1_r, inst_ack, pc_mux, cpc_mux, sp_mux, dptr_mux, new_pc, acc_mux, acc_zero, breg_mux, ina_mux, inb_mux, ina, inb, div_tmp_i, cy_bit, ac_bit, ov_bit, outa, outb, div_tmp_o, new_cy, new_ac, new_ov, tmp_mux, tmp_zero, bit_data, flg_upd, ea_mux, ibus_mux, iwd_mux, iaddr, iwdata, irdata, iwen, ioaddr, iowdata, iordata, iormw, iowen, pbus_mux, paddr, pen, prdata, xbus_mux, xaddr, p2, xen, xwdata, xrdata, xwen, int_pri, int_enb);input clk;input rst;input [15:0] pc_nxt;input [7:0] inst1;input [7:0] inst2;input [7:0] inst3;output [7:0] inst1_r;input inst_ack;input [`PCMUX_LEN - 1:0] pc_mux;input [`CPCMUX_LEN - 1:0] cpc_mux;input [`SPMUX_LEN - 1:0] sp_mux;input [`DPMUX_LEN - 1:0] dptr_mux;output [15:0] new_pc;input [`ACCMUX_LEN - 1:0] acc_mux;output acc_zero;input [`BRGMUX_LEN - 1:0] breg_mux;input [`AMUX_LEN - 1:0] ina_mux;input [`BMUX_LEN - 1:0] inb_mux;output [7:0] ina;output [7:0] inb;output [15:0] div_tmp_i;output cy_bit;output ac_bit;output ov_bit;input [7:0] outa;input [7:0] outb;input [15:0] div_tmp_o;input new_cy;input new_ac;input new_ov;input [`TMUX_LEN - 1:0] tmp_mux;output tmp_zero;output bit_data;input [2:0] flg_upd; // bit0 - ac, bit1 - cy, bit2 - ovinput [`EAMUX_LEN - 1:0] ea_mux;input [`IMUX_LEN - 1:0] ibus_mux;input [`IWDMUX_LEN - 1:0] iwd_mux;output [7:0] iaddr;output [7:0] iwdata;input [7:0] irdata;output iwen;output [6:0] ioaddr;output [7:0] iowdata;input [7:0] iordata;output iormw;output iowen;input [`PMUX_LEN - 1:0] pbus_mux;output [15:0] paddr;output pen;input [7:0] prdata;input [`XMUX_LEN - 1:0] xbus_mux;output [15:0] xaddr;input [7:0] p2; // port 2 for Ri-indirect xaddroutput xen;output [7:0] xwdata;input [7:0] xrdata;output xwen;output [5:0] int_pri;output [5:0] int_enb;reg [15:0] pc_r;reg [7:0] inst1_r;reg [7:0] inst2_r;reg [7:0] inst3_r;reg [15:0] new_pc;reg [15:0] cur_pc;reg [15:0] cur_pc_nxt;reg [15:0] ea_base;reg [15:0] ea_indx;wire [15:0] effaddr;// internal data area interfacereg [7:0] iaddr;reg idirect;reg irmw;reg [7:0] iwdata;reg iwen;// sfr area interfacewire [6:0] ioaddr;wire [7:0] iowdata;wire [7:0] iordata;wire iormw;reg iowen;reg iwen_i;// program area interfacereg [15:0] paddr;reg pen;// ex data area interfacereg [15:0] xaddr;reg xen;reg [7:0] xwdata;reg xwen;reg [7:0] bnk0r0;reg [7:0] bnk0r1;reg [7:0] bnk1r0;reg [7:0] bnk1r1;reg [7:0] bnk2r0;reg [7:0] bnk2r1;reg [7:0] bnk3r0;reg [7:0] bnk3r1;reg [7:0] bnk0r0_nxt;reg [7:0] bnk0r1_nxt;reg [7:0] bnk1r0_nxt;reg [7:0] bnk1r1_nxt;reg [7:0] bnk2r0_nxt;reg [7:0] bnk2r1_nxt;reg [7:0] bnk3r0_nxt;reg [7:0] bnk3r1_nxt;reg [7:0] acc;reg [7:0] acc_nxt;reg [7:0] acc_nxt2;reg [7:0] b_reg;reg [7:0] b_nxt;reg [7:0] b_nxt2;reg [7:0] sp;reg [7:0] sp_nxt;reg [7:0] sp_nxt2;reg [15:0] dptr;reg [15:0] dptr_nxt;reg [15:0] dptr_nxt2;reg cy_bit;reg ac_bit;reg f0_bit;reg [1:0] rs_bits;reg ov_bit;reg p_bit;wire [7:0] psw;reg cy_nxt;reg ac_nxt;reg f0_nxt;reg [1:0] rs_nxt;reg ov_nxt;reg [7:0] psw_nxt2;reg [6:0] ie_reg;reg [5:0] ip_reg;reg [6:0] ie_nxt;reg [5:0] ip_nxt;reg [6:0] ie_nxt2;reg [5:0] ip_nxt2;// ALU interfacereg [7:0] ina;reg [7:0] inb;// temporary regreg [7:0] tmp;reg [7:0] tmp_nxt;reg [15:0] div_tmp;reg bit_data;reg [7:0] rn_addr;reg [7:0] ri_addr;reg [7:0] bit_addr;reg [7:0] iaddr_d;reg idirect_d;reg [7:0] irdata_i;always @(posedge clk or negedge rst) begin if(~rst) begin pc_r <= 16'h0000; inst1_r <= 8'h00; inst2_r <= 8'h00; inst3_r <= 8'h00; end else if(inst_ack) begin pc_r <= pc_nxt; inst1_r <= inst1; inst2_r <= inst2; inst3_r <= inst3; endend // alwaysalways @(posedge clk or negedge rst) begin if(~rst) ac_bit <= 1'b0; else ac_bit <= ac_nxt;end // alwaysalways @(psw_nxt2 or flg_upd or new_ac) begin ac_nxt = psw_nxt2[6]; if(flg_upd[0]) ac_nxt = new_ac;end // always combalways @(posedge clk or negedge rst) begin if(~rst) cy_bit <= 1'b0; else cy_bit <= cy_nxt;end // alwaysalways @(psw_nxt2 or flg_upd or new_cy) begin cy_nxt = psw_nxt2[7]; if(flg_upd[1]) cy_nxt = new_cy;end // always combalways @(posedge clk or negedge rst) begin if(~rst) ov_bit <= 1'b0; else ov_bit <= ov_nxt;end // alwaysalways @(psw_nxt2 or flg_upd or new_ov) begin ov_nxt = psw_nxt2[2]; if(flg_upd[2]) ov_nxt = new_ov;end // always combalways @(posedge clk or negedge rst) begin if(~rst) f0_bit <= 1'b0; else f0_bit <= f0_nxt;end // alwaysalways @(psw_nxt2) begin f0_nxt = psw_nxt2[5];end // always combalways @(posedge clk or negedge rst) begin if(~rst) rs_bits <= 2'b00; else rs_bits <= rs_nxt;end // alwaysalways @(psw_nxt2) begin rs_nxt = psw_nxt2[4:3];end // always combalways @(acc) begin p_bit = ^acc;end // always combassign psw = {cy_bit, ac_bit, f0_bit, rs_bits, ov_bit, 1'b0, p_bit};always @(posedge clk or negedge rst) begin if(~rst) ie_reg <= 7'b0000000; else ie_reg <= ie_nxt;end // alwaysassign int_enb = {6{ie_reg[6]}} & ie_reg[5:0];always @(ie_nxt2) begin ie_nxt = ie_nxt2;end // always combalways @(posedge clk or negedge rst) begin if(~rst) ip_reg <= 6'b00_0000; else ip_reg <= ip_nxt;end // alwaysassign int_pri = ip_reg;always @(ip_nxt2) begin ip_nxt = ip_nxt2;end // always combalways @(posedge clk or negedge rst) begin if(~rst) acc <= 1'b0; else acc <= acc_nxt;end // alwaysassign acc_zero = ~(| acc);always @( acc_nxt2 or acc_mux or irdata_i or outa or outb or inst2_r or prdata or xrdata) begin case(acc_mux) `ACCMUX_IDATA: acc_nxt = irdata_i; `ACCMUX_OUTA: acc_nxt = outa; `ACCMUX_ZERO: acc_nxt = 8'h00; `ACCMUX_INST2: acc_nxt = inst2_r; `ACCMUX_PDATA: acc_nxt = prdata; `ACCMUX_XDATA: acc_nxt = xrdata; `ACCMUX_OUTB: acc_nxt = outb; default: acc_nxt = acc_nxt2; endcaseend // always combalways @(posedge clk or negedge rst) begin if(~rst) b_reg <= 8'h00; else b_reg <= b_nxt;end // alwaysalways @(b_nxt2 or breg_mux or outa or outb) begin case(breg_mux) `BRGMUX_OUTB: b_nxt = outb; `BRGMUX_OUTA: b_nxt = outa; default: b_nxt = b_nxt2; endcaseend // always combalways @(posedge clk or negedge rst) begin if(~rst) sp <= 8'h07; else sp <= sp_nxt;end // alwaysalways @(sp_nxt2 or sp_mux or outa) begin case(sp_mux) `SPMUX_OUTA: sp_nxt = outa; default: sp_nxt = sp_nxt2; endcaseend // always combalways @(posedge clk or negedge rst) begin if(~rst) dptr <= 16'h0000; else dptr <= dptr_nxt;end // alwaysalways @( dptr_nxt2 or dptr_mux or inst2_r or inst3_r or effaddr) begin case(dptr_mux) `DPMUX_INST23: dptr_nxt = {inst2_r, inst3_r}; `DPMUX_EA: dptr_nxt = effaddr; default: dptr_nxt = dptr_nxt2; endcaseend // always combalways @( ea_mux or dptr or pc_r or acc or inst2_r or inst3_r) begin case(ea_mux) `EAMUX_INCDPTR: begin ea_base = dptr; ea_indx = 16'h0001; end `EAMUX_ADPTR: begin ea_base = dptr; ea_indx = {8'h00, acc}; end `EAMUX_APC: begin ea_base = pc_r; ea_indx = {8'h00, acc}; end `EAMUX_REL2: begin ea_base = pc_r; ea_indx = {{8{inst2_r[7]}}, inst2_r}; end `EAMUX_REL3: begin ea_base = pc_r; ea_indx = {{8{inst3_r[7]}}, inst3_r}; end default: begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -