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 13

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 12 ash_riple
wire [81: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 12 ash_riple
// for inter capture timer
64
reg [31:0] inter_cap_cnt;
65 5 ash_riple
 
66 6 ash_riple
/////////////////////////////////////////////////
67
// Capture logic main
68
/////////////////////////////////////////////////
69
 
70 5 ash_riple
// bus input pipeline, allowing back-to-back/continuous bus access
71
always @(posedge clk)
72 2 ash_riple
begin
73 5 ash_riple
        wr_en_d1   <= wr_en;
74
        rd_en_d1   <= rd_en;
75
        addr_in_d1 <= addr_in;
76
        data_in_d1 <= data_in;
77 2 ash_riple
end
78
 
79 5 ash_riple
// address range based capture enable
80
always @(posedge clk)
81 2 ash_riple
begin
82 6 ash_riple
        if (((addr_in[15:2]<=addr_mask0[31:18] && addr_in[15:2]>=addr_mask0[15:2] && addr_mask_en[ 0]) ||
83
             (addr_in[15:2]<=addr_mask1[31:18] && addr_in[15:2]>=addr_mask1[15:2] && addr_mask_en[ 1]) ||
84
             (addr_in[15:2]<=addr_mask2[31:18] && addr_in[15:2]>=addr_mask2[15:2] && addr_mask_en[ 2]) ||
85
             (addr_in[15:2]<=addr_mask3[31:18] && addr_in[15:2]>=addr_mask3[15:2] && addr_mask_en[ 3]) ||
86
             (addr_in[15:2]<=addr_mask4[31:18] && addr_in[15:2]>=addr_mask4[15:2] && addr_mask_en[ 4]) ||
87
             (addr_in[15:2]<=addr_mask5[31:18] && addr_in[15:2]>=addr_mask5[15:2] && addr_mask_en[ 5]) ||
88
             (addr_in[15:2]<=addr_mask6[31:18] && addr_in[15:2]>=addr_mask6[15:2] && addr_mask_en[ 6]) ||
89
             (addr_in[15:2]<=addr_mask7[31:18] && addr_in[15:2]>=addr_mask7[15:2] && addr_mask_en[ 7])
90
            ) //inclusive address range set with individual enable: addr_mask 0 - 7
91 5 ash_riple
            &&
92 6 ash_riple
            ((addr_in[15:2]>addr_mask8 [31:18] || addr_in[15:2]<addr_mask8 [15:2] || !addr_mask_en[ 8]) &&
93
             (addr_in[15:2]>addr_mask9 [31:18] || addr_in[15:2]<addr_mask9 [15:2] || !addr_mask_en[ 9]) &&
94
             (addr_in[15:2]>addr_mask10[31:18] || addr_in[15:2]<addr_mask10[15:2] || !addr_mask_en[10]) &&
95
             (addr_in[15:2]>addr_mask11[31:18] || addr_in[15:2]<addr_mask11[15:2] || !addr_mask_en[11]) &&
96
             (addr_in[15:2]>addr_mask12[31:18] || addr_in[15:2]<addr_mask12[15:2] || !addr_mask_en[12]) &&
97
             (addr_in[15:2]>addr_mask13[31:18] || addr_in[15:2]<addr_mask13[15:2] || !addr_mask_en[13]) &&
98
             (addr_in[15:2]>addr_mask14[31:18] || addr_in[15:2]<addr_mask14[15:2] || !addr_mask_en[14]) &&
99
             (addr_in[15:2]>addr_mask15[31:18] || addr_in[15:2]<addr_mask15[15:2] || !addr_mask_en[15])
100
            ) //exclusive address range set with individual enable: addr_mask 8 - 15
101 2 ash_riple
        )
102 6 ash_riple
                addr_mask_ok <= (addr_rden && rd_en) || (addr_wren && wr_en);
103 5 ash_riple
        else
104
                addr_mask_ok <= 0;
105 2 ash_riple
end
106
 
107 6 ash_riple
// address+data based capture trigger
108 5 ash_riple
always @(posedge clk)
109 2 ash_riple
begin
110 6 ash_riple
        if (trig_en==0) begin                      // trigger not enabled, trigger gate forced open
111
                trig_cond_ok    <= 1;
112
                trig_cond_ok_d1 <= 1;
113
        end
114
        else if (trig_set==0) begin                // trigger enabled and trigger stopped, trigger gate forced close
115
                trig_cond_ok    <= 0;
116
                trig_cond_ok_d1 <= 0;
117
        end
118
        else begin                                 // trigger enabled and trigger started, trigger gate conditional open
119
                if ((trig_aden? trig_addr[15:2]==addr_in[15:2]: 1) && (trig_daen? trig_data==data_in: 1) &&
120
                    (trig_wren? wr_en                         : 1) && (trig_rden? rd_en             : 1) &&
121
                    (rd_en || wr_en))
122
                        trig_cond_ok <= 1;
123
                trig_cond_ok_d1 <= trig_cond_ok;
124
        end
125
                                              // trigger gate kept open until trigger stoped
126 2 ash_riple
end
127 6 ash_riple
wire trig_cond_ok_pulse = trig_cond_ok & !trig_cond_ok_d1;
128 2 ash_riple
 
129 11 ash_riple
// generate capture wr_in
130 12 ash_riple
assign capture_in = {trig_cond_ok_pulse,wr_en_d1,inter_cap_cnt,addr_in_d1[15:2],2'b00,data_in_d1[31:0]};
131 13 ash_riple
assign capture_wr =  trig_cond_ok_pulse || (addr_mask_ok && trig_cond_ok);
132 2 ash_riple
 
133 11 ash_riple
// generate pre-trigger wr_in
134
assign pretrig_full = (pretrig_cnt >= pretrig_num) || trig_cond_ok;
135
assign pretrig_wr = (!trig_en || (trig_en && !trig_set))? 1'b0 : (trig_cond_ok? 1'b0 : addr_mask_ok);
136
always @(posedge clk)
137
begin
138
        if      (!trig_en || (trig_en && !trig_set)) begin
139
                pretrig_cnt  <= 10'd0;
140
                pretrig_wr_d1<= 1'b0;
141
                pretrig_rd   <= 1'b0;
142
        end
143
        else if (!pretrig_full) begin
144
                pretrig_cnt  <=  pretrig_cnt + addr_mask_ok;
145
                pretrig_wr_d1<= 1'b0;
146
                pretrig_rd   <= 1'b0;
147
        end
148
        else if (pretrig_full) begin
149
                pretrig_cnt  <= pretrig_cnt;
150
                pretrig_wr_d1<= pretrig_wr;
151
                pretrig_rd   <= pretrig_wr_d1;
152
        end
153
end
154
 
155 12 ash_riple
// generate interval counter
156
always @(posedge clk)
157
begin
158
        if      (capture_wr || pretrig_wr)
159
                inter_cap_cnt <= 32'd0;
160
        else if (inter_cap_cnt[31])
161
                inter_cap_cnt <= 32'd3000000000;
162
        else
163
                inter_cap_cnt <= inter_cap_cnt + 32'd1;
164
end
165
 
166 6 ash_riple
/////////////////////////////////////////////////
167
// Instantiate vendor specific JTAG functions
168
/////////////////////////////////////////////////
169
 
170
// index 0, instantiate capture fifo, as output
171
virtual_jtag_adda_fifo u_virtual_jtag_adda_fifo (
172
        .clk(clk),
173 11 ash_riple
        .wr_in(capture_wr || pretrig_wr),
174
        .data_in(capture_in),
175
        .rd_in(pretrig_rd)
176 6 ash_riple
        );
177
defparam
178 12 ash_riple
        u_virtual_jtag_adda_fifo.data_width     = 82,
179 6 ash_riple
        u_virtual_jtag_adda_fifo.fifo_depth     = 512,
180
        u_virtual_jtag_adda_fifo.addr_width     = 9,
181
        u_virtual_jtag_adda_fifo.al_full_val    = 511,
182
        u_virtual_jtag_adda_fifo.al_empt_val    = 0;
183
 
184
// index 1, instantiate capture mask, as input
185 2 ash_riple
virtual_jtag_addr_mask u_virtual_jtag_addr_mask (
186 6 ash_riple
        // inclusive
187 2 ash_riple
        .mask_out0(addr_mask0),
188
        .mask_out1(addr_mask1),
189
        .mask_out2(addr_mask2),
190
        .mask_out3(addr_mask3),
191
        .mask_out4(addr_mask4),
192
        .mask_out5(addr_mask5),
193
        .mask_out6(addr_mask6),
194
        .mask_out7(addr_mask7),
195 6 ash_riple
        // exclusive
196 2 ash_riple
        .mask_out8(addr_mask8),
197
        .mask_out9(addr_mask9),
198
        .mask_out10(addr_mask10),
199
        .mask_out11(addr_mask11),
200
        .mask_out12(addr_mask12),
201
        .mask_out13(addr_mask13),
202
        .mask_out14(addr_mask14),
203
        .mask_out15(addr_mask15)
204
        );
205
defparam
206
        u_virtual_jtag_addr_mask.mask_index     = 4,
207 6 ash_riple
        u_virtual_jtag_addr_mask.mask_enabl     = 4,
208
        u_virtual_jtag_addr_mask.addr_width     = 32;
209 2 ash_riple
 
210 6 ash_riple
// index 2, instantiate capture trigger, as input
211 2 ash_riple
virtual_jtag_adda_trig u_virtual_jtag_adda_trig (
212 11 ash_riple
        .trig_out(trig_cond),
213
        .pnum_out(pretrig_num)
214 2 ash_riple
        );
215
defparam
216 11 ash_riple
        u_virtual_jtag_adda_trig.trig_width     = 56,
217
        u_virtual_jtag_adda_trig.pnum_width     = 10;
218 2 ash_riple
 
219
endmodule

powered by: WebSVN 2.1.0

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