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/] [Other/] [simulator_UART.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
module  simulator_UART #(
17
    parameter BUFFER_SIZE   =100,
18
    parameter WAIT_COUNT    =1000,
19
    parameter Dw            =   32,
20
    parameter S_Aw          =   7,
21
    parameter M_Aw          =   32,
22
    parameter TAGw          =   3,
23
    parameter SELw          =   4
24
 
25
 
26
)(
27
    reset,
28
    clk,
29
    s_dat_i,
30
    s_sel_i,
31
    s_addr_i,
32
    s_cti_i,
33
    s_stb_i,
34
    s_cyc_i,
35
    s_we_i,
36
    s_dat_o,
37
    s_ack_o
38
 
39
 
40
);
41
 
42
 
43
 
44
 
45
 
46
    input reset,clk;
47
//wishbone slave interface signals
48
    input   [Dw-1       :   0]      s_dat_i;
49
    input   [SELw-1     :   0]      s_sel_i;
50
    input   [S_Aw-1     :   0]      s_addr_i;
51
    input   [TAGw-1     :   0]      s_cti_i;
52
    input                           s_stb_i;
53
    input                           s_cyc_i;
54
    input                           s_we_i;
55
 
56
    output  reg    [Dw-1       :   0]  s_dat_o;
57
    output  reg                     s_ack_o;
58
 
59
     wire s_ack_o_next    =   s_stb_i & (~s_ack_o);
60
 
61
    always @(posedge clk)begin
62
        if( reset   )s_ack_o<=1'b0;
63
       else s_ack_o<=s_ack_o_next;
64
    end
65
 
66
 
67
//synthesis translate_off
68
//synopsys  translate_off
69
 
70
   function integer log2;
71
      input integer number; begin
72
         log2=(number <=1) ? 1: 0;
73
         while(2**log2<number) begin
74
            log2=log2+1;
75
         end
76
      end
77
    endfunction // log2 
78
 
79
    localparam CNTw= log2(WAIT_COUNT+1);
80
    localparam Bw = log2(BUFFER_SIZE+1);
81
 
82
    reg [CNTw-1 :   0]counter,counter_next;
83
    reg [7  : 0 ] buffer [ BUFFER_SIZE-1    :   0];
84
    reg [Bw-1   :   0] ptr,ptr_next;
85
 
86
    always @(posedge clk)begin
87
        if( reset   )s_ack_o<=1'b0;
88
       else s_ack_o<=s_ack_o_next;
89
    end
90
 
91
 
92
  reg print_en,buff_en;
93
  reg [5:0] reset_count,reset_count_next;
94
   always @(*)begin
95
        counter_next = counter;
96
        reset_count_next=reset_count;
97
        ptr_next = ptr;
98
        print_en =0;
99
        buff_en=0;
100
        if (reset_count>=10 || counter >= WAIT_COUNT || ptr >= BUFFER_SIZE) begin
101
           reset_count_next=0;
102
           counter_next = 0;
103
           ptr_next =0;
104
           print_en =1;
105
        end
106
        else if (ptr > 0 ) counter_next = counter + 1'b1;
107
        if( s_stb_i &  s_cyc_i &  s_we_i & s_ack_o  )begin
108
           counter_next=0;
109
           reset_count_next=reset_count + 1'b1;
110
           buff_en=1;
111
           if( ptr < BUFFER_SIZE)begin
112
                ptr_next  =  ptr+1;
113
           end
114
        end
115
    end
116
 
117
 
118
 
119
 
120
  integer i;
121
 
122
 
123
 
124
 
125
 
126
 
127
  always @(posedge clk)begin
128
    if(reset) begin
129
        reset_count<=0;
130
        counter<=0;
131
        ptr<=0;
132
    end else begin
133
       reset_count<=reset_count_next;
134
       counter<=counter_next;
135
       ptr <= ptr_next;
136
       if( buff_en )  buffer[ptr]<=s_dat_i[7:0];
137
       if (print_en)  for(i=0;i<  ptr;i=i+1) $write("%c",buffer[i]);
138
    end
139
  end
140
 
141
 
142
 
143
 
144
 //synopsys  translate_on
145
//synthesis translate_on 
146
 
147
endmodule
148
 

powered by: WebSVN 2.1.0

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