On 6/21/06, Hamish <[EMAIL PROTECTED]> wrote:
On Wednesday 21 June 2006 18:20, Hamish wrote:
> On Wednesday 21 June 2006 02:15, you wrote:
> > > Part 1. The start of the line, always @(posedge bresLineStart) that
> > > calculates the delta's, whether it's steep, and the current point.
> > > Lastly it resets the output (bresLineEnded).
> >
> > It's good that you're doing this, because it reminds me to mention in
> > lesson 4 to never use something that isn't a clock net as a clock.  :)
> >
> > You'll want to do something like this:
> >
> > always @(posedge clock) begin
> >     if (drawing_line) begin
> >         ... next step in drawing line ...
> >         if (... last pixel ...) begin
> >             drawing_line <= 0;
> >         end
> >     end else if (start_line) begin
> >         ... grab input parameters into registers and start counter ...
> >         drawing_line <= 1;
> >     end
> > end

[deleted]

OK... Third try...

I have always @() on the Clock. Input of startline (signal) plus the line
endpoints... The output is to signal that the line drawing is done. (Or not
busy, depending on how you look at it).

There is a single always now. WIth a test for start of line or drawing.
Drawing state is set by the start of line. The stae diagram is thus



      Idle  <----------
        |             |
   (Start a line)     |
        |             |
   Start Line         |
        |             |
  -> Drawing ----(finished)
  |     |
  -------

Yes, that's the idea.


(Missing out the various signals sorry. Apologies for the crap ASCII art :)

//
// Draw a line using Bresenhams algorithm...
module bresLine(Clock, startBresLine, x0, x1, y0, y1, bresLineDone);
  input  Clock;
  input  startBresLine;
  input  [31:0]x0;
  input  [31:0]x1;
  input  [31:0]y0;
  input  [31:0]y1;
  output bresLineDone;

  reg    bresLineDone;

  reg    bresLineDrawing=0;

You really don't want to be doing initializations like this for synthesis.

What you need is a global reset, and you do it like this:

always @(posedge clock) begin
   if (reset) begin
       bresLineDone <= 1;
       bresLineDrawing <= 0;
       ... all regs you'll be assigning to ...
   end else begin
        .... logic ....
   end
end




  integer diffX=0;
  integer diffY=0;

  reg steep=0;

  reg [31:0] startX=0;
  reg [31:0] startY=0;
  reg [31:0] endX=0;
  reg [31:0] endY=0;

  integer deltaX;
  integer deltaY;
  integer error=0;

  integer yStep=0;

  integer pointX=0;
  integer pointY=0;

  function [31:0] abs;
    input [31:0] value;

    begin
      abs = value&'hefffffff;
    end
  endfunction

That won't give you abs.

First of all, although the synthesizer might be smart enough to figure
it out, [30:0] is likely to produce less logic than &'h7ffffff.

Secondly, what you have with this is the 2's compliment of the lower
31 bits, which is not the same as the absolute value.


  task renderPixel;
    input [31:0] pointX;
    input [31:0] pointY;

    begin
      $display("pixel   : (%x %x)", pointX, pointY);
    end
  endtask

  always @(posedge Clock) begin
    if(bresLineDrawing)
    begin
      $display("        : (%x %x)", pointX, pointY);
      if(steep)
      begin
        renderPixel(pointY, pointX);
      end
      else
      begin
        renderPixel(pointX, pointY);
      end

      error=error+deltaY;

      if((error<<1) >= deltaX)
      begin
        pointY=pointY+yStep;
        error=error-deltaX;
      end

//      if(pointX<endX)
//      begin

        pointX=pointX+1;

//      end

      assign bresLineDone=(pointX>=endX);

This is good code, although you can't use 'assign' in an always block.


    end
    else
    begin
      if(startBresLine)
      begin
//      assign bresLineDone=1;

bresLineDone <= 0;


        // Need the diff in x & y
        diffX = x1-x0;
        diffY = y1-y0;

        steep = abs(diffY)>abs(diffX);  // Line is steep (>45deg) if dY > dX

        $display("bresLine: steep %x (%x %x %x %x)", steep, x0, x1, y0, y1);

        // If it's a steep line, swap X & Y so we're drawing a shallow line
        if(steep==0)
        begin
          startX=y0;
          startY=x0;
          endX=y1;

Missing endY here??

        end
        else
        begin
          startX=x0;
          startY=y0;
          endX=x1;
          endY=y1;
        end

        deltaX=endX-startX;
        deltaY=abs(endY-startY);

        if(startY<endY)
        begin
          yStep=1;
        end else
        begin
          yStep=-1;
        end

        pointY=startY;
        pointX=startX;
      end
    end
  end

endmodule


You are ambitous to do this before lesson 4 (which I hope to do tomorrow).  :)

I haven't checked everything in perfect detail, but this is quite
excellent work here.
_______________________________________________
Open-graphics mailing list
[email protected]
http://lists.duskglow.com/mailman/listinfo/open-graphics
List service provided by Duskglow Consulting, LLC (www.duskglow.com)

Reply via email to