龙少精简炮灰测试版8位机(原创、纯硬件、开源)
这个做来当炮灰测试的,只做了些CPU基本的功能,很简单的,主要是验证本人YY的CPU控制器架构的实际表现,结果还可以;
架构、电路原理、制作过程后面再边整理边发上来,现在先写了段小程序驱动SD、TF卡和小液晶来展示这个CPU的简单应用,程序是汇编(指令集)写的,对ROM手工2进制编程,现在没有做RAM/IO板,只是用了一片8KB 100ns的SRAM加电容(电容用来保持SRAM数据不丢失)当做ROM,这个简单的程序用ALU寄存器就够了,不用RAM

这个CPU可在3.3V工作,供电是7805稳压,接上了有压降,现在实测电压4V  电流在400~500mA之间跳动,
最高主频未知~~~

后面我再考虑下是否做个C编译器;

龙少CPU简单编程应用展示 屏分辩率128x160   RGB为16位色模式:
点击此处查看视频
http://www.tudou.com/programs/view/Y3x2o4d_snY/


下面是CPU现在周边的配置:

CPU时钟发生和复位板  正面:
CPU时钟发生和复位.JPG
CPU时钟发生和复位板  背面:
CPU时钟发生和复位(背面).JPG

ALU寄存器数据指示LED和拨码开关(拨码开关起初是用来调试指令的)  正面:
数据指示LED和拨码开关.JPG
ALU寄存器数据指示LED和拨码开关  背面:
数据指示LED和拨码开关(背面).JPG

SRAM加电容当ROM用(用3V的电池充电了电压会变低的,后面我改成电容了)  正面:
SRAM.JPG
SRAM加电容当ROM用  背面:
SRAM(背面).JPG

硬件SPI板 正面:
硬件SPI.JPG
硬件SPI板 背面:
硬件SPI(背面).JPG

CPU板正面:
CPU板.JPG
CPU板背面:
CPU板背面.JPG    左面.JPG
后面.JPG
右面.JPG
+30  科创币    yanli12321   2012-11-11   牛人啊,今天分都给你了
+24  科创币    delete   2012-11-11   高质量发帖
+50  科创币    hefanghua   2012-11-11   大赞。LZ高超的水平续写了8位机的传奇。期待后续详解。
+40  科创币    celeron533   2012-11-11   高质量发帖
+25  科创币    cccyl   2012-11-11   厉害啊
+50  科创币    小哈_abc   2012-11-11   楼主拨了多长时间才把这个程序烧上去的啊。。。
+15  科创币    daxus   2012-11-11   碉堡了。。。
+50  科创币    10班陈大葱22号   2012-11-11   给跪了...
+25  科创币    vile_hand   2012-11-11   高质量发帖
+50  科创币    量子隧道   2012-11-12   哇靠,牛B大发了
+100  科创币    山猫   2012-11-12   龙少威武
+200  科创币    虎哥   2012-11-12   太强大了,可以上报纸了。
+1  科创币    虎哥   2012-11-12   通知其他版主:本帖已于第50830号主题合并加学术分,请勿重复加分。
+1  科创币    hx   2012-11-12   高质量发帖
+25  科创币    wenrui   2012-11-12   厉害啊
+25  科创币    delete   2012-11-12   高质量发帖
+25  科创币    l2930   2012-11-12   这是要逆天了。。。。。
+200  科创币    ehco   2012-11-12   这也忒强大了
+24  科创币    wuncle   2012-11-12   膜拜
+50  科创币    孤独的酒精灯   2012-11-12   
+200  科创币    任某人   2012-11-12   我去!!!!这个不加没道理啊。。去吧STC干爆吧!!
+50  科创币    小特斯拉圈圈   2012-11-12   NB
+50  科创币    乖乖乖   2012-11-12   我今天就这么多了。。。
+100  科创币    jrcsh   2012-11-12   高质量发帖
+40  科创币    科学人   2012-11-12   
+10  科创币    罗布   2012-11-12   这个真心强大。。。。
+25  科创币    wjwj1234xx   2012-11-12   我了个去这个太威武了
+25  科创币    冲压发动机   2012-11-13   亲!你可以移民了.恭喜.
+25  科创币    hsldlee   2012-11-13   全力顶,就这点权限,笑纳
+25  科创币    TubeChip404   2012-11-13   加,不加没道理呀      ^_^
+50  科创币    逆天   2012-11-15   看到3DMARK立马跪了。。。。
+50  科创币    jxs   2012-11-15   啥时用全模拟元件做一个。。。
+25  科创币    luo   2012-11-16   
+30  科创币    kknd   2012-11-16   不会是实时3D吧。。。那可太强大了。。。
+50  科创币    极度深寒   2012-11-17   。。这焊工太彪悍了
+25  科创币    金星凌日   2012-11-22   
+30  科创币    带火星的木条   2012-11-23   顶礼膜拜.我只剩这么多分了今天
+25  科创币    wwt3100   2012-12-12   膜拜...
+25  科创币    xusixteen   2013-07-03   必须膜拜
+10  科创币    ldfa   2014-04-25   高质量发帖
来自:计算机科学 / 计算机电子学
 
1
2012-11-11 20:32:40
1楼
焊功牛X![s:219]
折叠评论
加载评论中,请稍候...
折叠评论
2012-11-11 20:48:40
2楼
这得焊多少天?看一下都眼花了。。。
+1  科创币    神之觉醒   2012-11-11   CPU板1000+个洞2天搞定   上下2000+个焊点  3天搞定
折叠评论
加载评论中,请稍候...
折叠评论
3楼
很好很强大,内核效率不低,赞一个
折叠评论
加载评论中,请稍候...
折叠评论
4楼
真心强大佩服佩服
折叠评论
加载评论中,请稍候...
折叠评论
5楼
哇塞,这么厉害,焊了多长时间啊。。。
折叠评论
加载评论中,请稍候...
折叠评论
6楼
楼主拨了多长时间才把这个程序烧上去的啊。。。
+1  科创币    神之觉醒   2012-11-12   开个玩笑,开始是用手拨,但后来我才没这么傻X的把成5K半的程序都用手拨,怎么烧的后面我再慢慢说
折叠评论
加载评论中,请稍候...
折叠评论
7楼
楼主大神... guibai.gif
话说TF卡文件系统也是用汇编写的吗?
+1  科创币    神之觉醒   2012-11-12   这个程序不用文件系统的,读完一个扇区再判断起始字节之后再读下一扇区顺序读下去,后面我再把程序发上来
折叠评论
加载评论中,请稍候...
折叠评论
8楼
没法加分。只能顶帖支持。
有想法,一切可以从零开始。
折叠评论
加载评论中,请稍候...
折叠评论
9楼
厉害,对楼主那段视频播放感兴趣,是一帧帧以16位图片形式存在SD卡里的吗?如果是的话是用什么方法取的模?
+1  科创币    神之觉醒   2012-11-12   用Image2Lcd把1918张图片一张一张转,我用鼠标键盘记录回放器来自动操作,几个小时就OK了的。
折叠评论
加载评论中,请稍候...
折叠评论
10楼
膜拜大神!
折叠评论
加载评论中,请稍候...
折叠评论
2012-11-12 01:09:50
11楼
我对您的佩服犹如滔滔江水连绵不绝,又犹如黄河泛滥一发不可收拾呀!!!!!!!!![s:275][s:275][s:274]
折叠评论
加载评论中,请稍候...
折叠评论
12楼
3Dmark 喜感.............
折叠评论
加载评论中,请稍候...
折叠评论
13楼
太强大了,可以上报纸了,完全找到了70年代国产计算机的感觉。

楼主能讲一下播放视频的解码、音效等是如何用这个CPU存储和完成的吗?

另外,建议这个东西叫“科芯一号”[s:178]
+1  科创币    神之觉醒   2012-11-12   声音是配上去的,视频转图片再转成2进制文件放进TF卡里面,话说这个不是很复杂 后面我再慢慢说
折叠评论
加载评论中,请稍候...
折叠评论
14楼
什么都不用说了。。。我石化了。
折叠评论
加载评论中,请稍候...
折叠评论
15楼
[s:261] 强大,技术贴不能沉啊!
折叠评论
加载评论中,请稍候...
折叠评论
16楼
太强大了!!!光布线就是多么艰巨的任务....
楼主简直是数电之神啊,上报纸后楼主就会被Intel AMD NVIDIA等公司争夺的....
于是楼主开了中国第一个CPU制造公司,把Intel啥的都打败了....从此科芯走向世界[s:274]
+1  科创币    神之觉醒   2012-11-13   布线是自动的  一分钟搞定 嘿嘿
折叠评论
加载评论中,请稍候...
折叠评论
17楼
好崇拜,,我用stm32刷屏也就这效果了,,声音是后来加的吧?
cpu主要是把数据从sd卡上搬到屏上是吗??
+1  科创币    神之觉醒   2012-11-12   恩  是这个原理
折叠评论
加载评论中,请稍候...
折叠评论
18楼
牛XXX!牛XXX!
折叠评论
加载评论中,请稍候...
折叠评论
19楼
非常强捍,LZ有没有算过有多少MIPS啊。。。
+1  科创币    神之觉醒   2012-11-12   8个时钟一条指令,现在27MHZ / 8 = 3.375MIPS
折叠评论
加载评论中,请稍候...
折叠评论
20楼
过于强悍。赶快测一下主频。
+1  科创币    神之觉醒   2012-11-12   手头最高晶振就27MHZ了  显卡上拆的
折叠评论
加载评论中,请稍候...
折叠评论
21楼
无敌了,硬件和软件玩的如此出神入化,我完全石化了,楼主是神仙!膜拜
折叠评论
加载评论中,请稍候...
折叠评论
22楼
楼主无敌。。膜拜了。
折叠评论
加载评论中,请稍候...
折叠评论
23楼
很好奇27M下如何得到这么高的TFT刷新率?
是软解的视频文件还是预先将视频解压成BMP图或JPG图存储在TF卡中?
+1  科创币    神之觉醒   2012-11-12   视频转图片转2进制文件放TF卡里 TFT的写时钟CPU直接控制  一条指令就产生一个写时钟
折叠评论
加载评论中,请稍候...
折叠评论
24楼
回 13楼(虎哥) 的帖子
制作者龙少,所以命名的话,龙芯一号也挺好,只不过重名了……
+1  科创币    神之觉醒   2012-11-12   怎么命名无所畏的  玩玩而已
折叠评论
加载评论中,请稍候...
折叠评论
25楼
最后那个视频有点面熟,是跑分的吗?楼主这个跑了多少分啊[s:274]
+1  科创币    神之觉醒   2012-11-12   是3DMARK06的录像
+1  科创币    专打贾君鹏   2013-02-10   明显是录像(#°Д°)这速度还没486快怎么跑3dmark06
折叠评论
加载评论中,请稍候...
折叠评论
26楼
为了降低些功耗,是不是可以用74HC系列?
+1  科创币    神之觉醒   2012-11-12   逻辑上是可以的 74HC如国扇出数在10~20之间就可以  实际效果有待测试
折叠评论
加载评论中,请稍候...
折叠评论
27楼
下一补~~~~·可以试试学习设计IP
折叠评论
加载评论中,请稍候...
折叠评论
28楼
神觉醒了。。牛逼
折叠评论
加载评论中,请稍候...
折叠评论
29楼
这个才是大神啊,全手工的,不像之前在其他地方看到都是买成品,然后组装在一起说是自己DIY的。 求学习求交流![s:271]
折叠评论
加载评论中,请稍候...
折叠评论
30楼
NB惨了,睡前特来膜拜一把。
折叠评论
加载评论中,请稍候...
折叠评论
31楼
家酿CPU 国外的DIYCPU的  www点homebrewcpu点com
也是从硬件到软件全程DIY 很有价值
折叠评论
加载评论中,请稍候...
折叠评论
32楼
太NB了,还能播放视频,而且还是用机器码编写的程序,逆天了
折叠评论
加载评论中,请稍候...
折叠评论
33楼
Image2Lcd 3.2版本可以批量转换图片成BIN格式。特别号:“6A3B
+1  科创币    神之觉醒   2012-11-12   害得我转了几个小时。。。=  =~!
折叠评论
加载评论中,请稍候...
折叠评论
34楼
我了个去这个太威武了
折叠评论
加载评论中,请稍候...
折叠评论
神之觉醒(作者)
35楼
这个炮灰CPU的架构改了好多次,都是往简单的方向改,为了降低DIY的难度,和降低成本,没有加入堆栈和中断功能,整个CPU只有50+片74LS,IC成本就几十块钱, 原来我是想用74F的,我用74F按照门的串联延迟估计频率在30~40MHZ之间,但是手头紧 只好用了74LS,当初按照IC的MAX延迟估计实际频率也就在20MHZ左右,但是实际做出来却有点出乎意料;  不管怎样只是做来试验玩玩的,没必要太认真[s:229]   和人家INTEL、AMD、STC等等跟本不能比,对于能有这样的效果,我是用最直接的办法来控制的,所有细节我会慢慢道来,是不是这样或你对我有怀疑 等我说完你做一个出来就懂了

8位炮灰测试CPU架构图:
8位炮灰测试CPU架构图.jpg

指令集、Protel 99 SE电路、PCB文件、Multisim 11.0仿真文件:

attachment icon 指令集、Protel 99 SE电路、PCB文件、Multisim 11.0仿真文件.rar 1.68MB RAR 238次下载

下面还有很多,我要思考下以怎样的顺序给大家作祥细的介绍,并且我尽量说的通俗易懂,好让每个人都能了解CPU的工作原理,有能力自己DIY
折叠评论
加载评论中,请稍候...
折叠评论
36楼
膜拜。。。
折叠评论
加载评论中,请稍候...
折叠评论
37楼
这个开源太给力了啊。。。不过把堆栈什么的设计进去应该会更厉害。。。
折叠评论
加载评论中,请稍候...
折叠评论
38楼
回 9楼(琪露诺) 的帖子
真是好方法,鼠标键盘记录器。。。。以前往stm32上放视频的时候算了笔帐,直接在img2lcd上取模一张图就算4S,2min钟的视频按采样率25帧/秒有3000帧,要重复这个动作三小时,最后只好丢了imglcd用matlab一点点写批量取模程序才搞定
折叠评论
加载评论中,请稍候...
折叠评论
39楼
转图片可以考虑在linux下,convert命令配合批处理应该对图片批量转换非常有效。
+1  科创币    神之觉醒   2012-11-13   
折叠评论
加载评论中,请稍候...
折叠评论
2012-11-13 00:01:27
神之觉醒(作者)
40楼
双面制板就打好定位洞两边爆光好就OK了

菲林:
菲林1.jpg

菲林2.jpg   

暴光:
暴光.jpg
显影:
显影完成.jpg

腐蚀:
腐蚀.jpg

腐蚀2.jpg

腐蚀3.jpg

腐蚀OK:
腐蚀OK1.jpg

腐蚀OK 正面_近.jpg

腐蚀OK 背面.jpg

打洞:
打洞.jpg

打洞1.jpg

打洞OK.jpg

脱膜:
脱膜.jpg

脱膜OK.jpg

脱膜OK1.jpg
折叠评论
加载评论中,请稍候...
折叠评论
神之觉醒(作者)
41楼
装上IC自我陶醉一下[s:269]:
装上IC自我陶醉一下.jpg

开焊:
开焊.jpg

开焊1.jpg

焊好:
焊好.jpg

焊好1.jpg

焊好2.jpg

焊好3.jpg

焊好4.jpg

焊好5.jpg

焊好6.jpg

焊好7.jpg

焊好8.jpg

完工:
完工.jpg

上电调试指令:
调试指令.jpg

调试指令1.jpg

调试指令3.jpg
折叠评论
1
加载评论中,请稍候...
折叠评论
42楼
楼主 手麻不?[s:274]
+1  科创币    神之觉醒   2012-11-13   边嗨歌边焊~
折叠评论
加载评论中,请稍候...
折叠评论
43楼
看的我头皮发麻顶楼主了
折叠评论
加载评论中,请稍候...
折叠评论
44楼
神啊!我很想知道你是做什么工作的?
+1  科创币    神之觉醒   2012-11-13   玩的
折叠评论
加载评论中,请稍候...
折叠评论
45楼
亲!你可以移民了.恭喜.
+1  科创币    神之觉醒   2012-11-13   你出钱。。
折叠评论
加载评论中,请稍候...
折叠评论
46楼
如果用74F的和更高频率的晶振有没有可能上百兆?
我记得我那几块386和456主板上的就是74F的集成电路,时钟是60MHz内存是8M*8=64M(原来学校的服务器。。。)
+1  科创币    神之觉醒   2012-11-13   上百兆的话PCB的布线要更加严格,想上百兆用74ABT74, 250MHz
折叠评论
加载评论中,请稍候...
折叠评论
47楼
已经不能用强大来形容了,膜拜lz
折叠评论
加载评论中,请稍候...
折叠评论
48楼
太强大了,把插座上的针一根根的拔下然后一根根焊上花了很长时间吧
+1  科创币    神之觉醒   2012-11-13   说真的不是很长  一天弄个7~8小时  3天搞定了
折叠评论
加载评论中,请稍候...
折叠评论
神之觉醒(作者)
49楼
下面是此CPU的使用说明;

CPU引脚:

电源插针。

CPU时钟输入和复位插针。

ROM读 和 RAM读、写 输出插针。

ROM 16位地址线输出 两排插针。

RAM 16位地址线输出 两排插针。

ROM 机器码指令数据输入插针。

RAM 数据输入输出插针。

位控制输出插针。(用来控制液晶 TF卡什么的~)

数据总线插针。

累加器和R1寄存器输出插针。

指令寄存器输出插针。

CPU电路在35楼。




炮灰CPU的寄存器(图在35楼):

1.数据寄存器,此CPU有两个数据寄存器,累加器和R1,分别由一片74LS273锁存器组成。

2.RAM地址寄存器,此CPU有两个RAM地址寄存器,为R2和R3,R2为高8位地址,R3为低8位地址,共同组成16位地址,可以寻址64KB的RAM,也是分别由一片74LS273锁存器组成。

3.程序计数器,此CPU的程序计数是16位的,可以寻址64KB的ROM,由4片74LS161二进制同步加法计数器组成。

4.状态标志,状态标志只有两位,分别为零标志位和进借位标志位,由一片74LS74组成。

5.IR,IR为CPU的指令寄存器,不可寻址的,由一片74LS273组成。








炮灰CPU的寻址方式、指令、和机器码:

这个CPU有三种寻址方式,立即数寻址,寄存器寻址,寄存器间接寻址。


后面都把累加器简称为A。


1.立即数寻址(立即数传送指令):

MOV A,7FH       //将16进制数7FH送累加器       第1字节机器码为00000000  第2字节机器码为7FH

MOV R1,7FH     ; //将16进制数7FH送R1寄存器     第1字节机器码为00000001  第2字节机器码为7FH

MOV R2,7FH     ; //将16进制数7FH送R2寄存器     第1字节机器码为00000010  第2字节机器码为7FH

MOV R3,7FH     ; //将16进制数7FH送R3寄存器     第1字节机器码为00000011  第2字节机器码为7FH

立即数传送指令为双字节指令,第一字节的高5位为操作码,低3位为寄存器地址,第二字节为立即数;其他指令都是单字节。







2.寄存器寻址(累加器传送指令和运算指令):

MOV A,A         //累加器的内容送累加器 (无聊操作- =~)   机器码为00011000

MOV R1,A       ; //累加器的内容送R1寄存器       机器码为00011001

MOV R2,A       ; //累加器的内容送R2寄存器       机器码为00011010

MOV R3,A       ; //累加器的内容送R3寄存器       机器码为00011011

MOV [R2,R3],A   //R2寄存器作为RAM高8位地址,R3寄存器作为RAM低8位地址,然后累加器的内容送RAM      机器码为00010000

ADD A,R1       ; //累加器和R1寄存器相加,结果送回累加器      机器码为00100000

INC A           //累加器加1     机器码为00101000

SUB A,R1       ; //累加器为被减数,R1为减数,相减,结果送回累加器    机器码为00110000

DEC A           //累加器减1     机器码为00111000

AND A,R1       ; //累加器和R1相与,结果送回累加器      机器码为01000000

OR A,R1         //累加器和R1相或,结果送回累加器      机器码为01001000

NOT A           //累加器取反     机器码为01010000                    

XOR A,R1       ; //累加器和R1寄存器相异或,结果送回累加器    机器码为01011000







3.寄存器间接寻址(RAM到寄存器传送指令 和 转移指令):

(1)RAM到寄存器传送指令:

MOV A,[R2,R3] ;  //R2寄存器作为RAM高8位地址,R3寄存器作为RAM低8位地址,然后RAM的内容送累加器    机器码为00001000

MOV R1,[R2,R3]; //和上面一样R2、R3内容作为RAM地址,然后RAM的内容送R1寄存器    机器码为00001001

MOV R2,[R2,R3]; //和上面一样R2、R3内容作为RAM地址,然后RAM的内容送R2寄存器    机器码为00001010

MOV R3,[R2,R3]; //和上面一样R2、R3内容作为RAM地址,然后RAM的内容送R3寄存器    机器码为00001011

(2)转移指令:

JMP [R2,R3]     ; //无条件转移到由R2、R3组成的16位地址     机器码为01100011

JNC [R2,R3]     ; //进借位标志位为0时,执行转移,转移到由R2、R3组成的16位地址    机器码为01100000

JNE [R2,R3]     ; //零标志位为0时,执行转移,转移到由R2、R3组成的16位地址    机器码为01100001

JA [R2,R3]       //零标志位或进借位标志位有一个1时,执行转移,转移到由R2、R3组成的16位地址    机器码为01100010



下面是特别的控制指令:

(1)状态标志控制指令

进借位标志位置1      机器码为01101000

进借位标志位置0      机器码为01110000

零标志位置1      机器码为01101001

零标志位置0      机器码为01110001

(2)CPU位控制输出 控制指令

位0控制输出置1      机器码为01101010

位0控制输出置0      机器码为01110010

位1控制输出置1      机器码为01101011

位1控制输出置0      机器码为01110011

位2控制输出置1      机器码为01101100

位2控制输出置0      机器码为01110100

位3控制输出置1      机器码为01101101

位3控制输出置0      机器码为01110101

位4控制输出置1      机器码为01101110

位4控制输出置0      机器码为01110110

位5控制输出置1      机器码为01101111

位5控制输出置0      机器码为01110111





运算指令对标志位的影响:

ADD加法指令,如果运算有进位,进借位标志置1,否则置0;如果运算结果为0,零标志置1,否则置0;

INC加1指令,如果运算有进位,进借位标志置1,否则置0;如果运算结果为0,零标志置1,否则置0;

SUB减法指令,如果运算有借位,进借位标志置1,否则置0;如果运算结果为0,零标志置1,否则置0;

DEC减1指令,如果运算有借位,进借位标志置1,否则置0;如果运算结果为0,零标志置1,否则置0;

AND与运算指令,不影响进借位标志;如果运算结果为0,零标志置1,否则置0;

OR或运算指令,不影响进借位标志;如果运算结果为0,零标志置1,否则置0;

NOT非运算指令,不影响标志;

XOR异或运算指令,不影响进借位标志;如果运算结果为0,零标志置1,否则置0;
折叠评论
加载评论中,请稍候...
折叠评论
50楼
[s:225] 下巴掉了!
折叠评论
加载评论中,请稍候...
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

神之觉醒
学者 机友 笔友
文章
67
回复
1117
学术分
4
2011/08/12注册,5 个月前活动
暂无简介
%7B%22isDisplay%22%3Atrue%7D

仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。

插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
处理中..
处理失败
插入表情
我的表情
共享表情
Emoji
上传
注意事项
最大尺寸100px,超过会被压缩。为保证效果,建议上传前自行处理。
建议上传自己DIY的表情,严禁上传侵权内容。
点击重试等待上传{{s.progress}}%处理中...已上传
空空如也~
草稿箱
加载中...
此处只插入正文,如果要使用草稿中的其余内容,请点击继续创作。
{{fromNow(d.toc)}}
{{getDraftInfo(d)}}
标题:{{d.t}}
内容:{{d.c}}
继续创作
删除插入插入
{{forum.displayName}}
{{forum.countThreads}}
篇文章,
{{forum.countPosts}}
条回复
{{forum.description || "暂无简介"}}
ID: {{user.uid}}
学术分隐藏
{{submitted?"":"投诉"}}
请选择违规类型:
{{reason.description}}
支持的图片格式:jpg, jpeg, png