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 6

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
 
58 6 ash_riple
/////////////////////////////////////////////////
59
// Capture logic main
60
/////////////////////////////////////////////////
61
 
62 5 ash_riple
// bus input pipeline, allowing back-to-back/continuous bus access
63
always @(posedge clk)
64 2 ash_riple
begin
65 5 ash_riple
        wr_en_d1   <= wr_en;
66
        rd_en_d1   <= rd_en;
67
        addr_in_d1 <= addr_in;
68
        data_in_d1 <= data_in;
69 2 ash_riple
end
70
 
71 5 ash_riple
// address range based capture enable
72
always @(posedge clk)
73 2 ash_riple
begin
74 6 ash_riple
        if (((addr_in[15:2]<=addr_mask0[31:18] && addr_in[15:2]>=addr_mask0[15:2] && addr_mask_en[ 0]) ||
75
             (addr_in[15:2]<=addr_mask1[31:18] && addr_in[15:2]>=addr_mask1[15:2] && addr_mask_en[ 1]) ||
76
             (addr_in[15:2]<=addr_mask2[31:18] && addr_in[15:2]>=addr_mask2[15:2] && addr_mask_en[ 2]) ||
77
             (addr_in[15:2]<=addr_mask3[31:18] && addr_in[15:2]>=addr_mask3[15:2] && addr_mask_en[ 3]) ||
78
             (addr_in[15:2]<=addr_mask4[31:18] && addr_in[15:2]>=addr_mask4[15:2] && addr_mask_en[ 4]) ||
79
             (addr_in[15:2]<=addr_mask5[31:18] && addr_in[15:2]>=addr_mask5[15:2] && addr_mask_en[ 5]) ||
80
             (addr_in[15:2]<=addr_mask6[31:18] && addr_in[15:2]>=addr_mask6[15:2] && addr_mask_en[ 6]) ||
81
             (addr_in[15:2]<=addr_mask7[31:18] && addr_in[15:2]>=addr_mask7[15:2] && addr_mask_en[ 7])
82
            ) //inclusive address range set with individual enable: addr_mask 0 - 7
83 5 ash_riple
            &&
84 6 ash_riple
            ((addr_in[15:2]>addr_mask8 [31:18] || addr_in[15:2]<addr_mask8 [15:2] || !addr_mask_en[ 8]) &&
85
             (addr_in[15:2]>addr_mask9 [31:18] || addr_in[15:2]<addr_mask9 [15:2] || !addr_mask_en[ 9]) &&
86
             (addr_in[15:2]>addr_mask10[31:18] || addr_in[15:2]<addr_mask10[15:2] || !addr_mask_en[10]) &&
87
             (addr_in[15:2]>addr_mask11[31:18] || addr_in[15:2]<addr_mask11[15:2] || !addr_mask_en[11]) &&
88
             (addr_in[15:2]>addr_mask12[31:18] || addr_in[15:2]<addr_mask12[15:2] || !addr_mask_en[12]) &&
89
             (addr_in[15:2]>addr_mask13[31:18] || addr_in[15:2]<addr_mask13[15:2] || !addr_mask_en[13]) &&
90
             (addr_in[15:2]>addr_mask14[31:18] || addr_in[15:2]<addr_mask14[15:2] || !addr_mask_en[14]) &&
91
             (addr_in[15:2]>addr_mask15[31:18] || addr_in[15:2]<addr_mask15[15:2] || !addr_mask_en[15])
92
            ) //exclusive address range set with individual enable: addr_mask 8 - 15
93 2 ash_riple
        )
94 6 ash_riple
                addr_mask_ok <= (addr_rden && rd_en) || (addr_wren && wr_en);
95 5 ash_riple
        else
96
                addr_mask_ok <= 0;
97 2 ash_riple
end
98
 
99 6 ash_riple
// address+data based capture trigger
100 5 ash_riple
always @(posedge clk)
101 2 ash_riple
begin
102 6 ash_riple
        if (trig_en==0) begin                      // trigger not enabled, trigger gate forced open
103
                trig_cond_ok    <= 1;
104
                trig_cond_ok_d1 <= 1;
105
        end
106
        else if (trig_set==0) begin                // trigger enabled and trigger stopped, trigger gate forced close
107
                trig_cond_ok    <= 0;
108
                trig_cond_ok_d1 <= 0;
109
        end
110
        else begin                                 // trigger enabled and trigger started, trigger gate conditional open
111
                if ((trig_aden? trig_addr[15:2]==addr_in[15:2]: 1) && (trig_daen? trig_data==data_in: 1) &&
112
                    (trig_wren? wr_en                         : 1) && (trig_rden? rd_en             : 1) &&
113
                    (rd_en || wr_en))
114
                        trig_cond_ok <= 1;
115
                trig_cond_ok_d1 <= trig_cond_ok;
116
        end
117
                                              // trigger gate kept open until trigger stoped
118 2 ash_riple
end
119 6 ash_riple
wire trig_cond_ok_pulse = trig_cond_ok & !trig_cond_ok_d1;
120 2 ash_riple
 
121 5 ash_riple
// generate capture wr-in
122 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]};
123
assign capture_wr =  trig_cond_ok_pulse | (addr_mask_ok & trig_cond_ok);
124 2 ash_riple
 
125 6 ash_riple
/////////////////////////////////////////////////
126
// Instantiate vendor specific JTAG functions
127
/////////////////////////////////////////////////
128
 
129
// index 0, instantiate capture fifo, as output
130
virtual_jtag_adda_fifo u_virtual_jtag_adda_fifo (
131
        .clk(clk),
132
        .wr_en(capture_wr),
133
        .data_in(capture_in)
134
        );
135
defparam
136
        u_virtual_jtag_adda_fifo.data_width     = 50,
137
        u_virtual_jtag_adda_fifo.fifo_depth     = 512,
138
        u_virtual_jtag_adda_fifo.addr_width     = 9,
139
        u_virtual_jtag_adda_fifo.al_full_val    = 511,
140
        u_virtual_jtag_adda_fifo.al_empt_val    = 0;
141
 
142
// index 1, instantiate capture mask, as input
143 2 ash_riple
virtual_jtag_addr_mask u_virtual_jtag_addr_mask (
144 6 ash_riple
        // inclusive
145 2 ash_riple
        .mask_out0(addr_mask0),
146
        .mask_out1(addr_mask1),
147
        .mask_out2(addr_mask2),
148
        .mask_out3(addr_mask3),
149
        .mask_out4(addr_mask4),
150
        .mask_out5(addr_mask5),
151
        .mask_out6(addr_mask6),
152
        .mask_out7(addr_mask7),
153 6 ash_riple
        // exclusive
154 2 ash_riple
        .mask_out8(addr_mask8),
155
        .mask_out9(addr_mask9),
156
        .mask_out10(addr_mask10),
157
        .mask_out11(addr_mask11),
158
        .mask_out12(addr_mask12),
159
        .mask_out13(addr_mask13),
160
        .mask_out14(addr_mask14),
161
        .mask_out15(addr_mask15)
162
        );
163
defparam
164
        u_virtual_jtag_addr_mask.mask_index     = 4,
165 6 ash_riple
        u_virtual_jtag_addr_mask.mask_enabl     = 4,
166
        u_virtual_jtag_addr_mask.addr_width     = 32;
167 2 ash_riple
 
168 6 ash_riple
// index 2, instantiate capture trigger, as input
169 2 ash_riple
virtual_jtag_adda_trig u_virtual_jtag_adda_trig (
170 5 ash_riple
        .trig_out(trig_cond)
171 2 ash_riple
        );
172
defparam
173 6 ash_riple
        u_virtual_jtag_adda_trig.trig_width     = 56;
174 2 ash_riple
 
175
endmodule

powered by: WebSVN 2.1.0

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