Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
10/01/07 18:55
Read: times


 
Msg Score: +1
 +1 Good Answer/Helpful
#145203 - reason for the skew warning
Responding to: ???'s previous message
You're dividing the 50 MHz input clock down using a counter and a flop that toggles when the counter hits certain values.

Then you take that flip-flop output and use it as a clock input for another divider.

The tools do not understand that your first divider's output is supposed to be used as a clock, so baudClock ends up on local (non-low-skew) routing resources. Also, it is impossible to set proper timing constraints on baudClock. Look at the design in the FPGA editor.

There are a couple of ways of fixing this.

a) Instantiate a global clock buffer whose input is the output of the divider that generates baudClock, and whose output drives the baudClock net.

b) Instead of using the baudClock signal as a clock, instead make it a strobe that is asserted for one master clock tick once every baudClock period. Then, in uat.v, use clock50MHz as the clock input and use baudClock as a clock enable.

I prefer using the latter. Timing analysis is greatly simplified as everything is synchronous to the 50 MHz clock. FPGA flip-flops have clock-enable inputs and the tools are smart enough to know how to use them.

Here's how I would implement this.

This is the top level module, which glues everything together.
module toplevel
    #(parameter DIVCNT = 1000,	// count to this number
                DIVSIZE = 10)   // need enough bits to count to DIVCNT
    (input wire MClk,		// FPGA master clock
     input wire Strobe,		// true with new data word
     input wire [7:0]DataIn,	// new word to write
     output reg RS232Out,	// serial transmit data
     output reg TxBusy);	// transmitter is busy

    // clock divider output:
    wire 	ClkDiv;
    
    // here is the clock divider:
    clockdiv 
	#(.DIVCNT(DIVCNT),
	  .DIVSIZE(DIVSIZE)) u0
	    (.MClk(MClk),
	     .ClkDiv(ClkDiv));

    // and the transmitter:
    uat u1
	(.MClk(MClk),
	 .BaudClk(BaudClk),
	 .Strobe(Strobe),
	 .DataIn(DataIn),
	 .RS232Out(RS232Out),
	 .TxBusy(TxBusy));

endmodule // toplevel

Here is the clock divider, which generates the baud rate timer.
module clockdiv
    #(parameter DIVCNT = 1000,	// count to this number
                DIVSIZE = 10)   // need enough bits to count to DIVCNT
    (input wire MClk,		// FPGA master clock
     output reg ClkDiv);	// clock divider strobe out

    reg [DIVCNT:0] iCounter; 	// our counter

    // when counter hits target DIVCNT, assert the ClkDiv strobe and
    // reset the counter.
    // Otherwise, just count and keep ClkDiv cleared.
    always @(posedge MClk) begin : Divider
	if (iCounter == DIVCNT) begin
	    ClkDiv     <= 1'b1;
	    iCounter   <= 0;
	end else begin
	    ClkDiv     <= 1'b0;
	    iCounter   <= iCounter + 1;
	end // else: !if(iCounter == DIVCNT)
    end // block: Divider
endmodule // clockdiv
and here is the transmitter. Note that Strobe is NOT used as if it is an asynchronous reset/load here. It (along with DataIn) must be synchronous to MClk.
module uat
    (input wire MClk,		// master clock
     input wire BaudClk,	// clock enable at the baud rate
     input wire Strobe,		// indicates new word
     input wire [7:0]DataIn,	// new word to write
     output reg RS232Out,	// serial transmit data
     output reg TxBusy);	// transmitter is busy

    reg [9:0] 	iTxShift;	// transmit shift reg
    reg [3:0] 	iBitCnt;	// bit counter

    // Shifter loads when strobe is asserted coincident with a new word coming
    // in on DataIn, and it resets the shift and bit counters.
    // Shift takes place when BaudClk is asserted.  It should be one MClk tick
    // wide every transmit bit time.
    always @(posedge MClk) begin : Shifter
	if (Strobe) begin
	    iTxShift   <= {1'b1, DataIn, 1'b0};	// love concatenation!
	    iBitCnt    <= 9;
	    TxBusy     <= 1'b1;
	end else begin // if (Strobe)
	    if (BaudClk) begin
		if (iBitCnt != 0) begin
		    iTxShift   <= {1'b0, iTxShift[9:1]};
		    iBitCnt    <= iBitCnt - 1;
		end
		RS232Out       <= iTxShift[0];
		TxBusy 	       <= (iBitCnt != 0);
	    end // if (BaudClk)
	end // else: !if(Strobe)
    end // block: Shifter
endmodule // uat
Again, note that all three should be in their own source files.

-a


List of 147 messages in thread
TopicAuthorDate
Getting Started With FPGAs, Part II            01/01/70 00:00      
   I didn't find it too big a job ... YMMV, of course            01/01/70 00:00      
   when it doesnt work            01/01/70 00:00      
      I'd guess...            01/01/70 00:00      
         Curses            01/01/70 00:00      
   OP Update 1 of ???            01/01/70 00:00      
      On your way ...            01/01/70 00:00      
         Not windows this time?            01/01/70 00:00      
            Not Windows every time, anyway            01/01/70 00:00      
      re: OP Update            01/01/70 00:00      
         what might be helpful before you get too far along            01/01/70 00:00      
   OP Update 2 of ???            01/01/70 00:00      
      re: update            01/01/70 00:00      
         The Verilog == C trap            01/01/70 00:00      
            re: The Verilog == C trap            01/01/70 00:00      
               Thinking hardware            01/01/70 00:00      
                  I read somewhere ...            01/01/70 00:00      
                  re: Thinking Hardware            01/01/70 00:00      
               One reason why HDL isnt the same as software            01/01/70 00:00      
                  Have I got this right?            01/01/70 00:00      
                     re: Have I got this right?            01/01/70 00:00      
                        re: re: Have I got this right?            01/01/70 00:00      
                           re: OT            01/01/70 00:00      
                        Nothing\'s perfect            01/01/70 00:00      
                        The thing to watch with FPGA's            01/01/70 00:00      
   OP Update 3 of ?            01/01/70 00:00      
      have you looked at the resource utilization?            01/01/70 00:00      
         Just a little bit            01/01/70 00:00      
            On a slightly different note..            01/01/70 00:00      
               the lesson ...            01/01/70 00:00      
               HDL coding to "help" the synthesizer            01/01/70 00:00      
         Please clarify            01/01/70 00:00      
            think hardware            01/01/70 00:00      
               this sounds like...            01/01/70 00:00      
                  re: this sounds like            01/01/70 00:00      
               Please clarify again            01/01/70 00:00      
                  for purpose of understanding ... YES            01/01/70 00:00      
                  answer            01/01/70 00:00      
      double assignment            01/01/70 00:00      
         Good catch, I think            01/01/70 00:00      
            re: Good Catch            01/01/70 00:00      
      block vs nonblocking            01/01/70 00:00      
         I have unplugged my eval board            01/01/70 00:00      
            re: Unplugged            01/01/70 00:00      
   OP Update 4 of ?            01/01/70 00:00      
      Another question about the counter            01/01/70 00:00      
         what's wrong            01/01/70 00:00      
            \'initial\' block            01/01/70 00:00      
               general Verilog coding advice            01/01/70 00:00      
                  Wow            01/01/70 00:00      
            Where does "reset" come from?            01/01/70 00:00      
   OP Dumb Question 1 of ?            01/01/70 00:00      
      look at it in the other way            01/01/70 00:00      
         But isn\'t it out of spec?            01/01/70 00:00      
            If you look more closely at the spec ...            01/01/70 00:00      
         which tools?            01/01/70 00:00      
            fanout exceeded            01/01/70 00:00      
               device dependence            01/01/70 00:00      
      newer data sheet?            01/01/70 00:00      
      Metastability            01/01/70 00:00      
         ... and contact bounce            01/01/70 00:00      
            That might not be a worry ...            01/01/70 00:00      
               Thanks            01/01/70 00:00      
   OP Update 5 of ?            01/01/70 00:00      
      do you mean, adaptive threshold?            01/01/70 00:00      
         Yes            01/01/70 00:00      
            PicoBlaze            01/01/70 00:00      
               Andy ... about that PicoBlaze ...            01/01/70 00:00      
                  re: about picoblaze            01/01/70 00:00      
         the boundary is quite arbitrary            01/01/70 00:00      
            Yes            01/01/70 00:00      
   OP Update 6 of ?            01/01/70 00:00      
      a better way            01/01/70 00:00      
   OP Update 7 of ?            01/01/70 00:00      
      OP Update 7.01            01/01/70 00:00      
         excessive skew warning            01/01/70 00:00      
            Offensive code here            01/01/70 00:00      
               On a slightly different note            01/01/70 00:00      
                  whatizit?            01/01/70 00:00      
                  free vs paid-for ModelSim            01/01/70 00:00      
               reason for the skew warning            01/01/70 00:00      
                  error            01/01/70 00:00      
                  I\\\'m drinking from a fire hose!            01/01/70 00:00      
                     fIREHOSE            01/01/70 00:00      
                        Faucet            01/01/70 00:00      
                           faucet            01/01/70 00:00      
                              Slow drip            01/01/70 00:00      
                                 I have no particular interest in this - but            01/01/70 00:00      
                                    Famous last words...            01/01/70 00:00      
                                       sure, I take your point - but            01/01/70 00:00      
                                 What libraries you use in VHDL            01/01/70 00:00      
                                    std_logic_arith vs numeric_std            01/01/70 00:00      
                              I found the FM!            01/01/70 00:00      
                                 Development System Reference Guide            01/01/70 00:00      
                           Another slow drip            01/01/70 00:00      
                              doubts            01/01/70 00:00      
                              I am not surprised it doesn\'t find that            01/01/70 00:00      
                              I was surprised            01/01/70 00:00      
                              If you want to see how the logic was synthesized            01/01/70 00:00      
                                 Don't cares worked for me            01/01/70 00:00      
                                    Not quite what I meant            01/01/70 00:00      
                                       Bummer            01/01/70 00:00      
                                          I wouldn't worry about minimizing            01/01/70 00:00      
                                             Thanks            01/01/70 00:00      
                              re: drip            01/01/70 00:00      
                                 re: re: drip            01/01/70 00:00      
                                    huh?            01/01/70 00:00      
                                       re: huh?            01/01/70 00:00      
                                          defaults?            01/01/70 00:00      
                                             re: defaults?            01/01/70 00:00      
                                             ***** Interesting result! ******            01/01/70 00:00      
                                          challenge            01/01/70 00:00      
                                             unknown is not don't care            01/01/70 00:00      
                                                A noob question            01/01/70 00:00      
                                                   similar noob question            01/01/70 00:00      
                                                      re: what happens            01/01/70 00:00      
                                                   You should get a latch            01/01/70 00:00      
                                                   re: a noob question            01/01/70 00:00      
                                                      Not really answered            01/01/70 00:00      
                                                         I'd guess...            01/01/70 00:00      
                           Simulator question            01/01/70 00:00      
                              what you are seeing            01/01/70 00:00      
                                 Thanks, Jez            01/01/70 00:00      
                                    check the logic!            01/01/70 00:00      
                                       That's good news            01/01/70 00:00      
                                          this might make the key difference            01/01/70 00:00      
                                             Two flavors of \"big\"            01/01/70 00:00      
                                                drop the comments :-)            01/01/70 00:00      
                                             as has been recommended ...            01/01/70 00:00      
                                          My confidence in XILINX' simulator is low            01/01/70 00:00      
                                             Xilinx vs. ModelSim            01/01/70 00:00      
                                                It's worth using ModelSim just for the features            01/01/70 00:00      
                                          behavioral is good,kind of            01/01/70 00:00      
                                             re: behavioral is good, kind of            01/01/70 00:00      
                                       Double post. Oops.            01/01/70 00:00      
                                 not so simple            01/01/70 00:00      
                              re: Simulator Question: ANSWER            01/01/70 00:00      
                                 re: ANSWER            01/01/70 00:00      
                                 re: ANSWER, Part II            01/01/70 00:00      
                        Long time            01/01/70 00:00      
      one more comment            01/01/70 00:00      
   OP Update 8 of ?            01/01/70 00:00      
      its supposed to make things easier to debug            01/01/70 00:00      
      one way vs the other way            01/01/70 00:00      
         re: Them two ways            01/01/70 00:00      
   OP Update 9 of ?            01/01/70 00:00      
   OP Update 10 of 10            01/01/70 00:00      

Back to Subject List