OpenCores
URL https://opencores.org/ocsvn/bustap-jtag/bustap-jtag/trunk

Subversion Repositories bustap-jtag

[/] [bustap-jtag/] [trunk/] [rtl/] [up_monitor.v] - Blame information for rev 11

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 ash_riple
//**************************************************************
2
// Module             : up_monitor.v
3
// Platform           : Windows xp sp2
4
// Simulator          : Modelsim 6.5b
5
// Synthesizer        : QuartusII 10.1 sp1
6
// Place and Route    : QuartusII 10.1 sp1
7
// Targets device     : Cyclone III
8
// Author             : Bibo Yang  (ash_riple@hotmail.com)
9
// Organization       : www.opencores.org
10 6 ash_riple
// Revision           : 2.1 
11
// Date               : 2012/03/15
12 5 ash_riple
// Description        : Top level glue logic to group together 
13
//                      the JTAG input and output modules.
14
//**************************************************************
15 2 ash_riple
 
16 5 ash_riple
`timescale 1ns/1ns
17 2 ash_riple
 
18 5 ash_riple
module up_monitor (
19
        input        clk,
20
        input        wr_en,rd_en,
21
        input [15:2] addr_in,
22
        input [31:0] data_in
23
);
24 2 ash_riple
 
25 6 ash_riple
/////////////////////////////////////////////////
26
// Registers and wires announcment
27
/////////////////////////////////////////////////
28 2 ash_riple
 
29 6 ash_riple
// for CPU bus signal buffer
30
reg         wr_en_d1,rd_en_d1;
31
reg  [15:2] addr_in_d1;
32
reg  [31:0] data_in_d1;
33
// for capture address mask
34
wire [35:0] addr_mask0,addr_mask1,addr_mask2 ,addr_mask3 ,addr_mask4 ,addr_mask5 ,addr_mask6 ,addr_mask7 ,  // inclusive
35
            addr_mask8,addr_mask9,addr_mask10,addr_mask11,addr_mask12,addr_mask13,addr_mask14,addr_mask15;  // exclusive
36
wire [15:0] addr_mask_en = {addr_mask15[32],addr_mask14[32],addr_mask13[32],addr_mask12[32],
37
                            addr_mask11[32],addr_mask10[32],addr_mask9 [32],addr_mask8 [32],
38
                            addr_mask7 [32],addr_mask6 [32],addr_mask5 [32],addr_mask4 [32],
39
                            addr_mask3 [32],addr_mask2 [32],addr_mask1 [32],addr_mask0 [32]};
40
wire        addr_wren = addr_mask15[35];
41
wire        addr_rden = addr_mask15[34];
42 5 ash_riple
reg         addr_mask_ok;
43 6 ash_riple
// for capture address+data trigger
44
wire [55:0] trig_cond;
45
wire        trig_aden = trig_cond[55];
46
wire        trig_daen = trig_cond[54];
47
wire        trig_wren = trig_cond[51];
48
wire        trig_rden = trig_cond[50];
49 5 ash_riple
wire        trig_en   = trig_cond[49];
50
wire        trig_set  = trig_cond[48];
51
wire [15:0] trig_addr = trig_cond[47:32];
52
wire [31:0] trig_data = trig_cond[31:0];
53 6 ash_riple
reg         trig_cond_ok,trig_cond_ok_d1;
54
// for capture storage
55
wire [49:0] capture_in;
56 5 ash_riple
wire        capture_wr;
57 11 ash_riple
// for pretrigger capture
58
wire [9:0] pretrig_num;
59
reg  [9:0] pretrig_cnt;
60
wire pretrig_full;
61
wire pretrig_wr;
62
reg  pretrig_wr_d1,pretrig_rd;
63 5 ash_riple
 
64 6 ash_riple
/////////////////////////////////////////////////
65
// Capture logic main
66
/////////////////////////////////////////////////
67
 
68 5 ash_riple
// bus input pipeline, allowing back-to-back/continuous bus access
69
always @(posedge clk)
70 2 ash_riple
begin
71 5 ash_riple
        wr_en_d1   <= wr_en;
72
        rd_en_d1   <= rd_en;
73
        addr_in_d1 <= addr_in;
74
        data_in_d1 <= data_in;
75 2 ash_riple
end
76
 
77 5 ash_riple
// address range based capture enable
78
always @(posedge clk)
79 2 ash_riple
begin
80 6 ash_riple
        if (((addr_in[15:2]<=addr_mask0[31:18] && addr_in[15:2]>=addr_mask0[15:2] && addr_mask_en[ 0]) ||
81
             (addr_in[15:2]<=addr_mask1[31:18] && addr_in[15:2]>=addr_mask1[15:2] && addr_mask_en[ 1]) ||
82
             (addr_in[15:2]<=addr_mask2[31:18] && addr_in[15:2]>=addr_mask2[15:2] && addr_mask_en[ 2]) ||
83
             (addr_in[15:2]<=addr_mask3[31:18] && addr_in[15:2]>=addr_mask3[15:2] && addr_mask_en[ 3]) ||
84
             (addr_in[15:2]<=addr_mask4[31:18] && addr_in[15:2]>=addr_mask4[15:2] && addr_mask_en[ 4]) ||
85
             (addr_in[15:2]<=addr_mask5[31:18] && addr_in[15:2]>=addr_mask5[15:2] && addr_mask_en[ 5]) ||
86
             (addr_in[15:2]<=addr_mask6[31:18] && addr_in[15:2]>=addr_mask6[15:2] && addr_mask_en[ 6]) ||
87
             (addr_in[15:2]<=addr_mask7[31:18] && addr_in[15:2]>=addr_mask7[15:2] && addr_mask_en[ 7])
88
            ) //inclusive address range set with individual enable: addr_mask 0 - 7
89 5 ash_riple
            &&
90 6 ash_riple
            ((addr_in[15:2]>addr_mask8 [31:18] || addr_in[15:2]<addr_mask8 [15:2] || !addr_mask_en[ 8]) &&
91
             (addr_in[15:2]>addr_mask9 [31:18] || addr_in[15:2]<addr_mask9 [15:2] || !addr_mask_en[ 9]) &&
92
             (addr_in[15:2]>addr_mask10[31:18] || addr_in[15:2]<addr_mask10[15:2] || !addr_mask_en[10]) &&
93
             (addr_in[15:2]>addr_mask11[31:18] || addr_in[15:2]<addr_mask11[15:2] || !addr_mask_en[11]) &&
94
             (addr_in[15:2]>addr_mask12[31:18] || addr_in[15:2]<addr_mask12[15:2] || !addr_mask_en[12]) &&
95
             (addr_in[15:2]>addr_mask13[31:18] || addr_in[15:2]<addr_mask13[15:2] || !addr_mask_en[13]) &&
96
             (addr_in[15:2]>addr_mask14[31:18] || addr_in[15:2]<addr_mask14[15:2] || !addr_mask_en[14]) &&
97
             (addr_in[15:2]>addr_mask15[31:18] || addr_in[15:2]<addr_mask15[15:2] || !addr_mask_en[15])
98
            ) //exclusive address range set with individual enable: addr_mask 8 - 15
99 2 ash_riple
        )
100 6 ash_riple
                addr_mask_ok <= (addr_rden && rd_en) || (addr_wren && wr_en);
101 5 ash_riple
        else
102
                addr_mask_ok <= 0;
103 2 ash_riple
end
104
 
105 6 ash_riple
// address+data based capture trigger
106 5 ash_riple
always @(posedge clk)
107 2 ash_riple
begin
108 6 ash_riple
        if (trig_en==0) begin                      // trigger not enabled, trigger gate forced open
109
                trig_cond_ok    <= 1;
110
                trig_cond_ok_d1 <= 1;
111
        end
112
        else if (trig_set==0) begin                // trigger enabled and trigger stopped, trigger gate forced close
113
                trig_cond_ok    <= 0;
114
                trig_cond_ok_d1 <= 0;
115
        end
116
        else begin                                 // trigger enabled and trigger started, trigger gate conditional open
117
                if ((trig_aden? trig_addr[15:2]==addr_in[15:2]: 1) && (trig_daen? trig_data==data_in: 1) &&
118
                    (trig_wren? wr_en                         : 1) && (trig_rden? rd_en             : 1) &&
119
                    (rd_en || wr_en))
120
                        trig_cond_ok <= 1;
121
                trig_cond_ok_d1 <= trig_cond_ok;
122
        end
123
                                              // trigger gate kept open until trigger stoped
124 2 ash_riple
end
125 6 ash_riple
wire trig_cond_ok_pulse = trig_cond_ok & !trig_cond_ok_d1;
126 2 ash_riple
 
127 11 ash_riple
// generate capture wr_in
128 6 ash_riple
assign capture_in = {trig_cond_ok_pulse,wr_en_d1,addr_in_d1[15:2],2'b00,data_in_d1[31:0]};
129
assign capture_wr =  trig_cond_ok_pulse | (addr_mask_ok & trig_cond_ok);
130 2 ash_riple
 
131 11 ash_riple
// generate pre-trigger wr_in
132
assign pretrig_full = (pretrig_cnt >= pretrig_num) || trig_cond_ok;
133
assign pretrig_wr = (!trig_en || (trig_en && !trig_set))? 1'b0 : (trig_cond_ok? 1'b0 : addr_mask_ok);
134
always @(posedge clk)
135
begin
136
        if      (!trig_en || (trig_en && !trig_set)) begin
137
                pretrig_cnt  <= 10'd0;
138
                pretrig_wr_d1<= 1'b0;
139
                pretrig_rd   <= 1'b0;
140
        end
141
        else if (!pretrig_full) begin
142
                pretrig_cnt  <=  pretrig_cnt + addr_mask_ok;
143
                pretrig_wr_d1<= 1'b0;
144
                pretrig_rd   <= 1'b0;
145
        end
146
        else if (pretrig_full) begin
147
                pretrig_cnt  <= pretrig_cnt;
148
                pretrig_wr_d1<= pretrig_wr;
149
                pretrig_rd   <= pretrig_wr_d1;
150
        end
151
end
152
 
153 6 ash_riple
/////////////////////////////////////////////////
154
// Instantiate vendor specific JTAG functions
155
/////////////////////////////////////////////////
156
 
157
// index 0, instantiate capture fifo, as output
158
virtual_jtag_adda_fifo u_virtual_jtag_adda_fifo (
159
        .clk(clk),
160 11 ash_riple
        .wr_in(capture_wr || pretrig_wr),
161
        .data_in(capture_in),
162
        .rd_in(pretrig_rd)
163 6 ash_riple
        );
164
defparam
165
        u_virtual_jtag_adda_fifo.data_width     = 50,
166
        u_virtual_jtag_adda_fifo.fifo_depth     = 512,
167
        u_virtual_jtag_adda_fifo.addr_width     = 9,
168
        u_virtual_jtag_adda_fifo.al_full_val    = 511,
169
        u_virtual_jtag_adda_fifo.al_empt_val    = 0;
170
 
171
// index 1, instantiate capture mask, as input
172 2 ash_riple
virtual_jtag_addr_mask u_virtual_jtag_addr_mask (
173 6 ash_riple
        // inclusive
174 2 ash_riple
        .mask_out0(addr_mask0),
175
        .mask_out1(addr_mask1),
176
        .mask_out2(addr_mask2),
177
        .mask_out3(addr_mask3),
178
        .mask_out4(addr_mask4),
179
        .mask_out5(addr_mask5),
180
        .mask_out6(addr_mask6),
181
        .mask_out7(addr_mask7),
182 6 ash_riple
        // exclusive
183 2 ash_riple
        .mask_out8(addr_mask8),
184
        .mask_out9(addr_mask9),
185
        .mask_out10(addr_mask10),
186
        .mask_out11(addr_mask11),
187
        .mask_out12(addr_mask12),
188
        .mask_out13(addr_mask13),
189
        .mask_out14(addr_mask14),
190
        .mask_out15(addr_mask15)
191
        );
192
defparam
193
        u_virtual_jtag_addr_mask.mask_index     = 4,
194 6 ash_riple
        u_virtual_jtag_addr_mask.mask_enabl     = 4,
195
        u_virtual_jtag_addr_mask.addr_width     = 32;
196 2 ash_riple
 
197 6 ash_riple
// index 2, instantiate capture trigger, as input
198 2 ash_riple
virtual_jtag_adda_trig u_virtual_jtag_adda_trig (
199 11 ash_riple
        .trig_out(trig_cond),
200
        .pnum_out(pretrig_num)
201 2 ash_riple
        );
202
defparam
203 11 ash_riple
        u_virtual_jtag_adda_trig.trig_width     = 56,
204
        u_virtual_jtag_adda_trig.pnum_width     = 10;
205 2 ash_riple
 
206
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.