1 module demo_wishbone_master(
\r
7 // Pulsed when RxData_i is valid
\r
11 // Asserted when ready for a new Tx byte
\r
14 // Pulsed when TxData_o is valid
\r
18 //--- Wishbone interface
\r
33 //--- UART interface
\r
35 // Pulsed when RxData_i is valid
\r
37 input [7:0] RxData_i;
\r
39 // Asserted when ready for a new Tx byte
\r
42 // Pulsed when TxData_o is valid
\r
44 output [7:0] TxData_o;
\r
50 output [14:0] ADR_O;
\r
52 output [15:0] DAT_O;
\r
56 //-------------------------------------------------------------------------
\r
57 // Local declarations
\r
58 //-------------------------------------------------------------------------
\r
70 //-------------------------------------------------------------------------
\r
71 // Instantiation of sub-modules
\r
72 //-------------------------------------------------------------------------
\r
74 //--- Transmit FSM --------------------------------------------------------
\r
76 parameter TX_STATE_IDLE = 0;
\r
77 parameter TX_STATE_INIT = 1;
\r
78 parameter TX_STATE_OK = 2;
\r
79 parameter TX_STATE_ERROR = 3;
\r
80 parameter TX_STATE_VALUE = 4;
\r
81 parameter TX_STATE_LF = 5;
\r
87 wire [15:0] TxValue16;
\r
88 wire [3:0] TxHexDigit;
\r
89 wire [7:0] TxHexChar;
\r
94 always @( negedge Reset_n or posedge Clk )
\r
97 TxState <= TX_STATE_INIT;
\r
108 // Don't do anything in cycle following TxValid_o being pulsed
\r
114 0: TxData_o <= "R";
\r
115 1: TxData_o <= "E";
\r
116 2: TxData_o <= "A";
\r
117 3: TxData_o <= "D";
\r
118 4: TxData_o <= "Y";
\r
119 default: TxLast <= 1;
\r
124 0: TxData_o <= "O";
\r
125 1: TxData_o <= "K";
\r
126 default: TxLast <= 1;
\r
131 0: TxData_o <= "E";
\r
132 1: TxData_o <= "R";
\r
133 2: TxData_o <= "R";
\r
134 3: TxData_o <= "O";
\r
135 4: TxData_o <= "R";
\r
136 default: TxLast <= 1;
\r
141 0,1,2,3: TxData_o <= TxHexChar;
\r
142 default: TxLast <= 1;
\r
151 TxState <= TX_STATE_OK;
\r
152 else if ( TxERROR )
\r
153 TxState <= TX_STATE_ERROR;
\r
154 else if ( TxValue )
\r
156 TxState <= TX_STATE_VALUE;
\r
162 if ( (TxState != TX_STATE_IDLE) & TxReady_i )
\r
168 if ( TxState == TX_STATE_LF )
\r
170 TxData_o <= 10; // LF
\r
171 TxState <= TX_STATE_IDLE;
\r
177 TxData_o <= 13; // CR
\r
178 TxState <= TX_STATE_LF;
\r
182 TxIndex <= TxIndex + 1;
\r
187 assign TxHexDigit = (TxIndex==0) ? TxValue16[15:12] :
\r
188 (TxIndex==1) ? TxValue16[11: 8] :
\r
189 (TxIndex==2) ? TxValue16[ 7: 4] :
\r
192 assign TxHexChar = (TxHexDigit <= 9) ? (TxHexDigit + "0") :
\r
193 (TxHexDigit + "A"-'hA);
\r
195 //--- Receive FSM ---------------------------------------------------------
\r
197 parameter RX_STATE_IDLE = 0;
\r
198 parameter RX_STATE_VALUE16_FIRST = 1;
\r
199 parameter RX_STATE_VALUE16 = 2;
\r
200 parameter RX_STATE_COMMENT = 3;
\r
201 parameter RX_STATE_CMD = 4;
\r
205 wire IsWhiteSpace = ( RxData_i==" " ) |
\r
206 ( RxData_i=="\t" ) |
\r
207 ( RxData_i=="," ) |
\r
210 wire IsHexDigit = (( RxData_i >= "0" ) & ( RxData_i <= "9" )) |
\r
211 (( RxData_i >= "a" ) & ( RxData_i <= "f" )) |
\r
212 (( RxData_i >= "A" ) & ( RxData_i <= "F" ));
\r
213 wire [3:0] RxHexValue =
\r
214 (( RxData_i >= "0" ) & ( RxData_i <= "9" )) ? RxData_i[3:0] :
\r
215 (( RxData_i >= "a" ) & ( RxData_i <= "f" )) ? (RxData_i-"a"+'hA) :
\r
216 (( RxData_i >= "A" ) & ( RxData_i <= "F" )) ? (RxData_i-"A"+'hA) : 0;
\r
218 reg [15:0] RxValue16;
\r
222 reg [15:0] RegAddr;
\r
223 reg [15:0] RegRdData;
\r
225 assign TxValue16 = RegRdData;
\r
227 always @( negedge Reset_n or posedge Clk )
\r
230 RxState <= RX_STATE_IDLE;
\r
232 RxValue16 <= 16'h0;
\r
257 if ( RxState == RX_STATE_CMD )
\r
259 STB_ETH_O <= ( RegAddr[15:12] == 4'h0 );
\r
260 STB_PG_O <= ( RegAddr[15:12] == 4'h1 );
\r
261 STB_PDM_O <= ( RegAddr[15] == 1'b1 );
\r
264 ADR_O <= RegAddr[14:0];
\r
269 // Register transaction is completing!
\r
275 // Latch data read in case of a read
\r
276 RegRdData <= DAT_I;
\r
279 // Transaction was a register write
\r
284 RxState <= RX_STATE_IDLE;
\r
287 else if ( (TxState == TX_STATE_IDLE) & RxValid_i )
\r
289 // A byte has been received!
\r
293 if ( (RxData_i == "w") | (RxData_i == "W") )
\r
295 // Write Register Command: W rrrr dddd
\r
296 RxState <= RX_STATE_VALUE16_FIRST;
\r
300 else if ( (RxData_i == "r") | (RxData_i == "R") )
\r
302 // Read Register Command: R rrrr
\r
303 RxState <= RX_STATE_VALUE16_FIRST;
\r
306 else if ( RxData_i == "/" )
\r
309 RxState <= RX_STATE_COMMENT;
\r
311 else if ( ~IsWhiteSpace )
\r
312 // Unknown command!
\r
316 if ( (RxData_i == 13) | (RxData_i == 10) )
\r
317 // CR or LF - end of comment
\r
318 RxState <= RX_STATE_IDLE;
\r
320 RX_STATE_VALUE16_FIRST:
\r
323 RxValue16 <= { 12'b0, RxHexValue };
\r
324 RxState <= RX_STATE_VALUE16;
\r
326 else if ( ~IsWhiteSpace )
\r
328 // Unexpected character!
\r
330 RxState <= RX_STATE_IDLE;
\r
335 RxValue16 <= { RxValue16[11:0], RxHexValue };
\r
336 else if ( IsWhiteSpace )
\r
338 // Done collecting 16-bit value
\r
341 // This is a register write
\r
344 // Second time around - just received write data
\r
345 DAT_O <= RxValue16;
\r
346 RxState <= RX_STATE_CMD;
\r
350 // Just received register address - expecting second argument
\r
351 RegAddr <= RxValue16;
\r
352 RxState <= RX_STATE_VALUE16_FIRST;
\r
353 RxWrData <= 1; // Now receive the write data
\r
358 // This is a register read
\r
359 RegAddr <= RxValue16;
\r
360 RxState <= RX_STATE_CMD;
\r
365 // Unexpected character!
\r
367 RxState <= RX_STATE_IDLE;
\r