⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 debug.v

📁 q6805.zip
💻 V
📖 第 1 页 / 共 2 页
字号:

assign ZERO_OR_ONE = (CNTR_VAL[7:1] == 7'b0) & EVNT_EN;

always @(posedge TCK or posedge TRST) begin
	if (TRST) begin
		CNTR_DR <= 'b0;
	end
	else begin
		if (SEL_EVNT_CNTR & UPDAT_DR) begin
			CNTR_DR <= D;
		end
	end
end

always @(posedge CPU_CLK or posedge TRST) begin
	if (TRST) begin
		CNTR_VAL <= 'b0;
	end
	else if (EVNT_EN) begin
		
		if (ZERO_OR_ONE) begin
			CNTR_VAL <= CNTR_DR;
		end
		else begin
			CNTR_VAL <= CNTR_VAL - 1'b1;
		end
   end
end


always @(posedge XCLK_L) begin
	Latch_Sync <= !LTCH_CNTR;
end


always @(Latch_Sync or CNTR_VAL or EVNT_CNT_VAL) begin
	if(Latch_Sync) begin
		EVNT_CNT_VAL = CNTR_VAL;
	end
	else begin
		EVNT_CNT_VAL = EVNT_CNT_VAL;
	end
end

always @(CNTR_DR or CNTR_VAL or EVNT_EN) begin
	if (CNTR_DR == 8'h01) begin
		CNTR_EVNT = EVNT_EN;
	end
	else begin
		CNTR_EVNT = (CNTR_VAL == 8'h02) & EVNT_EN;
	end
end


endmodule // evnt_cnt


module disc_stk( 
				BRK_IN_SRVC, 
				BRK_PND, 
				CLR_STK, 
				CNTR_EVNT, 
				CPU_CLK, 
				CPU_DISCNTY,
             	CPU_FRST_W, 
             	CPU_PC, 
             	CPU_RDY, 
             	D, 
             	DISABL_STK, 
             	DSTK_OUT,
             	DSTK_SEL, 
             	EVNT_EN, 
             	LTCH_CNTR, 
             	RESET, 
             	SEL_EVNT_CNTR, 
             	TCK,
            	UPDAT_DR, 
            	XCLK_L );

input BRK_IN_SRVC; 
input BRK_PND; 
input CLR_STK;
output CNTR_EVNT;
input CPU_CLK; 
input CPU_DISCNTY; 
input CPU_FRST_W;
input [15:0] CPU_PC;
input CPU_RDY;
input [7:0] D;
input DISABL_STK;
output [7:0] DSTK_OUT;
input [3:0] DSTK_SEL;
input EVNT_EN; 
input LTCH_CNTR; 
input RESET; 
input SEL_EVNT_CNTR; 
input TCK; 
input UPDAT_DR; 
input XCLK_L;


reg BufReset;
reg Stack_Enable;
reg [1:0] PUSH;

reg	[15:0] PC_Reg;
reg	[15:0] DSTK_A;
reg	[15:0] DSTK_B;
reg	[15:0] DSTK_C;
reg [7:0]  DSTK_OUT;


wire PUSH_2;
wire Capture_PC;
wire [7:0] ECV;
wire [7:0] CNTR_DR;


assign PUSH_2 = Stack_Enable & (|PUSH[1:0]) & CPU_RDY & !BRK_IN_SRVC;
assign Capture_PC = Stack_Enable & CPU_RDY & CPU_FRST_W & !(BRK_PND | BRK_IN_SRVC);

evnt_cnt evnt_cnt1 ( .CNTR_DR({ CNTR_DR[7:0] }), .CNTR_EVNT(CNTR_EVNT),
             .CPU_CLK(CPU_CLK), .D({ D[7:0] }), .EVNT_CNT_VAL({ ECV[7:0] }),
             .EVNT_EN(EVNT_EN), .LTCH_CNTR(LTCH_CNTR),
             .SEL_EVNT_CNTR(SEL_EVNT_CNTR), .TCK(TCK), .TRST(RESET),
             .UPDAT_DR(UPDAT_DR), .XCLK_L(XCLK_L) );


always @(posedge CPU_CLK) begin						// this block synchronizes JTAG control signals
	BufReset <= RESET | CLR_STK;					// to the CPU clock
	Stack_Enable <= !DISABL_STK;
	if(CPU_RDY) begin
		PUSH[0] <= CPU_DISCNTY & !BRK_IN_SRVC;		// this is a one-shot for generating a PUSH signal
		PUSH[1] <= PUSH[0];							// the push is two cycles long (two pushes)
	end
end

always @(posedge CPU_CLK or posedge BufReset) begin
	if (BufReset) begin
		PC_Reg <= 16'h0000;							// clear trace buffer to 0
		DSTK_A <= 16'h0000;
		DSTK_B <= 16'h0000;
		DSTK_C <= 16'h0000;
	end
	else begin
		if (Capture_PC) begin						// anytime there is an opcode fetch and the buffer is
			PC_Reg <= CPU_PC;						// enabled, then capture the PC
		end
		if (PUSH_2) begin						   	// the PUSH_2 signal is two cycles long and everyone is 
			DSTK_A <= PC_Reg;					   	// pushed twice if there is a discontinuity and the 
			DSTK_B <= DSTK_A;					   	// buffer is enabled
			DSTK_C <= DSTK_B;
		end
	end
end

always @(DSTK_A or DSTK_B or DSTK_C or PC_Reg or ECV or CNTR_DR or DSTK_SEL) begin
	case (DSTK_SEL[3:0])
		4'b0000 : DSTK_OUT = DSTK_A[7:0];
		4'b0001 : DSTK_OUT = DSTK_A[15:8];
		4'b0010 : DSTK_OUT = DSTK_B[7:0];
		4'b0011 : DSTK_OUT = DSTK_B[15:8];
		4'b0100 : DSTK_OUT = DSTK_C[7:0];
		4'b0101 : DSTK_OUT = DSTK_C[15:8];
		4'b0110 : DSTK_OUT = PC_Reg[7:0];
		4'b0111 : DSTK_OUT = PC_Reg[15:8];
		4'b1000 : DSTK_OUT = ECV[7:0];
		4'b1100 : DSTK_OUT = CNTR_DR[7:0];
		default : DSTK_OUT = 'bx;
	endcase
end

endmodule // disc_stk


module debug( BREAK, BRK_CMPLT, BRK_IN_SRVC, BRK_PND, BRK_REQ, CLR_MFUNC, CNTR_EVNT,
             CPU_CLK, CPU_DISC, CPU_FRST_WRD, CPU_FTCH, CPU_PC, CPU_RD,
             CPU_RDY, CPU_RESET, CPU_STOP, CPU_WAIT, CPU_WR, DB, EVNT0_IN,
             EXT_RESET_IN, IACKq, MFUNC_CMPLT, MFUNC_REQ, MON_ADR, MON_DAT,
             MON_EXC, MON_IN_SRVC, MON_OPCD, MSR_CMPLT, STK_PTR, TCK, TDI,
             TDO, TDO_OE, TMS, XCLK_L, XTCK, XTRST);

output BREAK;
input BRK_CMPLT, BRK_IN_SRVC, BRK_PND;
output BRK_REQ, CLR_MFUNC, CNTR_EVNT;
input CPU_CLK, CPU_DISC, CPU_FRST_WRD, CPU_FTCH;
input [15:0] CPU_PC;
input CPU_RD, CPU_RDY;
output CPU_RESET;
input CPU_STOP, CPU_WAIT, CPU_WR;
input [7:0] DB;
input EVNT0_IN, EXT_RESET_IN, IACKq, MFUNC_CMPLT;
output MFUNC_REQ;
output [15:0] MON_ADR;
output [7:0] MON_DAT;
input MON_EXC, MON_IN_SRVC;
output [7:0] MON_OPCD;
input MSR_CMPLT;
input [7:0] STK_PTR;
input TCK, TDI;
output TDO, TDO_OE;
input TMS, XCLK_L, XTCK, XTRST;

reg [7:0] CNTRL;
reg [7:0] MON_DB;
reg [7:0] STAK_PTR;
reg       TDO;


wire [7:0] STATUS;
wire [7:0] SHFTR;
wire [15:0] Y;
wire [7:0] IR;
wire [7:0] DSTK;
wire [15:0] CMPR;
wire [4:0] CYCL_EN;
wire SHIFT_IR;
wire SHIFT_DR;
wire CLOCK_DR;
wire CLOCK_IR;
wire J_RESET;
wire UPDAT_DR;
wire SEL_BYP;
wire SELECT;
wire SOUT_IR;
wire SOUT_DR;
wire SOUT_BYP;
wire EVNT_TERM_CNT;
wire EVNT_DET;
wire BRK_REQq;
wire CPU_RESET;
wire CNTR_EVNT;
wire CLR_MFUNC;
wire BRK_REQ;
wire BREAK;
wire UPDATE_IR;
wire FETCH1;
wire IACK1;
wire WRQ1;

wire J_RESETo;
wire FRST_WORD_OR_CPU_RESET;

assign CPU_RESET = EXT_RESET_IN | CNTRL[0];
assign CNTR_EVNT = XCLK_L & EVNT_TERM_CNT;
assign CLR_MFUNC = UPDAT_DR & Y[12];
assign BRK_REQ   = XCLK_L & BRK_REQq;
assign BREAK     = BRK_PND | BRK_IN_SRVC | BRK_REQ;

assign FRST_WORD_OR_CPU_RESET = CPU_RESET | CPU_FRST_WRD;

assign J_RESET = J_RESETo;

disc_stk disc_stk ( 
		.BRK_IN_SRVC(BRK_IN_SRVC), 
		.BRK_PND(BRK_PND),
      	.CLR_STK(CNTRL[5]), 
      	.CNTR_EVNT(EVNT_TERM_CNT), 
      	.CPU_CLK(CPU_CLK),
        .CPU_DISCNTY(CPU_DISC), 
        .CPU_FRST_W(FRST_WORD_OR_CPU_RESET),
        .CPU_PC({ CPU_PC[15:0] }), 
        .CPU_RDY(CPU_RDY),
        .D({ SHFTR[7:0] }), 
        .DISABL_STK(CNTRL[6]),
        .DSTK_OUT({ DSTK[7:0] }), 
        .DSTK_SEL({ IR[3:0] }),
        .EVNT_EN(EVNT_DET), 
        .LTCH_CNTR(CNTRL[4]), 
        .RESET(J_RESET),
        .SEL_EVNT_CNTR(Y[13]), 
        .TCK(TCK), 
        .UPDAT_DR(UPDAT_DR),
        .XCLK_L(XCLK_L) );

jtg_stat jtg_stat ( 
		.STAT0(BRK_IN_SRVC), 
		.STAT1(BRK_CMPLT), 
		.STAT2(CPU_STOP),
        .STAT3(CPU_WAIT), 
        .STAT4(CPU_RESET), 
        .STAT5(MON_IN_SRVC),
        .STAT6(MSR_CMPLT), 
        .STAT7(MFUNC_CMPLT), 
        .STATUS({ STATUS[7:0] }) );

j_regs j_regs ( 
		.CMPR_H({ CMPR[15:8] }), 
		.CMPR_L({ CMPR[7:0] }),
        .CYCL({ CYCL_EN[4:0] }), 
        .JRESET(J_RESET),
        .MFUNC_CMPLT(MFUNC_CMPLT), 
        .MFUNC_REQ(MFUNC_REQ),
        .MON_ADR({ MON_ADR[15:0] }), 
        .MON_DAT({ MON_DAT[7:0] }),
        .MON_OPCD({ MON_OPCD[7:0] }), 
        .SEL_CMPR_H(Y[5]),
        .SEL_CMPR_L(Y[4]), 
        .SEL_CYCTYP(Y[8]), 
        .SEL_MON_ADRH(Y[3]),
        .SEL_MON_ADRL(Y[2]), 
        .SEL_MON_DAT(Y[7]), 
        .SEL_MON_OPCD(Y[6]),
        .SHFTR({ SHFTR[7:0] }), 
        .TCK(TCK), 
        .UPDAT_DR(UPDAT_DR) );

jtag_brk jtag_brk ( 
		.BRK_IN_SRVC(BRK_IN_SRVC), 
		.BRK_REQ(BRK_REQq), 
		.CMPR({ CMPR[15:0] }),
        .CPU_CLK(CPU_CLK), 
        .CPU_RDY(CPU_RDY), 
        .CPU_RESET(J_RESET),
        .CYC_TYP({ CYCL_EN[4:0] }), 
        .EN_BRK(CNTRL[2]),
        .EN_EXT_BRK(CNTRL[3]), 
        .EVNT0(EVNT0_IN), 
        .EVNT_CNT(EVNT_TERM_CNT),
        .EVNT_DET(EVNT_DET), 
        .FETCH(CPU_FTCH), 
        .FRC_BRK(CNTRL[1]),
        .FRST_WRD(CPU_FRST_WRD), 
        .IACKq(IACKq), 
        .MFUNC(MON_EXC),
        .PC({ CPU_PC[15:0] }), 
        .RD(CPU_RD), 
        .WR(CPU_WR) );

jtag_byp jtag_byp ( 
		.BYP_SEL(SEL_BYP), 
		.SHIFT_DR(SHIFT_DR), 
		.SIN(TDI), 
		.SOUT(SOUT_BYP),
        .TCK(TCK) );

jtgshft8 jtgshft8 ( 
		.A({ MON_DB[7:0] }), 
		.B({ STAK_PTR[7:0] }), 
		.C({ STATUS[7:0] }),
        .D({ DSTK[7:0] }), 
        .EN_CLOCK_DR(CLOCK_DR), 
        .SEL0(Y[11]), 
        .SEL1(Y[12]),
        .SHFTR({ SHFTR[7:0] }), 
        .SHIFT_DR(SHIFT_DR), 
        .SI(TDI), 
        .SO(SOUT_DR),
        .TCK(TCK) );

jtag_ir jtag_ir ( 
		.IR_Q({ IR[7:0] }), 
		.RESET(J_RESET), 
		.SEL_IR(CLOCK_IR),
        .SHIFT_IR(SHIFT_IR), 
        .SIN(TDI), 
        .SOUT(SOUT_IR), 
        .TCK(TCK),
        .UPDATE_IR(UPDATE_IR) );

jtag_dec jtag_dec ( 
		.A({ IR[4:0] }), 
		.SEL_BYP(SEL_BYP), 
		.Y({ Y[15:0] }) );

tap tap ( .CLOCK_DR(CLOCK_DR), 
		.CLOCK_IR(CLOCK_IR), 
		.ENABLE(TDO_OE), 
		.RESET(J_RESETo),
        .SELECT(SELECT), 
        .SHIFT_DR(SHIFT_DR), 
        .SHIFT_IR(SHIFT_IR), 
        .TCK(TCK),
        .TMS(TMS), 
        .UPDATE_DR(UPDAT_DR), 
        .UPDATE_IR(UPDATE_IR), 
        .XTCK(XTCK),
        .XTRST(XTRST) );


always @(posedge TCK or posedge J_RESET) begin
	if(J_RESET) begin
		CNTRL <= 'b0;
	end
	else begin
		if (UPDAT_DR & Y[9]) begin
			CNTRL <= SHFTR;
		end
	end
end

always @(posedge CPU_CLK or posedge J_RESET) begin
	if (J_RESET) begin
		MON_DB   <= 'b0;
		STAK_PTR <= 'b0;
	end
	else begin
		if (CPU_RDY & MON_EXC) begin
			MON_DB <= DB;
		end
		if (CPU_RDY & !BRK_IN_SRVC) begin
			STAK_PTR <= STK_PTR;
		end
	end
end	

always @(posedge XTCK) begin
	TDO <= SELECT ? SOUT_IR : (SEL_BYP ? SOUT_BYP : SOUT_DR);
end							 

endmodule // jtag

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -