作者 主题:适用于8位计算机的FPGA VGA控制器 (Read 87017 times)

布莱恩·HG和6 来宾s are viewing this topic.

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2225: 2020年12月13日,上午05:18:03»
好吧,让'看一下您的代码需要做什么。

行生成器轮廓正常。也许我们应该重命名一些内容以便于理解。

码: [选择]
/*
 * ELLIPSE GENERATOR MODULE
 *
 * v 0.1.001
 *
 */

module ellipse_generator (
// inputs
  input logic                clk,              // 125 MHz pixel clock
  input logic                reset,            // asynchronous reset
  input logic                enable,           // logic enable
  input logic                run,              // HIGH to draw / run 的unit
  input logic          [1:0] 象限,         // specifies which 象限 of 的ellipse to draw
  input logic signed  [11:0] Xc,               // 12-bit X-coordinate 对于 center of ellipse
  input logic signed  [11:0] Yc,               // 12-bit Y-coordinate 对于 center of ellipse
  input logic signed  [11:0] A,               // 12-bit X-radius, 的width
  input logic signed  [11:0] B,               // 12-bit Y-radius, 的height
  input logic                ena_pause,         // set HIGH to pause line generator while it is drawing
// outputs
  output logic               busy,             // HIGH when ellipse_generator is running
  output logic signed [11:0] X_coord,          // 12-bit X-coordinate 对于 current pixel
  output logic signed [11:0] Y_coord,          // 12-bit Y-coordinate 对于 current pixel
  output logic               pixel_data_rdy,   // HIGH when coordinate outputs are valid
  output logic               ellipse_complete     // HIGH when ellipse is completed
 
);

下一页, some of 的internal logic:

码: [选择]
logic               draw_line     = 1'b0 ;
logic        [1:0]  象限_latch = 2'b0 ;  // This logic latches which 象限 to draw when run is issued
logic        [2:0]  geo_sub_func1 = 3'b0 ;  // This logic defines which step is running, IE first setup 对于 first 45 degrees,
                              // draw 的first 45 degrees if 的radius is not 0, finish 的ellipse if 的remaining radius is <=1,
                              // setup 对于 的second 45 degrees (inv), draw 的second 45 degrees if 的radius is not 0,
                              // finish 的ellipse if 的remaining radius is <=1, end 的busy and await 的next command.
logic signed [11:0] x                   ;  internal drawing x coordinate
logic signed [11:0] y                   ;  internal drawing x coordinate
logic signed [11:0] af                  ;
logic signed [11:0] ab                 ;
logic signed [23:0] a2                 ; // Note that 的4* fa2 & fb2 arent needed as they will just be a logic shift inside 的code
logic signed [23:0] b2                 ;
logic signed [23:0] 西格玛            ;

logic               pixel_data_rdy_int   ;     // HIGH when coordinate outputs are valid
logic               busy_int             ;     // HIGH when coordinate outputs are valid

Now 对于 的combinational logic:

码: [选择]
always_comb begin

   pixel_data_rdy = pixel_data_rdy_int && !ena_pause ; // immediately clear 的pixel_data_ready output when 的pause is high.
   busy           = busy_int || run ;                  // immediately make busy flag high when run is asserted
   
end

This stays 的same as these outputs are crucial to match & be compliant with 的line-generator's output.

Now, 对于 的next part:
码: [选择]
always_ff @( posedge clk  要么 posedge reset) begin

   if ( reset ) begin
   
      // reset geometry counters and flags
// *********  Fill this in ********* //
       
   end
   else if ( enable ) begin // draw_busy_int must be LOW 要么 的line generator won't run

      if ( run ) begin  // load values and begin drawing 的line

         // Initialise starting coordinates and direction 对于 immediate plotting
         quadrant_latch <= 象限   ; // latch which of 的4 象限s will be drawn

         if ((A==0) && (B==0)) begin // 0 X&Y radius, drawing only a single center point

         X_coord            <= Xc   ; // initialize starting X pixel location
         Y_coord            <= Yc   ; // initialize starting Y pixel location

            pixel_data_rdy_int <= 1'b1 ; // set pixel_data_rdy_int flag
            line_complete      <= 1'b1 ; // make sure line_complete is set.
            geo_sub_func1      <= 1'b0 ; // reset 的phase counter
            draw_line          <= 1'b0 ; // no line to draw
            busy_int           <= 1'b0 ; // 的line generator is busy_int  from 的next cycle

         end
         else begin //  Drawing a full ellipse

// *********  Work on this  ********* //

Use 的other code to begin.  First start initialize 的variables and begin only 的first 45 degrees.
Just output 的X&Y, do not bother with any 象限s yet.
Setup a simulation test bench in Quartus driving 的input and a clock.  No other modules.
驱动一些测试输入,然后我'll prepare 的Freebasic code to print out 的rendered coordinates of 的arc.


(Arrrrgggg, 的page count is over 9000 ......)
« 上次编辑:2020年12月13日,上午05:27:02 by 布莱恩·HG »
__________
布莱恩·HG。
 

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2226: 2020年12月13日,上午06:16:59»
Ok, here is 的freebasic geoarc.bas & exe.
The green and red text show 的two 45 degree phases of 的computed X&Y arc coordinates.
The cyan and magenta text which occasionally appears shows 的flat line remaining at 的end of an arc 要么 a flat arc.

Your verilog simulation test bench should spit out 的same numbers given 的same a&b radius.
__________
布莱恩·HG。
 
以下用户对此帖子表示感谢: Nockieboy

离线 Nockieboy

  • 超级贡献者
  • ***
  • 帖子:1218
  • 国家: b
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2227: 2020年12月13日,下午01:21:03»
有点困惑-我们've got no 'inv' input and what are 'af' and 'ab' 对于?  I guess they're 'a' and 'b' in 的FreeBasic ellipse function - but instead of setting them via 'inv', am I supposed to set them via 的current geo_sub_func1 value?  ???
 

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2228: 2020年12月13日,下午01:29:20»
有点困惑-我们've got no 'inv' input and what are 'af' and 'ab' 对于?  I guess they're 'a' and 'b' in 的FreeBasic ellipse function - but instead of setting them via 'inv', am I supposed to set them via 的current geo_sub_func1 value?  ???

geo_sub_func1只是一个逻辑寄存器,用于存储序列发生器正在运行的状态。

IE,当断言运行时,请进行设置并进行设置1。
什么时候's 1, do something else like run 的main first arc.
当圆弧完成时,如果需要完成绘制平线,则将其设置为2,否则将其设置为3。
什么时候's 2, finish 的flat line and make it 3.
什么时候's 3, 对于 now, stop/complete line and make 的module into it'空闲的非运行状态。

(Though, states 3 through 6 would generate 的'inv' portion of 的arc, but 对于 now, just worry about steps 1-3).

可以将其视为程序计数器。
A program counter where you need to tell it to increment only when you are ready to stop what you are currently doing and get onto 的next step, 要么 jump somewhere else.

You have already done this before in 的old line_generator and a number of other times using 的'case'命令,或者if()/ else if()序列。
« 上次编辑:2020年12月13日,9:59:15 pm by 布莱恩·HG »
__________
布莱恩·HG。
 

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2229: 2020年12月13日,下午01:40:25»
I'会在今晚晚些时候回来,所以,设置任何音序器&现在就算是模拟测试台't get 的formula exactly 对.
__________
布莱恩·HG。
 

离线 Nockieboy

  • 超级贡献者
  • ***
  • 帖子:1218
  • 国家: b
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2230: 2020年12月13日,下午03:06:50»
请参阅附件以了解测试平台的设置。  I've just used 的ellipse_generator.sv file, no frills 要么 extra modules, to test its output.

就ellipse_generator模块而言,它'尚未完成。  I'我添加了一些逻辑以更紧密地匹配FreeBasic函数-我认为这是需要的-但是当您最初指定输入时,在优化HDL例程方面您可能领先我一两步,所以我可能添加了一些东西竞技场't 对 / needed.

我有椭圆生成的基本框架,但是还没有完成椭圆的制作。 看来我还需要至少一个geo_sub_func1步骤才能完成最终'for...next'循环以完成这条线。  Not sure I'我走了正确的路,所以反馈表示赞赏。 明天将有更多时间来进行此工作,不幸的是今天很忙。
 

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2231: 2020年12月13日,晚上10:19:36»
Please reserve 的test bench/project names.

I believe we had 的Geo-Writer as a complete build of 的geometry system, actual commands in, written pixels to a memory module out.

Right now, all I wanted was 的ellipse module, naked all on it's own 对于 debugging.

只是它'输入的输入和查看的输出。 没有Z80几何图形命令系统。
Just like 的first line_generator'几个月前我们有一个测试台。
__________
布莱恩·HG。
 

离线 Nockieboy

  • 超级贡献者
  • ***
  • 帖子:1218
  • 国家: b
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2232: 2020年12月13日,晚上10:32:57»
Please reserve 的test bench/project names.

I believe we had 的Geo-Writer as a complete build of 的geometry system, actual commands in, written pixels to a memory module out.

Right now, all I wanted was 的ellipse module, naked all on it's own 对于 debugging.

只是它'输入的输入和查看的输出。 没有Z80几何图形命令系统。
Just like 的first line_generator'几个月前我们有一个测试台。

是的's what you've got.  Because I copied 的folder from 的geo_writer_v7 对于 的new project, it has 的same name.  But all it is in 的test bench is 的ellipse_generator.sv, no other fluff.

The ellipse_generator.sv file is in 的test bench project, but I'已根据要求在此处添加了它。
 

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2233: 2020年12月15日,上午02:19:42»
     Ok, here we go. 您犯了一些错误,例如必须乘以2, 左移2。   That's wrong.  A 左移1乘以2。  Though you did get 的multiply by 4 correct???

     OK, that being said, I redone 的'case'语句布局并删除了一些多余的内容。

     In 的TB, I changed all 的coordinates from hex to signed decimal 对于 ease of viewing.

     The current FMAX is 84 MHz, a far cry from 的required 125MHz 要么 preferred 150MHz.
我们还在吃24个9bit嵌入式乘法器。  It turns out this way because of all 的parallel non-matched multiplies used all over 的place.  Some we 钙n get rid of by using 2 clock cycles 2 perform 2 different multiplies, such as 的multiple '^2' 对于 的X & Y used in 的setup before 的arc begins to draw.

     In 的new Cyclone V, you using 7 DSP blocks out of 28.  Though 的rest of 的GPU only uses 2 more.  Also, it's sad that 的CV FMAX has dropped to 80MHz.  (This might be due to other factors which may disappear when 的logic becomes embedded deep within 的core of 的FPGA, like 的way 的IO pins are timed.)

     I've attached all 的updates.

     The 下一页step is to increase 的FMAX before we continue as all 的rest of 的logic just reloads 的current arc loop with flipped X&Y或,完成一条直线。  The final step is to add 要么 subtract 的ellipse center coordinates from 的rendered X&Y depending on 的requested 'quadrant'

     Step 1, looking at 的code, how do you think we will attack 的low FMAX and get it above 125MHz?

(For those reading, 的current code only generates 的first green part of 的ellipse shown in 的freebasic screenshot image)
« 上次编辑:2020年12月15日,上午03:14:06 by 布莱恩·HG »
__________
布莱恩·HG。
 

离线 硅向导

  • 超级贡献者
  • ***
  • 帖子:5886
  • 国家: fr
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2234: 2020年12月15日,上午02:21:20»
     Ok, here we go. 您犯了一些错误,例如必须乘以2,然后右移2。   That's wrong. 右移1乘以2 ...

您可能是想左移?
 
以下用户对此帖子表示感谢: 布莱恩·HG

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2235: 2020年12月15日,上午02:24:06»
     Ok, here we go. 您犯了一些错误,例如必须乘以2,然后右移2。   That's wrong. 右移1乘以2 ...

您可能是想左移?
我的阅读障碍轻度发作。 在编码时,我总是翻转内容,不仅是字母,而且还有符号和方向。  Thank god 的only thing I don't flip around is +&-为电子设备或二极管方向供电时。
« 上次编辑:2020年12月15日,上午02:34:51 by 布莱恩·HG »
__________
布莱恩·HG。
 

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2236: 2020年12月15日,上午06:39:30»
好吧,Nockieboy,我'附上了更新。  It seems to function identical to 的first code, but, it now compiles with an FMAX of 100MHz. 仔细检查我的数学。

我预见到问题。 我使用的技巧的一部分吃了更多的乘数。 另外,由于该死的While / If()循环将B ^ 2 * x与A ^ 2 * y进行了比较,而该循环原本已完成/裁剪为24位,所以我们可能需要以32位来完成。 如果椭圆的宽度是2047,即11位,然后将+乘以y,则得到33位结果。 如果我将While / If条件进行比较,将2x 33位数字而不是当前的24位数字进行比较,则我们的FMAX会降至84MHz。

我将需要查看其他整数Bresenham Ellipse函数,以了解是否可以想象出快捷方式而不必诉诸多阶段流水线版本。

I attached 的100MHz version.
__________
布莱恩·HG。
 

离线 Nockieboy

  • 超级贡献者
  • ***
  • 帖子:1218
  • 国家: b
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2237: 2020年12月15日,上午11:38:05»
     Ok, here we go. 您犯了一些错误,例如必须乘以2, 左移2。   That's wrong.  A 左移1乘以2。  Though you did get 的multiply by 4 correct???

啊,错别字。   I do understand that a bit-shift to 的left each position is equivalent of multiplying by 2, and to 的right is division by 2. 只是表明我不应该't program when I'm in a rush. ::)

     Step 1, looking at 的code, how do you think we will attack 的low FMAX and get it above 125MHz?

我缺乏对HDL的知识和技能,这意味着我'm a bit of a blunt instrument when it comes to this sort of thing, so my first (and only) tactic to increase 的FMax would be to break 的calculations down into more, smaller steps.

好吧,Nockieboy,我'附上了更新。  It seems to function identical to 的first code, but, it now compiles with an FMAX of 100MHz. 仔细检查我的数学。

It seems to be running-on 对于 an extra pixel at 的end with a 25x25 ellipse, 要么 I'm misreading 的results? ???  Take a look at 的simulation I'用25x25椭圆完成-模拟输出不't quite match 的FreeBasic one - it looks like 的ellipse generator needs to stop a pixel earlier?  But otherwise, it's producing 的right output.

但是,如果我使用27x27的椭圆进行模拟,那么看起来工作正常吗?  I must be getting confused with X/Y output in 的25x25 案件...?

我预见到问题。 我使用的技巧的一部分吃了更多的乘数。 另外,由于该死的While / If()循环将B ^ 2 * x与A ^ 2 * y进行了比较,而该循环原本已完成/裁剪为24位,所以我们可能需要以32位来完成。 如果椭圆的宽度是2047,即11位,然后将+乘以y,则得到33位结果。 如果我将While / If条件进行比较,将2x 33位数字而不是当前的24位数字进行比较,则我们的FMAX会降至84MHz。

这可能是我的近视眼,但是在什么条件下我们需要担心只能处理640x480或720p的2047像素的椭圆形? 如果我正在编写飞行模拟器,则可能需要绘制比屏幕大得多的椭圆弧,以表示高空的地平线,但是'd更重要的事情我'd必须担心可用的内存和数字处理能力,而不是地平线是平坦的还是弯曲的。

我将需要查看其他整数Bresenham Ellipse函数,以了解是否可以想象出快捷方式而不必诉诸多阶段流水线版本。

函数舞台设置部分的额外阶段'最大的担忧-在那里'这将限制Z80设置/请求绘制椭圆的速度,而我不会'认为在每个请求的设置中,额外的8ns时钟周期会破坏性能(甚至在某种程度上很明显),但是一旦函数开始敲定像素,我想'我们需要注意的地方。

Have added ellipse_generator.sv as well - same as 的version you've posted previously, but have updated 的version number to prevent mistakes and 对于matted 的code a little.
 

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 回复#2238: 2020年12月16日,上午7:37:30»

It seems to be running-on 对于 an extra pixel at 的end with a 25x25 ellipse, 要么 I'm misreading 的results? ???  Take a look at 的simulation I'用25x25椭圆完成-模拟输出不't quite match 的FreeBasic one - it looks like 的ellipse generator needs to stop a pixel earlier?  But otherwise, it's producing 的right output.

但是,如果我使用27x27的椭圆进行模拟,那么看起来工作正常吗?  I must be getting confused with X/Y output in 的25x25 案件...?


是的,您发现了一个错误。  There is a problem.  In 的original 'Program'代码,有一个操作顺序。  The 'While (b2*x <= a2*y)' is being computed & checked after Y may have been decremented by 1 (depending on 西格玛's符号),然后将X递增1。 但是,在Verilog中,问题是X&即使正在计算下一个输出像素,在其内的Y仍具有先前的结果。 我以为改变' <= ' to a ' < '解决了该问题,但是,显然并非在所有情况下都解决了该问题。

以便's 1 thing to fix.  Looking at 的code, 的massive condition where:

西格玛          <= 西格玛 + (b2 * (( x << 2 ) + 3'd6 )) + ((a2 << 2) * ( 24'd1 - y )) ;
要么
西格玛          <= 西格玛 + (b2 * (( x << 2 ) + 3'd6 )) ;

它有2个大型并行乘以3加  '' 24位+(24位* 14位)+(26位*(1-12位))  '', 要么 的second addition half depending on 的sign of 的'sigma'.

Pipelining this is possible, yet complex since that 而() also needs to take into account changes in 的X&Y并且它还有另外两个24位乘12位乘法,也可以并行完成。

Before continuing, I will look at some other ellipse functions to see it they remove some of 的cluster of math.   I suspect there is a shortcut 对于 simplifying 的2 multiplies in 的While() & perhaps 1 of 的multiplies in 的'sigma' adjustment.

高位计数本身可能需要2个时钟周期管道以及3路并行加法,这意味着流水线确实变得很麻烦,因为我们需要符号'sigma'在我们决定是否从Y中减去之前进行计算。 另一种方法是始终等待2 + 2个时钟周期,以使每个总和生效,而不是每秒1.25亿像素,该生成器每秒仅渲染3100万像素。 (不计算填充量,填充量仍为125mpps) 在此处运行固定的2个时钟周期ALU还可以使我们将数学运算合并为1个DSP元素,而不是使用7。
« 上次编辑:2020年12月16日,上午7:39:22 by 布莱恩·HG »
__________
布莱恩·HG。
 

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2239: 2020年12月16日,下午04:56:25»
经过一番尝试之后,我对目前的架构所能做的最好的事情是110MHz,并且将9位的alu元素减少了33%&逻辑元素减少了25%。 但是,即使有可能将该设计改进为125MHz,它也会创建代码,如果您需要更改一件小事情,它可能会成为将来的瓶颈。

在致力于多阶段流水线设计之前,是时候看看其他椭圆生成器了。
« 上次编辑:2020年12月16日,下午4:58:20 by 布莱恩·HG »
__________
布莱恩·HG。
 

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2240: 2020年12月16日,下午05:17:48»
好的,这是1个较旧的椭圆形框代码,在设置过程中只需对多个正方形进行1个12bitx12bit乘法即可完成,但是在绘制时,它仅使用加法和减法&the 'While' loop has no math at all, it just compares 的magnitude of 2 final 12 bit coordinates (x0 <= x1).  >150MHz shouldn't be a problem:

已经在这里编码:
//www.villagehousevacs.com/forum/fpga/fpga-vga-controller-for-8-bit-computer/msg3287072/#msg3287072

This code behaves much more like 的Bresenham's line-generator, except it has 2 error 钙lculations on 的x&y步而不是仅1。   Before we commit to this code, I will look through 的other ellipse source .pdf I posted awhile back to see it a 中心椭圆 already exists without any multiplication during 的rendering.
« 上次编辑:2020年12月16日,06:00:24 pm by 布莱恩·HG »
__________
布莱恩·HG。
 

离线 Nockieboy

  • 超级贡献者
  • ***
  • 帖子:1218
  • 国家: b
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2241: 2020年12月16日,晚上10:38:05»
好的,这是1个较旧的椭圆形框代码,在设置过程中只需对多个正方形进行1个12bitx12bit乘法即可完成,但是在绘制时,它仅使用加法和减法&the 'While' loop has no math at all, it just compares 的magnitude of 2 final 12 bit coordinates (x0 <= x1).  >150MHz shouldn't be a problem:

已经在这里编码:
//www.villagehousevacs.com/forum/fpga/fpga-vga-controller-for-8-bit-computer/msg3287072/#msg3287072

This code behaves much more like 的Bresenham's line-generator, except it has 2 error 钙lculations on 的x&y步而不是仅1。   Before we commit to this code, I will look through 的other ellipse source .pdf I posted awhile back to see it a 中心椭圆 already exists without any multiplication during 的rendering.

听起来很有希望。  I didn't realise adding 的ellipse generator would 钙use such problems, but it's interesting to see 的issues 钙used by 的additional of some simple (on 的face of it) arithmetic.

在其他新闻中,我've finished one of 的HDMI DAC 钙rds - well, apart from 的DIL header - I'm just hoping 的QFN soldering is good. 我想我可以随时将其删除,如果没有,请再试一次。

似乎我对焊接0402s的最大问题是试图不要减少过多的焊锡!
« 上次编辑:2020年12月16日,晚上10:40:03 »
 

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2242: 2020年12月16日,晚上11:53:47»
听起来很有希望。  I didn't realise adding 的ellipse generator would 钙use such problems, but it's interesting to see 的issues 钙used by 的additional of some simple (on 的face of it) arithmetic.
算术不是问题。  Waiting 对于 a result before deciding to add 要么 subtract 2 figures before each iteration means 的math needs to achieve 的FMAX in a single clock, 要么 if 的math takes 2 clocks, you pipe in 的numbers and wait 对于 的result to change and decide whether to run 的next iteration.

我们已经有2个时钟的32位乘加移位32位'pixel coordinates' to 'memory address' generator. 这里没有问题,因为输入没有't在两个时钟后依靠输出结果,因此,所有内容都以管道方式馈入。 因此,这部分代码可以在〜200MHz或100MHz下运行。 将管道延长一两个时钟将使FMAX达到核心'数据表中列出的理论最大频率。

下一个椭圆生成器将计算2或'sigma'通过加法或减法逐渐地等待它们彼此接近而不是再乘A&B by each 西格玛 each iteration while adding an offset &在测试弧线末端时。 但是,我必须首先在FreeBasic中测试椭圆象限1的角度,以确保它's 的edge I want. 另外,它需要简化为中心轴椭圆。
__________
布莱恩·HG。
 

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 回复#2243: 2020年12月16日,晚上11:55:23»
在其他新闻中,我've finished one of 的HDMI DAC 钙rds - well, apart from 的DIL header - I'm just hoping 的QFN soldering is good. 我想我可以随时将其删除,如果没有,请再试一次。

似乎我对焊接0402s的最大问题是试图不要减少过多的焊锡!
Looks like you need a little flux-off and a firm bristle brush to clean off 的residue and then you are ready to go.
Have you searched 对于 的DVI specification so you may design your first serializer?
我相信不应该'很难理解,当发生同步更改时,您可以在30位数据总线上插入正确的代码。 在发送vid_ena之前,先发送vid_ena 1像素,然后将视频数据偏移30比特。 vid_ena结束后1个像素,将视频发送为禁用状态。 (我认为这是在SDI编码器上完成的,但是,在DVI中,vid_ena可能会在高/低位上进行编码。) 至于像素时钟的最后10位,它应该有一个固定的#,例如10'b1111100000.

阿尔泰拉's serdes function should do 的job with 的right configuration.  Make a default 4 channel unit, 40 bits in, 4 channel out in Quartus Prime 对于 的CV and get 的example generated SystemVerilog code function 钙ll so you may enter it into your DVI serializer module.
« 上次编辑:2020年12月17日,12:06:21 am by 布莱恩·HG »
__________
布莱恩·HG。
 

离线 阿斯米

  • 超级贡献者
  • ***
  • 帖子:1587
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2244: 2020年12月17日,上午02:14:43»
DVI输出基本上像VGA一样工作,除了您的色彩通道信息和同步信号先进入HDMI编码器,然后进入串行器(每个通道一个,所有通道都相同)。一两个页面我张贴了一个指向HDMI 1.3a spec pdf下载页面的链接。

您将需要实现一个HDMI编码器,该编码器吸收8位色彩信息和控制信号(hsync / vsync,视频使能),并将它们转换为使用规范中描述的特定算法生成的10位代码,以及这10位字符将需要通过串行器通过电线发送。在消隐期间,蓝色通道(通道0)将发送同步信号代码,其他通道将为"nothing to see here".

对于"native" HDMI mode, all 的"magic"发生在消隐期间,因为'传输所有其他数据(音频,视频元数据等)时使用,但是对于DVI模式则不需要。
我的博客 - 万物电子
DIY Spartan-7 现场可编程门阵列初学者板: //www.villagehousevacs.com/forum/fpga/custom-spartan-7-board-for-beginners/
 

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2245: 2020年12月17日,上午03:27:50»
DVI输出基本上像VGA一样工作,除了您的色彩通道信息和同步信号先进入HDMI编码器,然后进入串行器(每个通道一个,所有通道都相同)。一两个页面我张贴了一个指向HDMI 1.3a spec pdf下载页面的链接。

您将需要实现一个HDMI编码器,该编码器吸收8位色彩信息和控制信号(hsync / vsync,视频使能),并将它们转换为使用规范中描述的特定算法生成的10位代码,以及这10位字符将需要通过串行器通过电线发送。在消隐期间,蓝色通道(通道0)将发送同步信号代码,其他通道将为"nothing to see here".

对于"native" HDMI mode, all 的"magic"发生在消隐期间,因为'传输所有其他数据(音频,视频元数据等)时使用,但是对于DVI模式则不需要。
首先让他开始使用DVI,因为它可以激活任何监视器,而且非常简单。
__________
布莱恩·HG。
 

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 回复#2246: 2020年12月17日,上午09:37:21»
好的,看看这些freebasic代码。

Geoarc is 的new code modified to generate a center ellipse.
Notice 的3 rendering errors.
A) offset errors as 的ellipse becomes flat.
B)垂直椭圆具有顶部像素误差。
C) 32 bit error when 的radius of 的are becomes too big.

Carefully notice 的rendering of 的original geoarc_complex.bas.  Look at 的precision coordinate positions of 的beginning and ending as 的ellipse as 的ellipse becomes flat.

更简单'box-ellipse'似乎只善于在框中绘制椭圆,因为渲染连接角错误不会't显示为所有4个象限都触摸,即使它们偏离+/- 1像素。 如果没有点精确的测量值,就无法在垂直轴和水平轴的四个角上看到单个像素对齐错误,如果它们干净地合并以生成看起来像完美的椭圆形。

I'我会尝试另一个设计'center-ellipse'该代码具有盒形椭圆的加法和减法简单性,但仍根据2x 45度点计算椭圆,从而生成精确的起点和终点。 请记住,当您想绘制圆角时,我们要使用椭圆的4个象限中的1个的边缘连接到用其他几何命令绘制的框和线。

« 上次编辑:2020年12月17日,上午10:08:08 by 布莱恩·HG »
__________
布莱恩·HG。
 

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 回复#2247: 2020年12月17日,上午09:44:49»
好吧,Nockieboy,这是另一个椭圆生成器:

//www.villagehousevacs.com/forum/fpga/fpga-vga-controller-for-8-bit-computer/msg3267096/#msg3267096

Now, I extrapolated 的.pdf code here (removed some stuff and simplified other stuff):
码: [选择]
void ellipseMidpoint (int xCenter, int yCenter, int Rx, int Ry)

{

int Rx2 = Rx * Rx;
int Ry2 = Ry * Ry;

int twoRx2 = 2 * Rx2;
int twoRy2 = 2 * Ry2;

int p;
int x = 0;
int y = Ry;
int px = 0;
int py = twoRx2 * y;

/* 1区 */

p = ( (Ry2 - (Rx2 * Ry) + (0.25 * Rx2)) ) + 0.5;

while (px < py) {

  x++;
  px += twoRy2;

    if (p < 0) {
               p += Ry2 + px;
               }
    else {
               y--;
               py -= twoRx2;
               p += Ry2 + px - py;
         }

  PlotPoints (xCenter+x, yCenter+y, 0,255,0);
  }

/* 2区 */

p = ( (Ry2 * (x+0.5) * (x+0.5) + Rx2 * (y-1) * (y-1) - Rx2 * Ry2) ) + 0.5 ;

while (y > 0) {

  y--;
  py -= twoRx2;

    if (p > 0) {
               p += Rx2 - py;
               }
    else {
               x++;
               px += twoRy2;
               p += Rx2 - py + px;
         }

  PlotPoints (xCenter+x, yCenter+y, 255,0,0);
  }
}

这应该呈现椭圆的1个象限,但是,我不喜欢作者如何操纵椭圆的象限'Region 2' which isn't a mirror match of 'Region 1' 请转换为基本代码&我对我们当前的感觉'Geoarc_complex.bas',我们最终将只使用'Region 1'两次翻转X&Y coordinates and X&Y radius. 如您所见,此代码在渲染或测试过程中没有复杂的迭代,以查看是否'Region'弧线已完成。 (这两个区域的差异可以用来完成椭圆形的线条,但我更喜欢在外部进行。)

给我发送工作中的Freebasic版本进行测试...
(区域1&2 are your old 'Inv' function - green / red lines of 的complex geoarc function...)
« 上次编辑:2020年12月17日,上午10:18:30 by 布莱恩·HG »
__________
布莱恩·HG。
 

离线 Nockieboy

  • 超级贡献者
  • ***
  • 帖子:1218
  • 国家: b
回复:用于8位计算机的FPGA VGA控制器
« 在以下回复#2248: 2020年12月17日,下午04:53:47»
好吧,Nockieboy,这是另一个椭圆生成器:

//www.villagehousevacs.com/forum/fpga/fpga-vga-controller-for-8-bit-computer/msg3267096/#msg3267096

Now, I extrapolated 的.pdf code here (removed some stuff and simplified other stuff):
码: [选择]
void ellipseMidpoint (int xCenter, int yCenter, int Rx, int Ry)

{

int Rx2 = Rx * Rx;
int Ry2 = Ry * Ry;

int twoRx2 = 2 * Rx2;
int twoRy2 = 2 * Ry2;

int p;
int x = 0;
int y = Ry;
int px = 0;
int py = twoRx2 * y;

/* 1区 */

p = ( (Ry2 - (Rx2 * Ry) + (0.25 * Rx2)) ) + 0.5;

while (px < py) {

  x++;
  px += twoRy2;

    if (p < 0) {
               p += Ry2 + px;
               }
    else {
               y--;
               py -= twoRx2;
               p += Ry2 + px - py;
         }

  PlotPoints (xCenter+x, yCenter+y, 0,255,0);
  }

/* 2区 */

p = ( (Ry2 * (x+0.5) * (x+0.5) + Rx2 * (y-1) * (y-1) - Rx2 * Ry2) ) + 0.5 ;

while (y > 0) {

  y--;
  py -= twoRx2;

    if (p > 0) {
               p += Rx2 - py;
               }
    else {
               x++;
               px += twoRy2;
               p += Rx2 - py + px;
         }

  PlotPoints (xCenter+x, yCenter+y, 255,0,0);
  }
}

这应该呈现椭圆的1个象限,但是,我不喜欢作者如何操纵椭圆的象限'Region 2' which isn't a mirror match of 'Region 1' 请转换为基本代码&我对我们当前的感觉'Geoarc_complex.bas',我们最终将只使用'Region 1'两次翻转X&Y coordinates and X&Y radius. 如您所见,此代码在渲染或测试过程中没有复杂的迭代,以查看是否'Region'弧线已完成。 (这两个区域的差异可以用来完成椭圆形的线条,但我更喜欢在外部进行。)

给我发送工作中的Freebasic版本进行测试...
(区域1&2 are your old 'Inv' function - green / red lines of 的complex geoarc function...)

工作的FreeBasic版本的附加代码。  I 钙n't split 的1区 and 2区 sections as 2区 is depending on some value set by processing 1区 - could be x,y, px, py 要么 something else - but I have a working example of 的above code.
 

线上 布莱恩·HG

  • 超级贡献者
  • ***
  • 帖子:4951
  • 国家: 钙
回复:用于8位计算机的FPGA VGA控制器
« 在以下方面回复#2249: 2020年12月17日,下午08:56:54»
Did you not take a look at my above attached code (2 posts up) with 的2 versions and 3 errors and work from there???
__________
布莱恩·HG。
 


分享我

掘客  脸书  SlashDot  美味的  Technorati  推特  谷歌  雅虎
中频