Day1:每次感觉自己接触新事物的时候特别慢热,这次学习FPGA也是同样,不过也没什么,不要急于求成嘛,从学习已经有一个多月了,感觉自己只是看了一些Verilog HDL的一些基本的语句,一些概念还是很模糊,今天看了同龄人学FPGA后的过程,有些想法,可能只有同龄人才能有些比较,有些打击吧,感觉别人学的时候方法还是很重要的,自己也意识到了这一点,学东西得学到自己肚子里才算真的学好。。问了达哥学FPGA该怎么学,建议我直接写程序,不要太长时间纠结于语法的学习,边写边学,也是很好的学习办法,致使我没有这样进行下去的原因是对软件的认识还是不够啊,对软件完全不怎么会用,所以接下来该好好学习一下软件的使用了,然后再加上自己之前对语法的理解,起步应该不是很困难了。要克服自己在编软件的时候的缺点了。认认真真把之前学的东西记下来才能印象深刻吧。这也算是个开始吧,每天坚持一些东西。
Day2:今天解决了一下之前自己抄写书上的流水灯实验,不得不说一个流水灯真的也存在很多问题,之前按照书上抄写的编译之后发现效果完全不对,结果也不知道问题出在哪里,今天仔细看了一下程序,发现对程序中的延时不是很理解,经过研究弄明白了。书上的晶振和我板子上的是不一样的。
晶振为50MHz,一个周期为1/50MHz,需要延时时间为X,需要的周期为m*1/50MHz=x,所以需要的周期数就是50MHz*X,单位为秒。
延时函数为:
parameter T100MS = 23'd5_000_000; //定义一个常量,就是上面算出的需要100MS所需要的周期数,其长度为222<5_000_000<223
reg [22:0]Count1; //定义一个寄存器,用来计数,长度为23
always @ ( posedge CLK or negedge RSTn )
if( !RSTn ) //复位键如果为0,置0
Count1 <= 23'd0;
else if( Count1 == T100MS ) //初始化,当计数计满时,重新置数
Count1 <= 23'd0;
else
Count1 <= Count1 + 1'b1; //若没计满,每次加一个周期
不知道为什么改过了时间后还是不好使然后使用例程是可以的,然后将例程复制粘贴到我的工程中还是那个现象。。。怎么回事?。。。有毒。。。
Day3:今天继续下一个例程的学习,昨天的问题解决了,不是程序的问题,是芯片引脚分配出了问题,由于导入的TCL文件中的引脚命名和我程序中写的是不一样导致的,还有一点需要设置,在FPGA中没用到的引脚需要设置为IO口,设置如下:assignments——》settings——》右上角的divices——》中间的devices and options——》Dual purpose pins都改成use as regular pin I/O.
在编第二个例程的时候出现了这样的问题,由于尝试着按照自己的记忆,写一些延时的块的时候出现了错误,导致在之后编译通过现象不对的情况,耽误了很长时间。关于流水的新的程序思路:reg [2:0] rLED_Out; //定义一个3位寄存器
always @ ( posedge CLK or negedge RSTn )
if ( !RSTn )
rLED_Out <= 3'b100; //初始化的设置
else if ( CountMS == 10'd100 )
begin
if( rLED_Out == 3'b000 ) //如果三位全为0的话,最低位置1
rLED_Out <= 3'b001;
else
rLED_Out <= { rLED_Out[1:0],1'b0};//低2位左移,最低位补0
End
在今后的练习中应该多细心些。