jtag-mpsse

JTAG tools for FTDI MPSSE transports
git clone http://frotz.net/git/jtag-mpsse.git
Log | Files | Refs

axidebugmaster.v (5298B)


      1 /* Copyright 2014 Brian Swetland <swetland@frotz.net>
      2  *
      3  * Licensed under the Apache License, Version 2.0 (the "License");
      4  * you may not use this file except in compliance with the License.
      5  * You may obtain a copy of the License at
      6  *
      7  *     http://www.apache.org/licenses/LICENSE-2.0
      8  *
      9  * Unless required by applicable law or agreed to in writing, software
     10  * distributed under the License is distributed on an "AS IS" BASIS,
     11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12  * See the License for the specific language governing permissions and
     13  * limitations under the License.
     14  */
     15 
     16 `timescale 1ns/1ps
     17 
     18 module axidebugmaster #(
     19 	parameter integer C_M00_AXI_ADDR_WIDTH	= 32,
     20 	parameter integer C_M00_AXI_DATA_WIDTH	= 32
     21 	) (
     22 	input wire  m00_axi_aclk,
     23 	output wire [C_M00_AXI_ADDR_WIDTH-1 : 0] m00_axi_awaddr,
     24 	output wire  m00_axi_awlock,
     25 	output wire [3 : 0] m00_axi_awcache,
     26 	output wire [2 : 0] m00_axi_awprot,
     27 	output reg m00_axi_awvalid,
     28 	input wire  m00_axi_awready,
     29 	output wire [C_M00_AXI_DATA_WIDTH-1 : 0] m00_axi_wdata,
     30 	output wire [C_M00_AXI_DATA_WIDTH/8-1 : 0] m00_axi_wstrb,
     31 	output reg m00_axi_wvalid,
     32 	input wire  m00_axi_wready,
     33 	input wire [1 : 0] m00_axi_bresp,
     34 	input wire  m00_axi_bvalid,
     35 	output reg m00_axi_bready,
     36 	output wire [C_M00_AXI_ADDR_WIDTH-1 : 0] m00_axi_araddr,
     37 	output wire  m00_axi_arlock,
     38 	output wire [3 : 0] m00_axi_arcache,
     39 	output wire [2 : 0] m00_axi_arprot,
     40 	output reg m00_axi_arvalid,
     41 	input wire  m00_axi_arready,
     42 	input wire [C_M00_AXI_DATA_WIDTH-1 : 0] m00_axi_rdata,
     43 	input wire [1 : 0] m00_axi_rresp,
     44 	input wire  m00_axi_rvalid,
     45 	output reg m00_axi_rready
     46 	);
     47 
     48 wire clk;
     49 assign clk = m00_axi_aclk;
     50 
     51 assign m00_axi_awlock = 0;
     52 assign m00_axi_awcache = 0;
     53 assign m00_axi_awprot = 0;
     54 assign m00_axi_arlock = 0;
     55 assign m00_axi_arcache = 0;
     56 assign m00_axi_arprot = 0;
     57 assign m00_axi_wstrb = 4'b1111;
     58 
     59 reg [31:0]txn_addr;
     60 reg [31:0]txn_addr_next;
     61 
     62 reg [31:0]txn_data;
     63 reg [31:0]txn_data_next;
     64 
     65 localparam STATE_IDLE   = 3'd0;
     66 localparam STATE_WADDR  = 3'd1;
     67 localparam STATE_WDATA  = 3'd2;
     68 localparam STATE_WACK   = 3'd3;
     69 localparam STATE_RADDR  = 3'd4;
     70 localparam STATE_RDATA  = 3'd5;
     71 
     72 localparam DBG_IDCODE		= 32'h4158494d;
     73 
     74 localparam DBG_R_IDCODE                 = 3'd0;
     75 localparam DBG_R_GETDATA                = 3'd1;
     76 localparam DBG_R_GETADDR                = 3'd2;
     77 localparam DBG_R_STATUS                 = 3'd7;
     78 
     79 localparam DBG_W_SETADDR_READ           = 3'd1;
     80 localparam DBG_W_SETADDR                = 3'd2;
     81 localparam DBG_W_SETDATA_WRITE          = 3'd3;
     82 localparam DBG_W_SETDATA_INCADDR_WRITE  = 3'd4;
     83 
     84 reg [2:0]state = STATE_IDLE;
     85 reg [2:0]state_next;
     86 
     87 reg txn_done = 0;
     88 reg txn_done_next;
     89 
     90 reg awvalid_next;
     91 reg wvalid_next;
     92 reg bready_next;
     93 reg arvalid_next;
     94 reg rready_next;
     95 
     96 assign m00_axi_awaddr = txn_addr;
     97 assign m00_axi_araddr = txn_addr;
     98 assign m00_axi_wdata = txn_data;
     99 
    100 wire dbg_rd, dbg_wr;
    101 wire [2:0]dbg_addr;
    102 wire [31:0]dbg_wdata;
    103 reg [31:0]dbg_rdata;
    104 
    105 always @(posedge clk) begin
    106 	state <= state_next;
    107 	txn_addr <= txn_addr_next;
    108 	txn_data <= txn_data_next;
    109 	txn_done <= txn_done_next;
    110 	m00_axi_awvalid = awvalid_next;
    111 	m00_axi_wvalid = wvalid_next;
    112 	m00_axi_bready = bready_next;
    113 	m00_axi_arvalid = arvalid_next;
    114 	m00_axi_rready = rready_next;
    115 end
    116 
    117 always @(*) begin
    118 	state_next = state;
    119 	txn_addr_next = txn_addr;
    120 	txn_data_next = txn_data;
    121 	txn_done_next = 0;
    122 	awvalid_next = 0;
    123 	wvalid_next = 0;
    124 	bready_next = 0;
    125 	arvalid_next = 0;
    126 	rready_next = 0;
    127 	case (state)
    128 	STATE_IDLE: begin
    129 		if (dbg_wr) begin
    130 			case (dbg_addr)
    131 			DBG_W_SETADDR: begin
    132 				txn_addr_next = dbg_wdata;
    133 			end
    134 			DBG_W_SETADDR_READ: begin
    135 				state_next = STATE_RADDR;
    136 				txn_addr_next = dbg_wdata;
    137 				arvalid_next = 1;
    138 			end
    139 			DBG_W_SETDATA_WRITE: begin
    140 				state_next = STATE_WADDR;
    141 				txn_data_next = dbg_wdata;
    142 				awvalid_next = 1;
    143 			end
    144 			DBG_W_SETDATA_INCADDR_WRITE: begin
    145 				state_next = STATE_WADDR;
    146 				txn_data_next = dbg_wdata;
    147 				txn_addr_next = txn_addr + 4;
    148 				awvalid_next = 1;
    149 			end
    150 			default: ;
    151 			endcase
    152 		end else begin
    153 			txn_done_next = 1;
    154 		end
    155 	end
    156 	STATE_WADDR: begin
    157 		if (m00_axi_awready) begin
    158 			state_next = STATE_WDATA;
    159 			wvalid_next = 1;
    160 		end else begin
    161 			awvalid_next = 1;
    162 		end
    163 	end
    164 	STATE_WDATA: begin
    165 		if (m00_axi_wready) begin
    166 			state_next = STATE_WACK;
    167 			bready_next = 1;
    168 		end else begin
    169 			wvalid_next = 1;
    170 		end
    171 	end
    172 	STATE_WACK: begin
    173 		if (m00_axi_bvalid) begin
    174 			state_next = STATE_IDLE;
    175 			txn_done_next = 1;
    176 		end else begin
    177 			bready_next = 1;
    178 		end
    179 	end
    180 	STATE_RADDR: begin
    181 		if (m00_axi_arready) begin
    182 			state_next = STATE_RDATA;
    183 			rready_next = 1;
    184 		end else begin
    185 			arvalid_next = 1;
    186 		end
    187 	end
    188 	STATE_RDATA: begin
    189 		if (m00_axi_rvalid) begin
    190 			state_next = STATE_IDLE;
    191 			txn_done_next = 1;
    192 			txn_data_next = m00_axi_rdata;
    193 		end else begin
    194 			rready_next = 1;
    195 		end
    196 	end
    197 	default: begin
    198 		state_next = STATE_IDLE;
    199 	end
    200 	endcase
    201 end
    202 
    203 always @(*) begin
    204 	case (dbg_addr)
    205 	DBG_R_IDCODE:    dbg_rdata = DBG_IDCODE;
    206 	DBG_R_GETDATA:   dbg_rdata = txn_data;
    207 	DBG_R_GETADDR:   dbg_rdata = txn_addr;
    208 	DBG_R_STATUS:    dbg_rdata = { 31'd0, txn_done };
    209 	default:         dbg_rdata = 32'hFFFFFFFF;
    210 	endcase
    211 end
    212 
    213 debugport jtag(
    214 	.o_rd(dbg_rd),
    215 	.o_wr(dbg_wr),
    216 	.o_addr(dbg_addr),
    217 	.o_wdata(dbg_wdata),
    218 	.i_rdata(dbg_rdata),
    219 	.clk(clk)
    220 	);
    221 
    222 endmodule