网志

VGA输出为7片。真。

维克多·尤尔科夫斯基(Victor Yurkovsky)2012年9月25日2条评论

荒谬? 继续阅读-我会告诉你 如何在七个Xilinx中生成VGA时序R 斯巴达人3R片s.

前段时间我需要 将视频输出到我的Apple的VGA监视器] [FPGA克隆. 显然(我认为),VGA之前已经完成,而我要做的就是找到一些Verilog代码并将其放入我的设计中。 与我经常遇到的情况一样,事实证明该任务与我想象的“几个小时的IP集成”大不相同。

我为董事会找到了一些示例代码。 我设法使其正常工作,但它消耗了 我的XC3S1000的一大块! 你们大多数人会说“谁在乎-您仍有足够的空间 在FPGA上为您的愚蠢Apple] [!“ 但是你从我的上一篇文章中认识我, FPGA汇编器和时间机器,我真的想深入了解问题,并且已经建立了实现此目标的工具。 我开始仔细研究设计。 我开始搜索教程和解释以及其他项目。 利用率似乎总是很高。  生成VGA时序真的那么困难吗?

查看可用的现有技术显示出几乎相同的设计概念。 派生乐橙云app像素时钟。 设置乐橙云app大柜台。 将水平同步脉冲打开一定数量的时钟(比较器)。 在水平同步周围打开水平消隐(更多比较器)。 计算水平线(另乐橙云app计数器)。 以相同的方式进行垂直同步(一堆更多的比较器)。 全部加起来,你有 很多电路.

现在我真的很感兴趣. 我需要以下信号:

  • 水平消隐(可见线从紧随其后开始)
  • 水平同步脉冲
  • 垂直消隐(第一行紧随其后)
  • 垂直同步

查看VGA文档的乐橙云app版本(有很多变体),我发现以下水平行计时:

        XXXXX_      __XXXXXXXXXXXXXXX_
              |____|                  |____|

      bporch hsync fporch,XXX =像素

    component     uS   
   --------- | -----------
    hsync        4.00     
    bporch       1.79
    pixels      25.42
    fporch       0.79
               ======
                31.77

我的时钟频率为100MHz;使用它,我的计数将是400、179、2542、79-需要非常宽的计数器。 我可以通过创建较慢的像素时钟来缩小计数器的面积,但这就是每个人都这样做的方式 那里的乐趣在哪里?

在浴缸里思考了几天之后,我注意到了一些奇怪的事情。 如果我使用的时基   99  100MHz clocks, 我可以将柜台降到非常合理的宽度- 5 bits -并且仍然输出与VGA时序非常相似的内容。 为什么是99?稍后。  For now, observe:

               99-clk    My
    component  cycles   timing   VGA spec   
   --------- | -------- | -------- || ----------- |
    hsync         4      3.96       4.00     
    bporch        2      1.98       1.79
    pixels       25     24.75      25.42
    fporch        1      0.99       0.79
                ===     =====      =====
                 32     31.68      31.77

 -      __XXXXXXXXXXXXXXX_
  |____|                  |____|
 1  4   2     25         1         31.68us scanline

现在,我的水平线被分成32个单位(每个99个时钟),每条扫描线每31.68uS弹出一次,速度有点快,但足够近了(显示器几乎同步任何东西都非常惊人)。 5位计数器非常小,而5输入比较器也不错。 (而且我们必须生成某种99分频电路... 但是,让我们将其保留到以后)。 有什么办法可以改善吗?

SRL16进行救援

通常,您可以期望将2位放入每个片中。 乐橙云app32位移位寄存器将占用16个条带。 但是Xilinx设计师给了我们 令人难以置信的礼物 -能够将每个LUT配置为2到16位移位寄存器! 它们中的两个-单个切片-可以组合起来成为32位移位寄存器。 32位32个单位...是的,我们可以使用32位移位寄存器来生成水平同步和水平消隐脉冲,  各1片! 我们可以自己循环移位寄存器,并对其编程以产生脉冲。

对于4单元水平同步,我们要做的就是像这样配置SRL32:

   00111100000000000000000000000000

并消隐,如果您需要它:

   11111110000000000000000000000000

EURIKA-相移寄存器

现在,让我们回到99分频问题。 暴力解决方案需要乐橙云app7位可复位计数器和乐橙云app7位匹配电路来检测99并产生复位。 我们可以使用SRL创建乐橙云app99位长的移位寄存器,但是仍然要占用7个LUT。 不错,但我们可以做得更好。 回到浴缸。

我注意到切片中有两个独立的移位寄存器。 每个寄存器的长度可以在1到17之间(触发器可以连接到创建第17个元素的16位SRL16)。  还可以使用进位链以巧妙的方式将两个输出进行“与”运算. 现在,如果我们要向每个寄存器加载乐橙云app 单点 让他们滚动?

如果寄存器的大小相同,则显然不会发生任何有趣的事情-这两个寄存器将彼此镜像,并且如果脉冲重合,则ANDed输出将反映它们。 但是,如果我们将它们设置为不同的宽度怎么办? 让我们命名寄存器A和B的宽度。 如果A和B是互质的,则相移动作将产生乐橙云app 周期为A * B的脉冲发生器 和乐橙云app时钟的脉冲宽度。

想象两个齿轮相互连接。 齿轮A有4个齿,齿轮B有3个齿(是的,我知道,这就是为什么我们要发挥想象力)。 让我们在两个齿轮上标记它们接触的位置。 现在将齿轮A旋转一整圈。 单击四下齿,齿轮B向前一齿-无匹配。 另一场革命。 8次单击后,齿轮B标记现在向前2齿并接近另一侧。 另一声-12次点击,齿轮B转了一圈,达到了我们的标准。 宾果游戏-12次点击,4 * 3

您可能已经注意到 99是11 * 9.  We can make a 1片 电路,带有2个SRL16、11和9位宽,输出与进位链相连。 每99个周期,就会从我们的切片中产生乐橙云app脉冲。  Perfection.

现在您知道为什么我选择99。 例如,使用此方法不可能达到100-没有互质数相乘后得出100。

到目前为止的库存:

    Divide-by-99           1 slice
    Horizontal sync        1 slice
    Horizontal blanking    1 slice

进一步挤压Sync SRL

好吧,事实证明我们可以做得更好! 精明的读者会注意到,我们的SRL是32位长,或者是两个16位SRL组合在一起。 像我们一样,Xilinx设计师提供了每个SRL的第16个元素的非常方便的MC15输出,可以将它们与快速逻辑连接到下乐橙云appSRL,以将它们组合在一起。

我们不使用移位寄存器抽头。  Why not use them? 让我们以水平同步移位寄存器为例,在输出之前分接1个周期,而在使用另乐橙云appSRL16时,在输出后分接2个周期。 现在,我们有乐橙云app水龙头在同步之前打开,另乐橙云app水龙头在两个周期之后关闭。 (错误)使用进位逻辑,我们可以将这些逻辑或在一起(它们恰巧部分重叠)。  Now we have 单个切片同时输出水平同步和水平消隐.

到目前为止的库存:

    Divide-by-99              1 slice
   水平同步/空白  1 slice


垂直计时

用水平线表示垂直时序,时序如下所示:

         __XXXXXXXXXXXXXXX_
    |___|                  |____|
      2  32     480      14     


好吧,我们可以将其除以2 ...但仍然需要数位。  Can we do better? 让我们看一下时间:

    component  VGA spec
   --------- | ----------- ||
    bporch       1020
    pixels      15250 
    fporch        450
      ===       =====
                16784
   
    rate      59.58Hz

垂直同步脉冲必须为2条线,因此我们暂时省略一下。

看起来不好 但是我们不必很精确,因为监视器会占用一些时间。 那么我们可以使用32位移位器生成此时序吗? 是否存在神奇的单位,使得其中的32个组成了整个垂直时期? 多一点浴缸的想法会产生以下结果:

       .99 uS * 16 =    15.84 uS       //假设的时钟单元
    15 .84 uS * 33 =   522.72 uS       //乐橙云appSRL33可以切成薄片
   522.72我们* 32 = 16727.04美国       //真的接近16,784美元!!!


换句话说,如果我们采用.99uS时基,将其乘以16,然后将其与.99uS时基乘以33进行相位调整,则我们将获得522.72uS时基,这是垂直计时周期的1/32。 然后,我们可以使用它来生成垂直消隐,如下所示:


    Component  cycles    time       VGA spec
   --------- | -------- || ---------- | ----------- |
    bporch        2      1045.44       1020
    data         29     15158.88      15250 
    fporch        1       522.72        450
                 ===       =====       =====
                 32     16727.04      16784
   
    rate                 59.78Hz     59.58Hz

那真的很近。

这次,我们将需要 1 1/2片 -16位片为1 / 2,33位片为整个片(我们将使用触发器扩展32位移位寄存器)。 

现在,另乐橙云app逻辑片将实现具有3位长的VBLANK脉冲的SRL32。

我们将用完另乐橙云app限幅来产生2行延迟,以塑造从门廊之后开始抽头的VSYNC脉冲。

到目前为止的库存:

    Divide-by-99              1     slice
   水平同步/空白  1     slice
    Divide-by-528             1 1/2 slice
    Vertical blanking         1     slice
    垂直同步             1
                -----
                  5 1/2 slices


拿着它! 我不是说七片吗 我为什么不说5 1/2片? 我只是没想到你会相信我.


Xilinx和Spartan3是Xilinx Inc.的注册商标。

附言由于需求旺盛,我将介绍一些 fpgasmVerilog来源 在我的下一篇文章中。

版权所有2012 维克多·尤尔科夫斯基(Victor Yurkovsky)


[-]
评论者 迭戈R2015年1月10日
令人印象深刻,而且非常聪明!等不及要尝试了。
[-]
评论者 伤害22019年4月13日

非常好!

要发布对评论的回复,请单击每个评论所附的“回复”按钮。要发布新评论(而不是回复评论),请查看评论顶部的“写评论”标签。

注册后,您可以参加所有相关网站上的论坛,并获得所有pdf下载的访问权限。

注册

我同意 使用条款隐私政策.

试试我们偶尔但很受欢迎的时事通讯。非常容易退订。
或登录