OpenCores
URL https://opencores.org/ocsvn/socgen/socgen/trunk

Subversion Repositories socgen

[/] [socgen/] [trunk/] [common/] [opencores.org/] [Testbench/] [bfms/] [uart_model/] [rtl/] [verilog/] [top.rtl] - Blame information for rev 131

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

Line No. Rev Author Line
1 131 jt_eaton
 
2
 
3
reg              rx_parity_enable;               // 0 = no parity bit sent; 1= parity bit sent
4
reg              rx_parity    ;
5
reg              rx_force_parity    ;
6
reg              rx_stop_value;                  // value out for stop bit
7
reg              rx_start_detect;
8
reg [7:0]        rx_shift_buffer;
9
reg              rx_parity_calc;
10
reg              rx_parity_samp;
11
reg              rx_parity_error;
12
reg              rx_frame_err;
13
reg [7:0]        exp_rx_shift_buffer;
14
reg              exp_rx_parity_err;
15
reg              exp_rx_frame_err;
16
reg [7:0]        mask_rx_shift_buffer;
17
reg              mask_rx_parity_err;
18
reg              mask_rx_frame_err;
19
 
20
 
21
reg              rx_frame_rdy;
22
 
23
 
24
reg              rx_baud_enable;
25
wire             rx_stop_cnt;
26
wire             rx_last_cnt;
27
wire [7:0]       next_rx_shift_buffer;
28
wire             next_rx_parity_calc;
29
wire             next_rx_parity_samp;
30
wire             next_rx_frame_err;
31
 
32
 
33
reg              rxd_pad_sig;
34
reg [1:0]        rx_rdy_del;
35
reg [SIZE-1:0]   rx_baudgen;
36
reg              edge_enable;
37
reg  [SIZE-1:0]  divide_cnt;
38
 
39
 
40
   wire xmit_enable;
41
reg         txd_parity_enable;
42
reg         txd_force_parity;
43
reg         txd_parity;
44
reg         txd_load;
45
reg         txd_break;
46
reg  [7:0]  txd_data_in;
47
wire        txd_buffer_empty;
48
 
49
 
50
//
51
//   watch for start bit
52
//
53
 
54
 
55
 
56
always@(posedge clk)
57
  if(reset)
58
  begin
59
   rx_parity_enable     <= 1'b0;
60
   rx_parity            <= 1'b0;
61
   rx_force_parity      <= 1'b0;
62
   rx_stop_value        <= 1'b1;
63
   exp_rx_frame_err     <= 1'b0;
64
   exp_rx_parity_err    <= 1'b0;
65
   exp_rx_shift_buffer  <= 8'h00;
66
   mask_rx_frame_err    <= 1'b0;
67
   mask_rx_parity_err   <= 1'b0;
68
   mask_rx_shift_buffer <= 8'h00;
69
   txd_parity_enable    <= 1'b0;
70
   txd_force_parity     <= 1'b0;
71
   txd_parity           <= 1'b0;
72
   txd_load             <= 1'b0;
73
   txd_break            <= 1'b0;
74
   txd_data_in          <= 8'h00;
75
  end
76
 
77
 
78
 
79
 
80
wire  [7:0]  prb_rx_shift_buffer;
81
wire    prb_rx_frame_err;
82
wire    prb_rx_parity_err;
83
 
84
assign  prb_rx_shift_buffer =  rx_shift_buffer;
85
assign  prb_rx_frame_err    =  rx_frame_err;
86
assign  prb_rx_parity_err   =  rx_parity_error;
87
 
88
 
89
io_probe_def
90
#(.MESG   ("uart data receive error"),
91
  .WIDTH  (8)
92
  )
93
rx_shift_buffer_prb
94
(
95
  .clk           ( clk ),
96
  .drive_value   (8'bzzzzzzzz),
97
  .expected_value( exp_rx_shift_buffer),
98
  .mask          ( mask_rx_shift_buffer),
99
  .signal        ( prb_rx_shift_buffer)
100
);
101
 
102
 
103
io_probe_def
104
#(.MESG   ("uart parity error"))
105
rx_parity_err_prb
106
(
107
  .clk           ( clk ),
108
  .drive_value   (1'bz),
109
  .expected_value( exp_rx_parity_err),
110
  .mask          ( mask_rx_parity_err),
111
  .signal        ( prb_rx_parity_err)
112
);
113
 
114
 
115
 
116
 
117
 
118
 
119
 
120
 
121
 
122
 
123
 
124
 
125
always@(posedge clk)
126
if(reset)                 rx_baudgen <= CLKCNT;
127
else
128
if(rx_baudgen == 4'h0)    rx_baudgen <= CLKCNT;
129
else                      rx_baudgen <= rx_baudgen - 1'h1;
130
 
131
 
132
 
133
always@(posedge clk)
134
if(reset)                 edge_enable <= 1'b0;
135
else                      edge_enable <= (rx_baudgen == {SIZE{1'b0}});
136
 
137
 
138
 
139
 
140
 
141
 
142
always@(posedge clk)
143
if(reset)                                              rxd_pad_sig <= 1'b1;
144
else                                                   rxd_pad_sig <= txd_in;
145
 
146
 
147
always@(posedge clk)
148
if(reset)                                              rx_start_detect <= 1'b0;
149
else
150
if(rx_start_detect)
151
  begin
152
    if(rx_stop_cnt  && edge_enable )                      rx_start_detect <= !rxd_pad_sig;
153
    else
154
    if(rx_last_cnt)                                       rx_start_detect <= 1'b0;
155
    else                                               rx_start_detect <= 1'b1;
156
  end
157
else
158
if(!rxd_pad_sig )                                      rx_start_detect <= 1'b1;
159
else                                                   rx_start_detect <= rx_start_detect;
160
 
161
 
162
always@(posedge clk)
163
  if(reset)
164
    begin
165
    rx_frame_rdy <= 1'b0;
166
    rx_rdy_del   <= 2'b00;
167
    end
168
  else
169
    begin
170
    rx_frame_rdy <=  rx_rdy_del[1] ;
171
    rx_rdy_del   <=  {rx_rdy_del[0],rx_last_cnt};
172
    end
173
 
174
 
175
uart_model_serial_rcvr
176
#(.WIDTH(8),  .SIZE(4) )
177
serial_rcvr
178
 (
179
     .clk              ( clk                ),
180
     .reset            ( reset              ),
181
     .edge_enable      ( rx_baud_enable        ),
182
     .parity_enable    ( rx_parity_enable      ),
183
     .parity_type      ( {rx_force_parity, rx_parity }    ),
184
     .stop_cnt         ( rx_stop_cnt           ),
185
     .last_cnt         ( rx_last_cnt           ),
186
     .stop_value       ( rx_stop_value         ),
187
     .ser_in           ( txd_in             ),
188
     .shift_buffer     ( next_rx_shift_buffer  ),
189
     .parity_calc      ( next_rx_parity_calc   ),
190
     .parity_samp      ( next_rx_parity_samp   ),
191
     .frame_err        ( next_rx_frame_err     )
192
);
193
 
194
 
195
 
196
 
197
 
198
 
199
 
200
 
201
always@(posedge clk)
202
  if( reset || (!rx_start_detect))    rx_baud_enable    <= 1'b0;
203
  else
204
  if(!edge_enable)                    rx_baud_enable    <= 1'b0;
205
  else                                rx_baud_enable    <=  ( divide_cnt == 4'b1000 );
206
 
207
 
208
 
209
always@(posedge clk)
210
  if( reset || (!rx_start_detect))    divide_cnt    <= 4'b1111;
211
  else
212
  if(!edge_enable)                    divide_cnt    <= divide_cnt;
213
  else
214
  if(!(|divide_cnt))                  divide_cnt    <= 4'b1111;
215
  else                                divide_cnt    <= divide_cnt - 'b1;
216
 
217
 
218
 
219
 
220
 
221
 
222
always@(posedge clk)
223
  if(reset)
224
     begin
225
          rx_shift_buffer   <=  8'h00;
226
          rx_parity_calc    <=  1'b0;
227
          rx_parity_samp    <=  1'b0;
228
          rx_parity_error   <=  1'b0;
229
          rx_frame_err      <=  1'b0;
230
     end
231
  else
232
  if(rx_last_cnt )
233
      begin
234
          rx_shift_buffer   <=  next_rx_shift_buffer;
235
          rx_parity_calc    <=  next_rx_parity_calc;
236
          rx_parity_samp    <=  next_rx_parity_samp;
237
          rx_parity_error   <=  (next_rx_parity_samp ^ next_rx_parity_calc) && rx_parity_enable;
238
          rx_frame_err      <=  next_rx_frame_err;
239
      end
240
  else
241
     begin
242
          rx_shift_buffer   <=  rx_shift_buffer;
243
          rx_parity_calc    <=  rx_parity_calc;
244
          rx_parity_samp    <=  rx_parity_samp;
245
          rx_parity_error   <=  rx_parity_error;
246
          rx_frame_err      <=  rx_frame_err;
247
      end
248
 
249
 
250
/////////////////  Xmit
251
 
252
 
253
 
254
 
255
 
256
 
257
 
258
 
259
 
260
 
261
 
262
uart_model_divider
263
#(.SIZE(4))
264
x_divider  (
265
         .clk             ( clk             ),
266
         .reset           ( reset           ),
267
         .divider_in      ( 4'b1111         ),
268
         .enable          ( edge_enable     ),
269
         .divider_out     ( xmit_enable     )
270
         );
271
 
272
 
273
 
274
 
275
 
276
uart_model_serial_xmit
277
serial_xmit (
278
               .clk              ( clk                              ),
279
               .reset            ( reset                            ),
280
               .edge_enable      ( xmit_enable                      ),
281
               .parity_enable    ( txd_parity_enable                ),
282
               .two_stop_enable  ( 1'b0                             ),
283
               .parity_type      ( {txd_force_parity, txd_parity }  ),
284
               .load             ( txd_load                         ),
285
               .start_value      ( 1'b0                             ),
286
               .stop_value       (!txd_break                        ),
287
               .data             ( txd_data_in                      ),
288
               .buffer_empty     ( txd_buffer_empty                 ),
289
               .ser_out          ( rxd_out                          )
290
                );
291
 
292
 
293
 
294
 
295
 

powered by: WebSVN 2.1.0

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