OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [rtl/] [src_peripheral/] [jtag/] [jtag_uart/] [altera_uart_simulator.v] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
/**************************************
2
* Module: simulator_UART
3
* Date:2017-06-13
4
* Author: alireza
5
*
6
* Description: A simple uart that display input characters on simulator terminal using $write command.
7
*              This module start wrting on terminal when the buffer becomes full or wait counter reach its limit.
8
*              The buffer  perevents the conflict between multiple simulation UART messages
9
*              Wait counter reset by each individual write on buffer
10
***************************************/
11
// synthesis translate_off
12
`timescale 1ns / 1ps
13
// synthesis translate_on
14
 
15
 
16
 
17
module  altera_uart_simulator #(
18
    parameter BUFFER_SIZE   =100,
19
    parameter WAIT_COUNT    =1000
20
)(
21
    reset,
22
    clk,
23
    s_dat_i,
24
    s_sel_i,
25
    s_addr_i,
26
    s_cti_i,
27
    s_stb_i,
28
    s_cyc_i,
29
    s_we_i,
30
    s_dat_o,
31
    s_ack_o,
32
 
33
    //Read data from stdin
34
    RxD_din,
35
    RxD_wr,
36
    RxD_ready
37
 
38
 
39
);
40
 
41
    localparam
42
        Dw            =   32,
43
        M_Aw          =   32,
44
    TAGw          =   3,
45
    SELw          =   4;
46
 
47
 
48
 
49
    input reset,clk;
50
//wishbone slave interface signals
51
    input   [Dw-1       :   0]      s_dat_i;
52
    input   [SELw-1     :   0]      s_sel_i;
53
    input                           s_addr_i;
54
    input   [TAGw-1     :   0]      s_cti_i;
55
    input                           s_stb_i;
56
    input                           s_cyc_i;
57
    input                           s_we_i;
58
 
59
    output  reg [Dw-1       :   0]  s_dat_o;
60
    output  reg                     s_ack_o;
61
 
62
//Read data from stdin
63
    input [7:0]  RxD_din;
64
    input RxD_wr;
65
    output RxD_ready;
66
 
67
 
68
     wire s_ack_o_next    =   s_stb_i & (~s_ack_o);
69
 
70
    always @(posedge clk)begin
71
        if( reset   )s_ack_o<=1'b0;
72
       else s_ack_o<=s_ack_o_next;
73
    end
74
 
75
 
76
//synthesis translate_off
77
//synopsys  translate_off
78
 
79
 
80
 
81
    reg RxD_rd_en;
82
    wire [7:0] RxD_dout;
83
    wire RxD_full, RxD_nearly_full,RxD_empty,RxD_wr_en;
84
 
85
    assign   RxD_ready=~RxD_nearly_full;
86
    assign   RxD_wr_en= RxD_wr & ~RxD_nearly_full;
87
 
88
   function integer log2;
89
      input integer number; begin
90
         log2=(number <=1) ? 1: 0;
91
         while(2**log2<number) begin
92
            log2=log2+1;
93
         end
94
      end
95
    endfunction // log2 
96
 
97
    localparam CNTw= log2(WAIT_COUNT+1);
98
    localparam Bw = log2(BUFFER_SIZE+1);
99
 
100
    reg [CNTw-1 :   0]counter,counter_next;
101
    reg [7  : 0 ] buffer [ BUFFER_SIZE-1    :   0];
102
   /*
103
    wire [BUFFER_SIZE*8-1:0] string_wire;
104
    genvar k;
105
    generate
106
    for(k=0;k<BUFFER_SIZE;k=k+1)begin
107
        assign string_wire[(BUFFER_SIZE-k)*8-1   : (BUFFER_SIZE-k-1)*8] = buffer[k];
108
    end
109
    endgenerate
110
   */
111
 
112
    reg [Bw-1   :   0] ptr,ptr_next;
113
 
114
    always @(posedge clk)begin
115
        if( reset   )s_ack_o<=1'b0;
116
       else s_ack_o<=s_ack_o_next;
117
    end
118
 
119
 
120
  reg print_en,buff_en;
121
 
122
 
123
   always @(*)begin
124
        counter_next = counter;
125
        ptr_next = ptr;
126
        print_en =0;
127
        buff_en=0;
128
        RxD_rd_en=1'b0;
129
        s_dat_o = 32'hFFFF0000;
130
 
131
        if ( counter >= WAIT_COUNT || ptr >= BUFFER_SIZE || buffer[ptr-1] == "\n") begin
132
            counter_next = 0;
133
            ptr_next =0;
134
            print_en =1;
135
        end
136
        else if (ptr > 0 ) counter_next = counter + 1'b1;
137
 
138
        //write      
139
        if( s_stb_i &  s_cyc_i &  s_we_i & s_ack_o  )begin
140
           buff_en=1;
141
           if( ptr < BUFFER_SIZE)begin
142
                ptr_next  =  ptr+1;
143
           end
144
        end
145
 
146
        //read
147
        if( s_stb_i &  s_cyc_i &  ~s_we_i & s_ack_o  )begin
148
            RxD_rd_en=(RxD_empty)? 1'b0 : 1'b1;
149
            s_dat_o={16'hFFFF,~RxD_empty,7'b0,RxD_dout};
150
        end
151
 
152
    end
153
 
154
 
155
 
156
    RxD_fifo #(
157
        .Dw(8),
158
        .B(BUFFER_SIZE)
159
    )
160
    the_RxD_fifo
161
    (
162
        .din(RxD_din),
163
        .wr_en(RxD_wr_en),
164
        .rd_en(RxD_rd_en),
165
        .dout(RxD_dout),
166
        .full(RxD_full),
167
        .nearly_full(RxD_nearly_full),
168
        .empty(RxD_empty),
169
        .reset(reset),
170
        .clk(clk)
171
    );
172
 
173
 
174
 
175
    integer i;
176
    always @(posedge clk)begin
177
        if(reset) begin
178
            counter<=0;
179
            ptr<=0;
180
            buffer[0]<=0;
181
        end else begin
182
            counter<=counter_next;
183
            ptr <= ptr_next;
184
            if( buff_en )begin
185
                buffer[ptr]<=s_dat_i[7:0];
186
                if(ptr<BUFFER_SIZE-1) buffer[ptr+1]<=0;
187
            end
188
            if (print_en)  for(i=0;i<  ptr;i=i+1) $write("%c",buffer[i]);
189
 /*
190
  if (print_en)begin
191
        $write("%s",string_wire);
192
        for(i=0;i< BUFFER_SIZE ;i=i+1) buffer[i]=0;
193
      end
194
*/
195
        end
196
 
197
    end
198
 
199
 
200
 
201
 
202
 
203
 //synopsys  translate_on
204
//synthesis translate_on 
205
 
206
endmodule
207
 
208
 
209
 
210
/**********************************
211
 
212
            fifo
213
 
214
*********************************/
215
 
216
 
217
module RxD_fifo  #(
218
    parameter Dw = 72,//data_width
219
    parameter B  = 10// buffer num
220
)(
221
    din,
222
    wr_en,
223
    rd_en,
224
    dout,
225
    full,
226
    nearly_full,
227
    empty,
228
    reset,
229
    clk
230
);
231
 
232
 
233
    function integer log2;
234
      input integer number; begin
235
         log2=(number <=1) ? 1: 0;
236
         while(2**log2<number) begin
237
            log2=log2+1;
238
         end
239
      end
240
    endfunction // log2 
241
 
242
    localparam  B_1 = B-1,
243
                Bw = log2(B),
244
                DEPTHw=log2(B+1);
245
    localparam  [Bw-1   :   0] Bint =   B_1[Bw-1    :   0];
246
 
247
    input [Dw-1:0] din;     // Data in
248
    input          wr_en;   // Write enable
249
    input          rd_en;   // Read the next word
250
 
251
    output  [Dw-1:0]  dout;    // Data out
252
    output         full;
253
    output         nearly_full;
254
    output         empty;
255
 
256
    input          reset;
257
    input          clk;
258
 
259
 
260
 
261
reg [Dw-1       :   0] queue [B-1 : 0] /* synthesis ramstyle = "no_rw_check" */;
262
reg [Bw- 1      :   0] rd_ptr;
263
reg [Bw- 1      :   0] wr_ptr;
264
reg [DEPTHw-1   :   0] depth;
265
 
266
// Sample the data
267
always @(posedge clk)
268
begin
269
   if (wr_en)
270
      queue[wr_ptr] <= din;
271
 
272
 
273
end
274
 
275
 assign dout = queue[rd_ptr];
276
 
277
always @(posedge clk)
278
begin
279
   if (reset) begin
280
      rd_ptr <= {Bw{1'b0}};
281
      wr_ptr <= {Bw{1'b0}};
282
      depth  <= {DEPTHw{1'b0}};
283
   end
284
   else begin
285
      if (wr_en) wr_ptr <= (wr_ptr==Bint)? {Bw{1'b0}} : wr_ptr + 1'b1;
286
      if (rd_en) rd_ptr <= (rd_ptr==Bint)? {Bw{1'b0}} : rd_ptr + 1'b1;
287
      if (wr_en & ~rd_en) depth <=
288
//synthesis translate_off
289
//synopsys  translate_off
290
                   #1
291
//synopsys  translate_on
292
//synthesis translate_on  
293
                   depth + 1'b1;
294
      else if (~wr_en & rd_en) depth <=
295
//synthesis translate_off
296
//synopsys  translate_off
297
                   #1
298
//synopsys  translate_on
299
//synthesis translate_on  
300
                   depth - 1'b1;
301
   end
302
end
303
 
304
//assign dout = queue[rd_ptr];
305
assign full = depth == B;
306
assign nearly_full = depth >= B-1;
307
assign empty = depth == {DEPTHw{1'b0}};
308
 
309
//synthesis translate_off
310
//synopsys  translate_off
311
always @(posedge clk)
312
begin
313
    if(~reset)begin
314
       if (wr_en && depth == B && !rd_en)
315
          $display(" %t: ERROR: Attempt to write to full FIFO: %m",$time);
316
       if (rd_en && depth == {DEPTHw{1'b0}})
317
          $display("%t: ERROR: Attempt to read an empty FIFO: %m",$time);
318
    end//~reset
319
end
320
//synopsys  translate_on
321
//synthesis translate_on
322
 
323
endmodule // fifo
324
 
325
 

powered by: WebSVN 2.1.0

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