焊好后的成果图,咱这焊工,虽然说不是特别好,至少做到了圆润饱满,嘿嘿。我把排针都焊到了背面,主要原因是焊到正面的话,会影响我安装像RGB接口之类的,就算是按键也不是那么方便,而且本身从背面的角度来看的话,更容易找到对应的教。不过在焊接的时候要注意一些,千万别烫到上面的器件,不影响功能也会影响美观的。
-------------------环境搭建-------------------
拿到板以后,首先打开Sipeed的官网,选择开源社区-文档和资料,里面就可以找到 Tang Nano 9K了,打开后首先是简介,然后我们翻到第五大项,上手指引,首先按照指引中的内容,进行逐项操作。
但是,这里面因为芯片更新资料比较快,有一些需要注意的地方,我给大家说一下,大家需要注意一些。
第1步的下载,可以直接使用百度云网盘进行下载,一次性全部先下载下来,其中比较关键的是 Nano 9K的原理图和邮回来的LCD手册,这些都是在第2个目录Schematic和第6个目录Chip_Manual中。 注意啦,然后我就开始介绍我踩坑的过程呀,大家可以先看一看,一会儿再和大家继续聊我目前来讲可行的方法。
按照官方的第2步,安装IDE,这个指向另外一个连接,然后在新的链接里面的第一大项中就有高云官网下载连接。直接点击打开,是faq.aspx那个链接,别点错了。在打开的过程中,会看到推荐我们使用的是一个历史版本,本来开发的话,我们比较喜欢用最新的版本,对于学习和工作中还是要用推荐的或者是旧一些的版本,主要原因是老版本踩过雷了,遇到问题好解决,工作中更多的是问了稳定,学习中是担心如果版本不同,可能会造成某一步的卡壳,但是又不熟悉问题的所在,容易增加学习的难度。但是,在我下载了历史版本后,进行安装,我开始的想法是想要安装的是单机版,但是按照步骤申请下来license以后,发现老是提示我无效的license,因为我电脑是开发用的,里面肯定难免有多张虚拟网卡,所以我开始怀疑是因为网卡太多,但是license要和网卡绑定,所以造成的。于是,我又按照联网版的方法,直接连接到了Sipeed的验证服务器上,验证成功。然后我在下载好文件后,尝试着Synthesize的时候,惊奇的事情发生了,他告诉我Synthesize没有验证码,然后在我仔细研究了高云的这套验证后,发现真相可能是这样的,以下内容均为我的猜测:我的license申请下来的其实是第2代,只能在1.9.8.01以后的版本方可使用,而1.9.8.01以前的版本是识别不出来的,而且目前在高云申请license是只能申请到1.9.8.01以后的。可能现在sipeed联网验证版本的服务器也是1.9.8.01以后的,在1.9.8.01以前的版本中,高云使用的是其他厂家的Synthesize软件,但是经过去年的美国添加黑名单事件后,虽然解开了,但是高云现在的Synthesize软件重新进行自研发了,包括如果你安装的是老版本,你会发现同级目录下有一个Synthesize软件,但是新版本后这个软件消失了,以前看过一个笑话,说美国拉那个公司进入黑名单,那么就能说明这家公司的科技含量高,高云牛!
接下来讲我目前使用的办法,首先最好在安装以前就去申请单机版的license,不然会被卡住。我是晚上申请的,第二天中午给我发过来的,申请的时候需要用到网卡的MAC地址,这个我喜欢直接在运行里面输入cmd然后回车,输入ipconfig /all,就可以看到啦,就是物理地址那一栏!然后我是直接下载的最新版本,昨天我的最新版本还是1.9.8.03,今天版本已经更新到1.9.8.05了,我给大家一下1.9.8.03的链接是http://cdn.gowinsemi.com.cn/Gowin_V1.9.8.03_win.zip。安装完成以后就可以选择license验证了,不用设置那个环境变量了,上文说了,现在高云用的是自己家的Synthesize软件。 对了,这个软件可以设置成中文的。
然后,我们新建一个工程,在新建工程的时候大家可以参照这个TangNano9K的例程,具体到选择芯片时,咱们用的是GW1NR-9C 具体芯片是GW1NR-LV9QN88PC6/I5,注意啦,看中是9C。群里有兄弟写错了,最后在烧写时提示CODE不对,如果出现这种的问题后,不要怀疑了,就是选择芯片时就选错了,烧写时默认是根据工程来选择的。软件和芯片使用的是Verilog HDL语言,注意啦,这个语言和VHDL语言可是不一样的。官网推荐了三个网址和一本书。
比较推荐的是高云初级教程,优势是可以熟悉高云软件,但是他的板不是Nano 9K,个人感觉熟悉了以后基本上也没用了。 菜鸟教程里的那个,更加适合的是查询用,不是那么的系统。
https://www.asic-world.com/verilog/index.html,里面的内容挺好的,不过这个网址是英文的,英文可以的可以参考一下,英文一般的话就自己就考虑一下吧,不过里面有不少例子,可以在实践中提供想法。
大家也可以去B站上面去搜搜,别看事件太长的,浪费时间,不过也要注意,有的不是这个板也不是这个软件,可能到时候用起来比较麻烦。
当时,我在申请时,曾经打算专门写点Verilog的内容,然后再上手Nano 9K,但是我再逐步深入的过程中,发现并没有那么麻烦,所以,后面我会写好注释,只要大家看注释,那么入门就没问题,遇到问题去翻翻手册都能解决,实在不行就看菜鸟教程里的那个,还找不到这不还有群和度娘么。如果更喜欢系统一些,并且有足够的时间,那随意就好。
首先要写明白的是FPGA是什么?当然了,谁都可以百度出来是现场可编程门阵列。那他和MCU的区别又是啥?然后,就有人会告诉FPGA是用来制造MCU的。都是一些没用的废话。 我第一次接触FPGA是在大学的时候,做了一个期末的实验设计,设备也比较老,花了2周的时间,还写了一套指令,最后的的确确跑了起来,印象很深的是,就我带领的那个小组的完成度最高,但是时间也过去六七年了,这次再看到FPGA,我觉的是时候好好玩一玩了。而且,刚好再前段时间看到公众号介绍了小破站的一个视频,说一位“大佬”花了3年功夫,用三极管搭建了一个CPU,并写了程序,弄出来一个跑马灯,我不确定时间对不对,总之花了很长时间,下面有很多人在回复,国产CPU有希望了。有希望个P,有没有希望和这事一毛钱关系都没有好吧,首先国产CPU最大的限制是生态,而且现在设计CPU谁还用三极管设计,都是用咱们今天的主角FPGA设计的好不好。你要是用三极管做个实验,设计一下与门、或门、非门或者寄存器都可以,自己搞一搞了解一下计算机原理么?但是大哥你花了这么长时间,搞了一个8位的,我只能满脸问号了? 下面就可以详细聊聊FPGA了。
FPGA最简单来讲就是可以操作与或非门和寄存器,这些东西就像我上面说的完全可以由三极管去构成,但是也如我上面说的,可能搞出来一个玩意就得花费很长时间。CPU也好、MCU也罢,所有的芯片基本上都是由与或非门构成的,而FPGA的强大之处就是你用与或非门设计好芯片以后,可以烧录到FPGA上面进行验证或者量产。
简单一些的芯片,例如8进3出的芯片,完全可以在FPGA上面烧录,程序相当简单,当然由于成本问题没人会真的使用FPGA这么搞,直接就去买现成的了,但是对于8进3出的芯片厂家来讲,他一定会在设计好后,先在FPGA上面烧录验证完毕后,再去量产。
复杂一些的,比如MCU,例如STM32F103C8T6,厂家在设计好以后,就可以先在FPGA上面先进行烧写验证。然后,根据自己设计好的这个MCU(本质上面就是与非或门的组合),再设计自己的一套二进制语言指令集,例如,00001000就代表加法,后面跟上要操作的数或者地址,一个8位的CPU就创造出来了。然后,再建立个汇编语言规则,写个汇编语言的编译器,然后你就可以写汇编语言了,然后编译器会给你翻译成二级制语言。然后,你再写个C语言编译器,你就可以直接写C语言了,然后编译器层层转换到二进制语言里,然后你的二进制语言在进入了与非门后,就开始一步步运行起来了。 当然,有的芯片比8进3出复杂的很多,但是又不想MCU,还要再这个基础上面继续编写应用,芯片自己就有本身的功能,例如视频编解码芯片和串口芯片等等,就像这些当然也可以用FPGA来设计、来使用。
那FPGA是不是只有芯片厂家才会用得到呢?
那也不是,有很多的领域或者地方,有一些新的算法,往往就是现在还没有其他厂家做出来,市面上面没有你所需要的芯片,但是偏偏项目中非他不可,你又不可能真的拿那么多三极管去搞,这时候,FPGA就可以展现他的实力了。
-------------------实验一、点灯-------------------
接下来就是实验了,友情提示,就像我们北方,我又是皮肤比较干燥的人,特别容易有静电,烧写时先找个铁东西爽一爽,再去摸板。
点灯程序就像是,程序设计语言里面的Hello World似的,肯定跑不了。按照官方教程上面的搞,绝对没问题,出现问题找官方去。。。
接下来,我要按照我的方法来咯,新建工程-选择芯片,不多念叨了。
然后右击,new file,一个Verilog文件,一个物理约束文件,自己起名字。
首先是.v文件(Verilog文件):
- // 注释和C语言一样 双斜杠或者/* */都可以
- // moudle开始 后面那个是模块名 然后里面跟的是输入和输出,
- // 这些玩意是要跟管脚对应的,或者是跟其他模块的输入输出对应的
- module elefans_led (
- // 输入 这个是晶振传进来的clock 一会直接把它和晶振连起来
- input sys_clk,
- // 输入 这个是复位信号 不过这个复位信号和MCU的不同
- // 这个复位你可以自己去绑定 绑到哪个脚都没问题
- input sys_rst_n,
- /* 输出 后面跟的这个 reg[5:0] 代表的是 后面的led有6个
- reg[5:0] 其实就是从000000-111111二进制表示
- 一个管教要么高电平 要么低电平 */
- output reg [5:0] led // 6 LEDS pin
- );
- // 这个就是单纯的算一个变量吧 25位二进制的变量 小心超出去
- reg [24:0] counter;
- /* 这个地方开始写代码块 如果发生始终沿上沿 或者 复位键下沿
- 为啥复位键是下沿 因为板上面设计的按钮就是按下低电平
- 那么就执行这里面的玩意 */
- always @(posedge sys_clk or negedge sys_rst_n) begin
- // 如果是复位键 那就清空变量 重新开始计时
- if (!sys_rst_n)
- counter <= 25'd0;
- // 这个就是延时 官网是0.5秒 我扩大了一倍 1秒
- // 这个延时可以根据始终频率自己算
- else if (counter < 25'd26999998) // 0.5s delay
- counter <= counter + 1;
- // 超时了 继续变为0
- else
- counter <= 25'd0;
- end
- always @(posedge sys_clk or negedge sys_rst_n) begin
- /* 这里是操作LED 为1不亮 为0亮
- 如果按下复位键 就让他全灭 */
- if (!sys_rst_n)
- led <= 6'b111110;
- // 到达时间了 移动一位 这个地方应该可以看懂吧 就是 {} 号大家知道啥意思就行
- else if (counter == 25'd26999998) // 0.5s delay
- led[5:0] <= {led[4:0],led[5]};
- // 平时没事 啥也不干
- else
- led <= led;
- end
- endmodule
复制代码
点击Process里面的Synthesize进行综合,等到变成绿色对勾就OK了。如果是红色的就看一下,输出结果会有提示的。
晶振是在52脚。
按键3脚4脚任选一个。
LED是在10,11,13,14,15,16脚,注意12脚是1.8V电源脚。
然后点击FloorPlanner, 注意哦,我和官方不一样,你可以选择Package View,然后直接把左面的针脚拖到右面。拖完以后颜色就会不同,然后可以看看下面的针脚对应是否正确。
然后,我们接下来要要双击一下Place&Route,你会发现报错了,问题不大,点击Project-Configuration里面的Dual-Purpose Pin,勾上 Use Done就可以再次Place&Route了。
也是绿勾,然后就成功了,最后一步烧写,点击Program Device,然后连好设备,点击带播放键的那个,注意一下Opration里面要选SRAM Program那个,好处有二,第一个是SRAM寿命长你随意写,第二个不会覆盖芯片自己出厂的程序。
第一篇篇幅也差不多够了,第2和第3篇也更新完毕,点击即可到达!
第2篇 驱动LED屏幕
第3篇 驱动HDMI