module ZephRay;

今朝有鱼今朝摸

Category

  • 硬件坑
  • 玩机
  • 翻译
  • 软件坑
  • 随记
  • 摄影

Tags

  • LCD
  • 点屏
  • 单片机
  • 计算器
  • 事
  • 摄影
  • STM32
  • 古董
  • 测评
  • 笔记本
  • 树莓派
  • 移植
  • 改造
  • FPGA
  • 小动物
  • nspire
  • Linux
  • ARM
  • Verilog
  • 景
  • EPD
  • LED
  • 晒机
  • HP
  • GameBoy
  • 3DS
  • SDL
  • IBM
  • 教程
  • Minecraft
  • ThinkPad
  • Kindle
  • 82ES
  • 花
  • Chiptune
  • Assembly
  • 手办
  • 仙剑奇侠传
  • Nikon
  • NDSL
  • 演讲

Recent replies

  • knight 发表于「Kindle Paperwhite 2 强行救砖(1)」
  • knight 发表于「Kindle Paperwhite 2 强行救砖(1)」
  • knight 发表于「Kindle Paperwhite 2 强行救砖(1)」
  • knight 发表于「Kindle Paperwhite 2 强行救砖(1)」
  • TPOB 发表于「Kindle Paperwhite 2 强行救砖(1)」
  • ZephRay 发表于「古董电脑选型」
  • 思北 发表于「古董电脑选型」
  • WOW 发表于「破烂采购列表」
  • RanDom 发表于「破烂采购列表」
  • Wenting Zhang 发表于「古董电脑选型」

My

RSS

坑/Projects
关于我
简历
破烂采购计划
古董电脑选型
SM83(GB CPU)指令编码

淘宝杂货铺
Bilibili空间
GitHub

Links

cnVintage古董电子论坛
cnCalc计算器论坛

Keshuai Xu
>Lithia's Core
ntzyz's space
初春 · 姫
丘丘塔台
tonoko.moe
kasora's blog
447f.Misaka
Hikari Calyx Tech.
春上冰月的博客
一只布丁的部落格
初音没有来
Test2g
Shell Bin
LEAFER x LAB
Genius.Home
Android技术站
标签:FPGA

[WIP] 日常点屏[25]: AML-B16C15012Q

2018 年 11 月 22 日分类:硬件坑#LCD#点屏#单片机#FPGA

这个屏幕是给VerilogBoy实体机使用的屏幕,MIPI DSI接口,因为以前从来没有点过MIPI的屏幕,这里记录下过程方便以后参考。

1543943583616-photo_2018-12-04_12-13-56.jpg

基本信息

  • 型号:AML-B16C15012Q
  • 类型:RGB IPS TFT-LCD
  • 模式:Normal Black
  • 分辨率:320x320
  • 灰度:接口支持8bpc,内部显存为6bpc,实际输出可能为6bpc
  • 控制器:ST7796S
  • 尺寸:1.54"
  • 接口:MIPI 1-lane
  • 背光:3并,VF=3.2V

接口定义

  1. LEDA
  2. LEDK
  3. VCC 2.8
  4. RESET
  5. NC
  6. NC
  7. NC
  8. VCCIO 1.8
  9. GND
  10. DATA0_P
  11. TE
  12. DATA0_N
  13. NC
  14. GND
  15. GND
  16. CLK_P
  17. NC
  18. CLK_N
  19. NC
  20. GND

笔记

  • 时钟线最大频率500MHz,最低频率80MHz
  • LP模式下DS要求每个状态保持时间为35-75ns,实测100ns也可行
  • 0x2C通过LPDT无法正确写入数据(短包长包都不行),0x3C可行(仅限长包)

初始化

	Delay_ms(120); 
	 
	GP_COMMAD_PA(2);
	SPI_WriteData(0x36); // Memory data access control  
	SPI_WriteData(0x48); // Reverse X, BGR
	 
	GP_COMMAD_PA(2);
	SPI_WriteData(0x3A); // Interface pixel format
	SPI_WriteData(0x77); // 16.7M Color (not defined in DS???)
	 
	GP_COMMAD_PA(2);
	SPI_WriteData(0xF0); // Command Set Control
	SPI_WriteData(0xC3); // Enable Command 2 Part I
	 
	GP_COMMAD_PA(2);
	SPI_WriteData(0xF0); // Command Set Control
	SPI_WriteData(0x96); // Enable Command 2 Part II
	 
	GP_COMMAD_PA(3);
	SPI_WriteData(0xB1); // Frame Rate Control
	SPI_WriteData(0xA0); // FRS = 10 DIVA = 0 RTNA = 32
	SPI_WriteData(0x10); // FR = 10^7 / ((168+RTNA+32x(15-FRS))(320+VFP+VBP))
	 
	GP_COMMAD_PA(2);
	SPI_WriteData(0xB4); // Display Inversion Control
	SPI_WriteData(0x00); // 00: Column INV, 01: 1-Dot INV, 10: 2-Dot INV   
	 
	GP_COMMAD_PA(5);
	SPI_WriteData(0xB5); // Blacking Porch Control
	SPI_WriteData(0x40); // VFP = 64
	SPI_WriteData(0x40); // VBP = 64
	SPI_WriteData(0x00); // Reserved
	SPI_WriteData(0x04); // HBP = 4

	GP_COMMAD_PA(4);
	SPI_WriteData(0xB6); // Display Function Control
	SPI_WriteData(0x8A); // Bypass RAM, DE mode
	SPI_WriteData(0x07); // Non inverting
	SPI_WriteData(0x27); // 8*(0x27+1) = 320 lines
	 
	GP_COMMAD_PA(2);
	SPI_WriteData(0xB9); // There is no B9 in datasheet
	SPI_WriteData(0x02); 
	 
	GP_COMMAD_PA(2);
	SPI_WriteData(0xC5); // VCOM Control
	SPI_WriteData(0x2E); // 1.450V
	 
	GP_COMMAD_PA(9);
	SPI_WriteData(0xE8); // Display Output
	SPI_WriteData(0x40); 
	SPI_WriteData(0x8A); 
	SPI_WriteData(0x00); 
	SPI_WriteData(0x00); 
	SPI_WriteData(0x29); 
	SPI_WriteData(0x19); 
	SPI_WriteData(0xA5); 
	SPI_WriteData(0x93); 
	 
	GP_COMMAD_PA(15);
	SPI_WriteData(0xe0); // Positive Gamma Control
	SPI_WriteData(0xf0); 
	SPI_WriteData(0x07); 
	SPI_WriteData(0x0e); 
	SPI_WriteData(0x0a); 
	SPI_WriteData(0x08); 
	SPI_WriteData(0x25); 
	SPI_WriteData(0x38); 
	SPI_WriteData(0x43); 
	SPI_WriteData(0x51); 
	SPI_WriteData(0x38); 
	SPI_WriteData(0x14); 
	SPI_WriteData(0x12); 
	SPI_WriteData(0x32); 
	SPI_WriteData(0x3f); 

	GP_COMMAD_PA(15);
	SPI_WriteData(0xe1); // Negative Gamma Control
	SPI_WriteData(0xf0); 
	SPI_WriteData(0x08); 
	SPI_WriteData(0x0d); 
	SPI_WriteData(0x09); 
	SPI_WriteData(0x09); 
	SPI_WriteData(0x26); 
	SPI_WriteData(0x39); 
	SPI_WriteData(0x45); 
	SPI_WriteData(0x52); 
	SPI_WriteData(0x07); 
	SPI_WriteData(0x13); 
	SPI_WriteData(0x16); 
	SPI_WriteData(0x32); 
	SPI_WriteData(0x3f); 
	 
	GP_COMMAD_PA(2);
	SPI_WriteData(0xF0); // Command Set Control
	SPI_WriteData(0x3C); // Disable Command 2 Part I
	 
	GP_COMMAD_PA(2);
	SPI_WriteData(0xF0); // Command Set Control
	SPI_WriteData(0x69); // Disable Command 2 Part II
	 
	GP_COMMAD_PA(1),   
	SPI_WriteData(0x11); // Sleep Out
	Delay_ms(120);
	 
	GP_COMMAD_PA(1),   
	SPI_WriteData(0x29); // Display ON 
	Delay_ms(50);
	 
	GP_COMMAD_PA(1);
	SPI_WriteData(0x21); // Display Inversion ON
	
	
	GP_COMMAD_PA(5);
	SPI_WriteData(0x2A); // Column Address Set
	SPI_WriteData(0x00);   
	SPI_WriteData(0x00); 
	SPI_WriteData(0x01); 
	SPI_WriteData(0x3F); 
	 
	GP_COMMAD_PA(5);
	SPI_WriteData(0x2B); // Row Address Set
	SPI_WriteData(0x00);   
	SPI_WriteData(0x00); 
	SPI_WriteData(0x01); 
	SPI_WriteData(0x3F);

写给玩家的FPGA入门指南(2)——组合逻辑

2018 年 10 月 8 日分类:硬件坑#FPGA#Verilog#教程

在进行了两期的背景介绍后,本期也是终于是进入正题了。如果你之前有了解过数字电路,大概就听说过数字电路大致可以分为组合逻辑电路和时序逻辑电路,而大部分的电路都是这两者的结合。本期所要介绍的也就是这其中的前者:组合逻辑。顺便,上期之后,大概部分玩家购买的74芯片或者FPGA开发板也已经到货了吧?本期也会附带关于如何用74或者FPGA实现这些实验的说明。   第一个例子还是从第一期举过的例子开始好了。想要设计一个电路,里面有两个开关和一个灯泡,希望实现两个开关任意一个打开的时候灯泡点亮。当然,一个显而易见的解决方案就是把两个开关并联,如下图所示:

1540159699475-1.png

但是如果我们用像一般考虑单片机电路一样的思路去考虑,那么就可以把两个开关看作是两个输入口,而灯泡是一个输出口,那么这个电路就会变成这样:

1540159701655-2.png

而这个盒子里面所包括的就是需要实现的电路。这个电路可以是一块74,也可以是一块单片机,或者只是像图1一样简单的连接起来而已。这里就来考虑下,如果要用单片机来实现要怎么做吧。很简单,一句if语句的事情,直接翻译要求,if ((a == 1)||(b == 1)) c = 1; else c = 0; 可以看见逻辑运算已经出现了,输入1为高或者输入2为高时,输出1为高,否则输出1为低,这样就是这个简单例子的逻辑。另外等于1 可以省略,就变成了if (a || b) c = 1; else c = 0;,再考虑到因为逻辑运算的结果本身就是1或者0,这里甚至不需要if,只需要 c = (a || b) 即可。 只有一个简单的“或”运算(||, OR)的关系,如果要用图示描述出来的话:

MORE

写给玩家的FPGA入门指南(1)——逻辑门,FPGA,开发板,游戏机

2018 年 9 月 10 日分类:硬件坑#FPGA#Verilog#教程

相信通过上一期的文章,大家已经对逻辑电路和单片机的区别有了一些了解,也看到了一些其它爱好者使用逻辑电路(FPGA)做的一些制作。今天要讲的则是一些更加实际的东西,关于相关芯片、开发板的购买,以及本系列实现教程的目标——游戏机——的过程概览。

74 or PLD?

也是按照之前的顺序,我们先讲74再讲CPLD/FPGA。74系列芯片虽然是很早以前就有的东西,功能也可以被可编程器件取代,但是它并没有被完全淘汰。74系列芯片仍然经常被应用在各种电路当中,也容易被买到。值得注意的是,74系列芯片也经常被称为TTL芯片,这是不准确的,74系列也有不少使用CMOS技术制造的芯片,且CMOS是最常使用的,而非TTL。另外提一点,虽然74系列芯片可以被认为是基础,但是完成本系列的教程并不一定需要购买使用74系列芯片,当然作为增加趣味是可以的。

74系列之所以被称为系列,是因为它里面有许多不同功能的芯片,组成了一个系列。基础的比如与或非门,稍微复杂一些的如触发器,再复杂一些如计数器、加法器,都有对应的芯片可以选择。玩过单片机的朋友可能比较熟悉595、245,这些也是74系列芯片的成员,这两者分别常用于扩展IO口和驱动总线。通常来说,74系列芯片使用14脚的DIP或SOP封装,实现一个制作通常也需要多片74芯片。因为根据不同制作和设计的不同,需要的芯片种类和个数也有可能非常不一样,这里可能很难做一个具体的推荐。但是为了完成一些基础的实验,通常来说会用到74HC04(非门)、74HC08(与门)、74HC32(或门)、74HC74(D触发器)和74HC47(LED译码器)。考虑到这些芯片的价格通常比较便宜(几毛钱到1块多人民币不等),可以在买元件的时候顺便带上几片。值得注意的是,由于74芯片确实可以实现和FPGA等价的逻辑功能(但是设计的时序问题可能就较难处理,通常只能实现较为低速的电路设计),为此有不少人热衷于使用74芯片来实现大型的电路,而不是FPGA。毕竟最初的目的只是为了好玩,用74来设计确实可以增加不少乐趣。以下是一个完全用74芯片制作的CPU——TD4: 感兴趣的朋友可以自己搜索来了解一下,也可以尝试把它做出来。

1540158703162-fac22940d9e151e423c33c001dbc899249d24e91.jpg@1320w_990h.jpg

(使用74系列芯片制作的CPU——TD4)

接下来,来讲讲CPLD和FPGA。74虽然能做逻辑电路,但是,设计起来费力,制作起来费力,调试起来也费力。可编程逻辑器件就相对友好的多。可编程逻辑器件,最常见的也就是CPLD和FPGA。

MORE

日常点屏[24]: SX21V001

2018 年 9 月 1 日分类:硬件坑#LCD#点屏#FPGA#Verilog

纵观之前的23期日常点屏加上4期非日常点屏,点过的屏幕类型已经涵盖了正负性STN、正负性FSTN、彩色TFT、Eink、彩色CRT、双色LED点阵和微型LED字符屏。不过显然也有更多其它的屏幕类型是没有涉猎过的,比如等离子、EL、PNLC等等。今天这次点的就是一种十分常见,但是之前却从来没有尝试过的屏幕类型:CSTN。

CSTN屏幕简单来说,无非就是单色STN加上彩色滤色片。那直接用之前单色屏的方案就好了咯?并不是那么简单。目前主流的处理器早已没有了对STN/CSTN接口的原生支持,想要直接接上LCDC玩不太现实,除非找一个古董MPU,比如2410一类的,确实是一个方案。我之前一直都是采用STM32 + bitbang来驱动STN液晶。这个方法对付STN还行,对付CSTN就麻烦了,最大的问题就是各方面速度都不够快。如果从USB输入图像数据,最高也就1-2fps的速度,就算是从SD卡,也就大约10fps的速度(无压缩)。而输出就更惨了,刷新率可能只有30Hz不到,别说抖动灰度,估计连稳定显示都做不到了。

所以解决方案也很直接,上FPGA。于是就有了这个项目了咯。VGA输入,DDR2缓冲,FRC抖动到32级灰度(32K色),最后输出到CSTN。

具体效果可以参考演示视频:https://www.bilibili.com/video/av30767980/

MORE

写给玩家的FPGA入门指南(0)——什么是FPGA

2018 年 7 月 24 日分类:硬件坑#FPGA#Verilog#教程

想必各位读者中有不少是玩过Arduino、单片机或者是做过一些模拟电路制作的吧? 在玩过这些东西之后,经常会有的一个疑问就是,下一步玩什么?一部分人选择更加复杂的东西,比如32位单片机(如STM32)或者研究嵌入式Linux(如以“树莓派”为代表的超小型计算机),而另一部分人则是选择尽可能利用已经会的东西,做出一些有意思的制作。如果是前者,那么相信,这个所谓的“更复杂的东西”的列表里,一定会有FPGA。这个系列的文章,就是希望帮助那些已经有一定电子制作的基础,想要了解或者学习FPGA,却无从下手的人,当然可能对于正在学校学习FPGA的学生也会有一定的启发作用。本文作为这个系列文章的第一篇,先对FPGA以及相关的内容做一个概述。

如果从来接触过FPGA,那么可能直觉上会认为FPGA是一种很厉害的单片机(MCU),毕竟它看起来也就是一个体积比较大的芯片,开发板看起来也就和单片机开发板一样,甚至开发板自带的教程也像单片机的教程一样,把开发板上面自带的外设全部玩一遍。然而,实际上根本不是这样,FPGA并不是单片机,而且这两者甚至很难具有可比性。通常而言,玩单片机是玩软件编程,而玩FPGA是玩硬件编程。要了解FPGA的含义和用途,还要先从它的功能开始。

FPGA有什么功能?

首先我们来考虑一个问题。现在有一个LED,有一个按键,要实现按下按键点亮LED,应该怎么做呢?答案很简单,把电源、LED和按键全部串联在一起就行了。按下按键,电路接通,LED就会点亮。要用单片机来实现这个效果,基本的思路就是使用一个死循环,不停读取按键输入,然后把结果输出到LED。听起来用单片机完全就是多此一举嘛。那么现在来修改一下需求,有两个按键,要实现现在正好两个按键都按下或者都松开的情况时候点亮LED。用单片机来做并不需要做太多的修改,只需要在循环当中加入一些判断语句即可。如果这种情况下,还需要不使用任何芯片来控制LED,就不是连几条线的事情了。那么是不是说明单片机非常适合做这类的事情呢?其实并不是。考虑一下,如果这只是单片机需要做的事情的一部分,假如单片机还需要进行其他的处理,比如需要控制数码管刷新,也需要不断循坏。当很多这种需要不断循环的东西放到一起时,程序就不那么容易实现了,而且受限于单片机的性能,各个任务的响应速度也会受到影响。

那么有没有除了单片机以外的,更加直接一些的方法,用来实现以上的简单任务呢?比如有没有什么东西,正好有两个输入和一个输出,当且仅当两个输入全部为高或者全部为低的时候,输出高电平呢?答案是肯定的。有一种芯片,叫做74LS86,正好可以实现这个功能。功能类似的芯片还有很多,这类芯片就叫做逻辑们芯片,或者我们常说的74系列芯片(74是主要的逻辑芯片系列,但是也有很多其它系列的逻辑芯片)。他们的内部通常并不复杂,只有数量较少的三极管或者场效应管而已。有了这种芯片,电路设计就十分容易了,把按键接上74LS86的输入,把LED接上74LS86的输出,就能得到需要的效果。当然,如果有更多事情要做,就得加入更多的芯片了,因为单片74芯片通常只能实现非常有限的功能。而且,可想而知,不可能针对每一种特定的应用都会有特定的芯片,这样成本也太高了。也正是这个原因,才会有单片机这类的可编程器件,可以随时修改其实现的功能以满足不同的需要。似乎绕了一圈又回到了原点,并没有解决之前提到的问题,反而是带来了更多的问题。也确实不奇怪,发明单片机的一个目的就是代替一部分用74芯片实现的电路。

MORE
  • «
  • 1
  • 2
  • »
Copyright © 2009-2019 Wenting Zhang. All rights reserved.
Unless otherwise noted, content on this blog is licensed under CC BY-SA 4.0.