请选择 进入手机版|继续访问电脑版
返回列表 发新帖回复

[教程] 极客DIY:如何制作一个显卡?

[复制链接] 【【【进入图片模式】】】
发表在  2017-5-3 15:54:58  | 显示全部楼层 | 阅读模式

0.jpg
写在前面的话(作者)
这里包括了我的Kicad软件包以及 Xilinx ISE工具(基于verilog)文件。2015年10月开始的这项工作,2016年完成雏形但后来发现噪音太大,于是在2016年2月13日重新设计并进行修改。2016年3月27日正式开始设计项目,当时可以从软盘里面加载一个Bgr565(16位)的图像,而显示的分辨率在1280x720p(75mhz (像素时脉))。
2016四月,我尝试逆向分析Picasso96软件程序。
如果想要更新Xilinx项目,可以访问:点击我

Mike Field提供的sdram控制器(Verilog) 以及DVI编码器(VHDL),
正文
在2015年的时候,我拿出来了旧的电脑Amiga 2000,过去我在它上面学习计算机知识、玩游戏,我还利用它来制作音乐文件(ProTracker)以及Deluxe Paint格式文件。当然这次重走老路也是有好奇的心理,Amiga计算机为高分辨率,快速的图形响应,多媒体任务,特别是游戏方面做了专门设计,处理器是摩托罗拉的680×0系列处理器。同时也是第一代具有真彩显示的计算机之一,机型(A3000, A4000…)。该型号计算机已经过去30多年了,我上网上搜索该类型的计算机时候,发现这些计算机都已经是收藏品了,A2000价格还可以,在90年代像“Picasso”显卡还是很容易搞到手的。现在就比较困难了,像我的计算机是 640×256 (PAL)分辨率,64位色,以及蛋疼的隔行扫瞄模式。
作者表示自己的工作与控制器以及树莓派有关系 (http://interim.mntmn.com/),在2015年十月的时候,作者决定开始为这个计算机做个显卡,当时第一个想法就是“我开始为自己做显卡了,这得有多难”。
这个项目是很不容易的,但很明显工作量比我预期的要好。值得注意的是,该计算机自带Amiga操作系统。我不得不学习如何利用PCB电路板将它们做出来,如何处理SMD以及之前的Verilog 部分,当然还要在FPGA上面写程序,还必须掌握 SDRAM以及DVI/HDMI接口相关知识,我还需要解决AmigaOS(3)系统中驱动问题(closed/undocumented Picasso96)。
作者表示Amiga是一台不错的计算机,在上面可以看到很多实用的设计。
我一次尝试用的是Papilio Pro 开发板(失败了),该开发板基于Spartan-6 FPGA以及SDRAM 。在它上面还有输入/输出接口,我想利用RAM来存储图像信息(帧缓冲区),整个过程可以被看成是循环过程,并以正确的处理速度来处理图片数据信息,我在做这个之前就是用Atmel 处理器-即利用现状通过CPU来完成VGA图像的显示和控制是不可能的。SDRAM(同步动态随机存储器)要比SRAM(静态随机存取存储器)更复杂一些,如果想要了解到动态随机存储器里面的数据,那么就需要不停的刷新,同时静态功耗比较大,而现代的随机存取存储器几乎是所有访问设备中写入和读取速度最快的,取存延迟也和其他涉及机械运作的存储设备相比,也显得微不足道。
1.jpg
来源:http://www.alliancememory.com/pdf/dram/256m-as4c16m16s.pdf
开源的FPGA实现sdram控制器项目(Mike Field)帮助我完成了RAM相关工作。
我将Arduino与Papilio连接,这样就可以发送地址数据以及利用这一点来控制像素以及帧数。而这些都是可以实现显示器上面绘制图像的基本思路,当然还与 SDRAM有关系。下一步会将 FPGA与显示部分设备连接到 Amiga 2000。
2.jpg
原来的 Amiga计算机手册帮组我更好的理解其硬件信息。它的处理器可以看做是摩托罗拉68000处理器的升级版,即68k。值得一提的是,标准MC68000具有32位内部寄存器,但只能在16位数据总线上传送数据。处理器能访问16兆内存。从CPU获得二进制数据,而显存直接连接到数模转换器,然后在通过其它过程最终将信息发送到显示设备。
我开始利用KiCad打开电路图进行设计,首先要了解设备上组件加一起有100多个引脚都是做什么的,我一开始就犯下一个小错误,我不清楚为什么要处理这么多信号来做什么,最后用到的引脚也并没有那么多
地址总线(a1-a23)
数据总线(D0的- D15中)
高/低字节数选通三态电平输出端 (UDS / LDS)
电源(5V, GND)
READ、/AS、 DOE( Amiga发送数据,当然如果想要有这个想法,可以利用这一点)
Autoconf (/CFGIN, /CFGOUT)
3.jpg
来源:http://courses.cs.tamu.edu/cpsc4 ... Timing_Diagrams.pdf
在这里我需要更新FPGA程序( Verilog),并重新定义其设备总线命令(RAM)。在FPGA另一边,我将利用ADV7125 数模转换器(DAC),生成的信号将会通过VGA端口完成 R、G 、B过程。


回复

使用道具 举报

发表于 2017-5-3 15:55:47  | 显示全部楼层
0.jpg
来源:http://www.analog.com/media/en/t ... -sheets/ADV7125.pdf
下一个问题:Spartan使用的是3.3V电压,而Amiga使用的是5V电压,所以需要转换电压即电平移位器,在FPGA和其设备之间。我将会利用TXS0108(8位)进行转换。
1.jpg
来源:http://www.ti.com/lit/ds/symlink/txs0108e.pdf
出现错误
我突然意识到Papilio,即FPGA开发板 I/O引脚无法处理其设备的信号,16+2引脚为 VGA DAC输出做准备。实际上,还有些引脚对这个项目没有用,我决定利用两个端口(16位)来处理总线通信,另外我不要同时处理数据以及地址数据。值得注意的是,在这里 FPGA的频率要比其设备频率高一些。通过获取一部分地址数据,即可获得完整的地址数据。
2.jpg
我在制作好几张电路图之后,开始利用 KiCad完成最终的项目,并将已设计好的文件上传至DirtyPCBs.com,等待了八周之后,发现没有回复信息,于是考虑是不是不支持其文件情况,于是开始解决,再次尝试,最后在2016年一月拿到了已经制作好的电路板。
3.jpg
顺便说一下,我在之前已经收到电路板上面一目了然,当然有一个简单的逻辑门电路出了点问题,我现在就利用电焊台(ERSA)吹焊我的芯片了。对于之前的错误,我确实犯了一个较大的错误在原来的电路板上面,OE 引脚与 GND连接出现了错误(3.3v),后来我对接线方式进行了修改(图中黄线部分),FPGA的引脚最高输出电平为3.3 V,但作者将载波部分弄错了,同时又曲解了多路复用器(两个或多个源(2的次方)到一单个信道)数据表、SEL引脚部分以及逻辑IC。更纠结的是74LS04芯片部分也没有测试明白。
4.jpg
在经历这些事情之后,作者开始做些什么来弥补这一切。作为调试该设备,需要一些工具,利用Verilog设计以及分析组合逻辑电路(该设备),以及记录640个时钟周期( FPGA),当然还需要注意嵌入式块RAM(BRAM)问题,并将它们看做是显示设备的基本支持条件。作者做了一个软件工具,大小是68k(汇编语言),专为Amiga计算机准备的-无限循环-地址$ e80000至 $dff180(背景颜色),作者利用软盘来运行程序,然后完成这个项目。请注意图片中DOE、READ、/UDS、 /AS模式以及 E7M(Amiga时钟频率7Mhz),画面显示延迟时间在6400ns或 6.4ms。下面那条线代表地址即A23-A1 ,A0 不存在,上下限( 68000)、/UDS 以及/LDS处于相反位置。
5.jpg
由于多路复用器和模拟开关的作用,所以看到地址信号才会这么有规律。你也许可以看到A9部分的问题,可能就是我的焊接问题(虚焊)。但至少可以反映出读写操作(6800),先不要注意A9 以及A17出现的问题,按照预期将会出现二进制地址111010000000000000000000(READ),后来也会出现地址0b110111111111000110000000(WRITE)。虽然出现了预期效果,但是噪音不断, Amiga几乎不识别我做的显卡,但是给我看到了一个希望。
后来我经历了很长时间来解决这个系统问题,但是我放弃了。于是回到之前的电路工作。
新改动
我的新策略是,找出电压转换问题,还有FPGA上面IO接口部分问题。当然我还需要一个焊台,以及练习吹焊技术。我在网上发现了Scarab Hardware的miniSpartan6+ FPGA,这个开发板的尺寸对我来说也很好,包括两个HDMI接口以及SD读卡器,甚至还有一个音频插口。但纠结的是这个开发板已经消失了,等到几个月后才搞到板子,即我将选择 Numato 实验室(Saturn)。
在新的电路图中,我没有添加更多的开关来控制信号,上面我利用了双向电平转换的3态输出的双位双电源转换收发器 (NXP 74LVC8T245),同时修正了 VGA电路。
6.jpg
7.jpg
8.jpg
我后来后买了Yihua 853D热风拆焊台,关于焊接技术可以参考此视频(自备梯子):点击我
当然你需要注意里面使用的温度,在里面使用了270度就解决了问题。
9.jpg
10.jpg
发表于 2017-5-3 15:56:31  | 显示全部楼层
我设计的新版本里面的信号处理就更方便了,我利用数字输出模式将FPGA连接到显示器,这样就可以利用Verilog “锁定”设备的时钟周期了。
0.jpg
我利用自己的汇编程序(68k)记录鼠标X、Y轴运行信息(寄存器)同时转换显卡上面像素点信息,这样我就得到一个画图工具了。
1.jpg
现在主要的问题是调整设备的状态,所以需要了解RAM以及显卡像素信息-显卡的一些问题-Amiga计算机显存读写状态。作者表示并没有完成所有的工作,但给出了目前的工作原理。显示器上显示的画面是一个个的像素点构成的,而这些像素点的所有数据都是由显卡提供的,最大分辨率就是表示显卡输出给显示器,并能在显示器上描绘像素点的数量。显存SDRAM可以与CPU同步工作,无等待周期,减少数据传输延迟,作者表示用到的SDRAM内存的频率是133MHz,即DDR内存的频率是266MHz。
当然还要有VGA或DVI接口,即DVI接口中有检测脚 检测不到的时候 就会发送信号给显卡 表示DVI或者HDMI已经断开,频率60~75 MHz(1280×720 )。同时也意味着显示和读取速度还不一样。显存起的作用就是将GPU处理好的数据暂存在显存中供系统调用(因此我们可以访问目标数据),现在就需要将处理地址问题了,这就可以被看成一个队列问题,而需要做的就是将数据保存进去。
为了测试系统的稳定性,这里就需要用到一个软件工具“mon”(http://aminet.net/package/dev/moni/mon165),我可以在软盘启动,当然你可以在图片中看到被用于测试的16位图像即一座山的照片(rgb565),该图片加载到显卡(地址 $600000),如图
2.jpg
我在本地计算机显示的信息发现了错误(如图),同时也证明我的设计不是很完美的。其( Host read)不能放入之前的队列,所以需要立即处理数据。这个过程可以被看成是中断,如果需要从内存不同地方进行读取,然后加载,SDRAM不会继续工作,当然这个过程会很耗费时间。但目前整个过程已经出现了问题,我计划去解决这些问题,同时利用XRDY信号通过模式填充以及开关功能来解决。
3.jpg
4.jpg
这里就需要 Amiga计算机上面监控显卡的软件Picasso96 (另外一个可以参考CyberGraphX),软件内置“emulation.library”即绘图以及修复功能,同时基于传统的位平面图像,并修正像素点。当Commodore还有 Amiga计算机公司逐渐退出市场之后,其软件也不更新了。我详细了解了一下软件手册,然后我需要制作一个 .card文件,这些都是需要在 Amiga计算机系统环境下执行的文件,从过去检测的文件到其软件UAE模块,我了解到自己需要建立函数库。
FindCard() -主要目的检测显卡是否工作,检测方式 returned -1 (d0)。
InitCard()-重要函数,可初始化显卡状态,主要与显卡像素、分辨率等信息有关。详细信息:点击我
CalculateBytesPerRow()-即每隔一行去一行像素
CalculateMemory()-地址映射(A1-另外一个地址(作者没有注明)),但作者利用该函数从A1返回到D0
SetColorArray() –主要为外部设备显示的多种(例如256)彩色的共享提供了保证,以及建立8位色彩查阅表(CLUT),但作者没有用到这个函数
ResolvePixelClock() – 主要是控制像素时钟信号,对于场消隐以及行消隐必须要返回才能进行下一次的扫描( Return 0)。
GetPixelClock() -返回像素时钟信号,这里仅仅返回一个固定的值(60000000)。
SetPanning()-清屏
SetSpriteColor()-Return 0
SetDisplay() -开启/关闭显示(Return 0)
WaitVerticalSync() – 和屏幕刷新频率保持同步(return 1)
未知函数(作者没有注明(return 1/0))
SetSwitch() –推测是计算机桌面以及Picasso96软件之间的切换
setdac()
setclock()
getcompatibleformats()
getvsyncstate()
setmemorymode()
setwritemask()
setreadplane()
setclearmask()
当然这里还有一些问题,例如显卡像素填充率等问题。但目前看来一切都还好。现在开始我的驱动程序,但我不得不修改Picasso96监控程序(BoardType),而实际上我的程序(VA2000.card )并没有停止工作。我自己的Picasso96模块可能有些小问题,问题主要是编辑启用/禁用屏幕模式上面。我参照了原版的“”Board”菜单选项,进行修正,令我惊讶的是,我可以使用 800×600 分辨率(HiColor 模式),然后我在上面打开一个图片来测试一下,结果出现了花屏的现象
5.jpg
6.jpg
作者利用Picasso96软件里面的鼠标指针模拟工具,在图中可以看到清晰的红色轨迹,即鼠标跳帧时我自己的显卡应该是没有工作的。
发表于 2017-5-3 15:57:19  | 显示全部楼层
0.jpg
在测试几个应用程序之后,我注意到屏幕显示仅有65535色,于是考虑到时Picasso96的问题,我用到了里面的一个“PC”模式(gggrrrrrbbbbbggg),于是就如图中所示
1.jpg
2.jpg
于是我开始在我的显卡驱动选项里面修改模式选项(RGB565)来解决这个问题,现在就可以在计算机里面使用800×600(High Color)看图片了
3.jpg
4.jpg
JPG图片效果
5.jpg
游戏展示
6.jpg
作者的建议
如果你对这个项目感兴趣或者想要做一个类似的显卡,作者给出了一些建议,显卡的噪音问题要及时处理,还有 XRDY信号问题,避免出现数据丢失现象。值得一提的是,分辨率以及像素填充的问题,如果时间还来得及最好做一个HDMI接口,或者显卡上面在做一个散热器。
了解更多
1.http://hamsterworks.co.nz/mediaw ... le_SDRAM_Controller
2.http://hamsterworks.co.nz/mediawiki/index.php/Dvid_test
3.http://amigadev.elowar.com/read/ ... guide/node0000.html
4.http://kicad-pcb.org
5.https://github.com/endofexclusive/greta

发表回复

您需要登录后才可以回帖 登录 | 立即注册 !sina_weibo_login!

本版积分规则

!paopaokaji_lang_fbxt! !paopaokaji_lang_kf!
!paopaokaji_lang_weixin!

微信公众号

微信二维码
最优秀的创意分享平台

!paopaokaji_lang_khd!

移动端

手机端二维码
扫码立即穿越至手机

!paopaokaji_lang_top!
快速回复 返回顶部 返回列表