📄 oc8051_sfr.v
字号:
.data_lo(dptr_lo), .wr_sfr(wr_sfr));////program status word// PSWoc8051_psw oc8051_psw1 (.clk(clk), .rst(rst), .wr_addr(adr1), .data_in(dat1), .wr(we), .wr_bit(wr_bit_r), .data_out(psw), .p(p), .cy_in(bit_in), .ac_in(desAc), .ov_in(desOv), .set(psw_set), .bank_sel(bank_sel));//// ports// P0, P1, P2, P3`ifdef OC8051_PORTS oc8051_ports oc8051_ports1(.clk(clk), .rst(rst), .bit_in(bit_in), .data_in(dat1), .wr(we), .wr_bit(wr_bit_r), .wr_addr(adr1), `ifdef OC8051_PORT0 .p0_out(p0_out), .p0_in(p0_in), .p0_data(p0_data), `endif `ifdef OC8051_PORT1 .p1_out(p1_out), .p1_in(p1_in), .p1_data(p1_data), `endif `ifdef OC8051_PORT2 .p2_out(p2_out), .p2_in(p2_in), .p2_data(p2_data), `endif `ifdef OC8051_PORT3 .p3_out(p3_out), .p3_in(p3_in), .p3_data(p3_data), `endif .rmw(rmw));`endif//// serial interface// SCON, SBUF`ifdef OC8051_UART oc8051_uart oc8051_uatr1 (.clk(clk), .rst(rst), .bit_in(bit_in), .data_in(dat1), .wr(we), .wr_bit(wr_bit_r), .wr_addr(adr1), .rxd(rxd), .txd(txd), // interrupt .intr(uart_int), // baud rate sources .brate2(brate2), .t1_ow(tf1), .pres_ow(pres_ow), .rclk(rclk), .tclk(tclk), //registers .scon(scon), .pcon(pcon), .sbuf(sbuf));`else assign uart_int = 1'b0;`endif//// interrupt control// IP, IE, TCONoc8051_int oc8051_int1 (.clk(clk), .rst(rst), .wr_addr(adr1), .bit_in(bit_in), .ack(int_ack), .data_in(dat1), .wr(we), .wr_bit(wr_bit_r), .tf0(tf0), .tf1(tf1), .t2_int(tc2_int), .tr0(tr0), .tr1(tr1), .ie0(int0), .ie1(int1), .uart_int(uart_int), .reti(reti), .intr(intr), .int_vec(int_src), .ie(ie), .tcon(tcon), .ip(ip));//// timer/counter control// TH0, TH1, TL0, TH1, TMOD`ifdef OC8051_TC01 oc8051_tc oc8051_tc1(.clk(clk), .rst(rst), .wr_addr(adr1), .data_in(dat1), .wr(we), .wr_bit(wr_bit_r), .ie0(int0), .ie1(int1), .tr0(tr0), .tr1(tr1), .t0(t0), .t1(t1), .tf0(tf0), .tf1(tf1), .pres_ow(pres_ow), .tmod(tmod), .tl0(tl0), .th0(th0), .tl1(tl1), .th1(th1));`else assign tf0 = 1'b0; assign tf1 = 1'b0;`endif//// timer/counter 2// TH2, TL2, RCAPL2L, RCAPL2H, T2CON`ifdef OC8051_TC2 oc8051_tc2 oc8051_tc21(.clk(clk), .rst(rst), .wr_addr(adr1), .data_in(dat1), .wr(we), .wr_bit(wr_bit_r), .bit_in(bit_in), .t2(t2), .t2ex(t2ex), .rclk(rclk), .tclk(tclk), .brate2(brate2), .tc2_int(tc2_int), .pres_ow(pres_ow), .t2con(t2con), .tl2(tl2), .th2(th2), .rcap2l(rcap2l), .rcap2h(rcap2h));`else assign tc2_int = 1'b0; assign rclk = 1'b0; assign tclk = 1'b0; assign brate2 = 1'b0;`endifalways @(posedge clk or posedge rst) if (rst) begin adr0_r <= #1 8'h00; ram_wr_sel_r <= #1 3'b000; wr_bit_r <= #1 1'b0;// wait_data <= #1 1'b0; end else begin adr0_r <= #1 adr0; ram_wr_sel_r <= #1 ram_wr_sel; wr_bit_r <= #1 wr_bit; endassign comp_wait = !( ((comp_sel==`OC8051_CSS_AZ) & ((wr_sfr==`OC8051_WRS_ACC1) | (wr_sfr==`OC8051_WRS_ACC2) | ((adr1==`OC8051_SFR_ACC) & we & !wr_bit_r) | ((adr1[7:3]==`OC8051_SFR_B_ACC) & we & wr_bit_r))) | ((comp_sel==`OC8051_CSS_CY) & ((|psw_set) | ((adr1==`OC8051_SFR_PSW) & we & !wr_bit_r) | ((adr1[7:3]==`OC8051_SFR_B_PSW) & we & wr_bit_r))) | ((comp_sel==`OC8051_CSS_BIT) & ((adr1[7:3]==adr0[7:3]) & (~&adr1[2:0]) & we & !wr_bit_r) | ((adr1==adr0) & adr1[7] & we & !wr_bit_r)));////set output in case of address (byte)always @(posedge clk or posedge rst)begin if (rst) begin dat0 <= #1 8'h00; wait_data <= #1 1'b0; end else if ((wr_sfr==`OC8051_WRS_DPTR) & (adr0==`OC8051_SFR_DPTR_LO)) begin //write and read same address dat0 <= #1 des_acc; wait_data <= #1 1'b0; end else if ( ( ((wr_sfr==`OC8051_WRS_ACC1) & (adr0==`OC8051_SFR_ACC)) | //write to acc// ((wr_sfr==`OC8051_WRS_DPTR) & (adr0==`OC8051_SFR_DPTR_LO)) | //write to dpl (adr1[7] & (adr1==adr0) & we & !wr_bit_r) | //write and read same address (adr1[7] & (adr1[7:3]==adr0[7:3]) & (~&adr0[2:0]) & we & wr_bit_r) //write bit addressable to read address ) & !wait_data) begin wait_data <= #1 1'b1; end else if (( ((|psw_set) & (adr0==`OC8051_SFR_PSW)) | ((wr_sfr==`OC8051_WRS_ACC2) & (adr0==`OC8051_SFR_ACC)) | //write to acc ((wr_sfr==`OC8051_WRS_DPTR) & (adr0==`OC8051_SFR_DPTR_HI)) //write to dph ) & !wait_data) begin wait_data <= #1 1'b1; end else begin case (adr0) /* synopsys full_case parallel_case */ `OC8051_SFR_ACC: dat0 <= #1 acc; `OC8051_SFR_PSW: dat0 <= #1 psw;`ifdef OC8051_PORTS `ifdef OC8051_PORT0 `OC8051_SFR_P0: dat0 <= #1 p0_data; `endif `ifdef OC8051_PORT1 `OC8051_SFR_P1: dat0 <= #1 p1_data; `endif `ifdef OC8051_PORT2 `OC8051_SFR_P2: dat0 <= #1 p2_data; `endif `ifdef OC8051_PORT3 `OC8051_SFR_P3: dat0 <= #1 p3_data; `endif`endif `OC8051_SFR_SP: dat0 <= #1 sp; `OC8051_SFR_B: dat0 <= #1 b_reg; `OC8051_SFR_DPTR_HI: dat0 <= #1 dptr_hi; `OC8051_SFR_DPTR_LO: dat0 <= #1 dptr_lo;`ifdef OC8051_UART `OC8051_SFR_SCON: dat0 <= #1 scon; `OC8051_SFR_SBUF: dat0 <= #1 sbuf; `OC8051_SFR_PCON: dat0 <= #1 pcon;`endif`ifdef OC8051_TC01 `OC8051_SFR_TH0: dat0 <= #1 th0; `OC8051_SFR_TH1: dat0 <= #1 th1; `OC8051_SFR_TL0: dat0 <= #1 tl0; `OC8051_SFR_TL1: dat0 <= #1 tl1; `OC8051_SFR_TMOD: dat0 <= #1 tmod;`endif `OC8051_SFR_IP: dat0 <= #1 ip; `OC8051_SFR_IE: dat0 <= #1 ie; `OC8051_SFR_TCON: dat0 <= #1 tcon;`ifdef OC8051_TC2 `OC8051_SFR_RCAP2H: dat0 <= #1 rcap2h; `OC8051_SFR_RCAP2L: dat0 <= #1 rcap2l; `OC8051_SFR_TH2: dat0 <= #1 th2; `OC8051_SFR_TL2: dat0 <= #1 tl2; `OC8051_SFR_T2CON: dat0 <= #1 t2con;`endif// default: dat0 <= #1 8'h00; endcase wait_data <= #1 1'b0; endend////set output in case of address (bit)always @(posedge clk or posedge rst)begin if (rst) bit_out <= #1 1'h0; else if ( ((adr1[7:3]==adr0[7:3]) & (~&adr1[2:0]) & we & !wr_bit_r) | ((wr_sfr==`OC8051_WRS_ACC1) & (adr0[7:3]==`OC8051_SFR_B_ACC)) //write to acc ) bit_out <= #1 dat1[adr0[2:0]]; else if ((adr1==adr0) & we & wr_bit_r) bit_out <= #1 bit_in; else case (adr0[7:3]) /* synopsys full_case parallel_case */ `OC8051_SFR_B_ACC: bit_out <= #1 acc[adr0[2:0]]; `OC8051_SFR_B_PSW: bit_out <= #1 psw[adr0[2:0]];`ifdef OC8051_PORTS `ifdef OC8051_PORT0 `OC8051_SFR_B_P0: bit_out <= #1 p0_data[adr0[2:0]]; `endif `ifdef OC8051_PORT1 `OC8051_SFR_B_P1: bit_out <= #1 p1_data[adr0[2:0]]; `endif `ifdef OC8051_PORT2 `OC8051_SFR_B_P2: bit_out <= #1 p2_data[adr0[2:0]]; `endif `ifdef OC8051_PORT3 `OC8051_SFR_B_P3: bit_out <= #1 p3_data[adr0[2:0]]; `endif`endif `OC8051_SFR_B_B: bit_out <= #1 b_reg[adr0[2:0]]; `OC8051_SFR_B_IP: bit_out <= #1 ip[adr0[2:0]]; `OC8051_SFR_B_IE: bit_out <= #1 ie[adr0[2:0]]; `OC8051_SFR_B_TCON: bit_out <= #1 tcon[adr0[2:0]];`ifdef OC8051_UART `OC8051_SFR_B_SCON: bit_out <= #1 scon[adr0[2:0]];`endif`ifdef OC8051_TC2 `OC8051_SFR_B_T2CON: bit_out <= #1 t2con[adr0[2:0]];`endif// default: bit_out <= #1 1'b0; endcaseendalways @(posedge clk or posedge rst)begin if (rst) begin prescaler <= #1 4'h0; pres_ow <= #1 1'b0; end else if (prescaler==4'b1011) begin prescaler <= #1 4'h0; pres_ow <= #1 1'b1; end else begin prescaler <= #1 prescaler + 4'h1; pres_ow <= #1 1'b0; endendendmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -