昨天,邹老师布置了一个小小的实验,是根据实验箱的一个实验进行修改的,要求是实现一个三位十进制的计数器,计数满后要有溢出信号、、
可以说,这个要求是比较简单的,很容易实现。可是对于我们刚刚开始入门的新手,要解决的问题也不少。有压力,才有动力,如果每天都按照实验给出的例程去做,去演示实验,然后理解人家的程序,一点儿没有自己去写,去思考,那样学起来,相信收获也不会很大,正如我们以前学习单片机,C语言一样,开始应该多多看看人家代码的风格,结构,算法,可是,到一定程度,还是必须自己一个一个敲! 这样自己才能掌握得更好!
对于我们几个,基础都差不多,也应该说在FPGA 这方面没什么基础来说,自己去写代码,不考虑其他优化,仅仅实现一个小小功能,都不是很容易的!不过我还好,前面玩过一点儿开发板,但是学习的都是verilog ,VHDL 对我们来说都是不熟悉的,连基本的结构,语法和语句都只看了书上的第四章,不会用几个语句,这样去写,说实话,开始思考的时候,真的是有点儿不知道怎么下手的感觉啊!
后面,我大概看了一个类似的,是书上实现的一个一位十进制计数的代码,然后去理解它怎么实现的,这样经过,不断的修改和调试,终于基本仅仅在功能上完成了老师的要求,对于这个结果,我自己还算满意,毕竟过程中,我更加熟悉了,文本输入设计的一个完整流程,包括输入,编译,锁定引脚,仿真,下载,等等、、
现在,有必要更进一步把EDA的软件工具用得更熟悉,quartus 、modelsim、synplify等,然后把VHDL语言,通过继续学习每个实验代码,不断学习其语法结构,语言现象,
还需要深入学习数字逻辑基本设计技巧和思维,了解和使用FPGA芯片内部资源、、
暑假留校的日子里,这已经不是第一次了,我自己觉得自己蛮喜欢这样的时光,感觉很好! 这次暑假,生活得蛮好,还报了驾校,现在都快学场地了,其中感悟也很多,不过在这样的学习的气氛里,也不好又来乱写一些自己的想法,呵呵,再另一个地方总结吧!
最后,思考了一下,觉得自己的代码写得好烂,根本没脸贴出来,不过,我觉得,敢于出丑才会有进步!所以、、、大家见笑了啊!!
这个,仅仅是用了FPGA芯片实现了,小小的十进制计数的功能,然后通过IO口输出4位二进制的BCD码,通过实验室箱上的译码芯片,译码驱动数码管显示的十进制数!可以说,FPGA只做了计数的功能,按理说,用FPGA实现一个译码的逻辑是很容易的,不过,这里由于实验要求,也没能做得多么复习,真的见笑了、、
其实和邹老师讨论的过程中,发现就这么一个简单的实验还是可以从很多细节的地方节约硬件资源,比如这里用的是每位数码管一个4位的二进制计数,这样总共需要12根IO,但是如果,直接用一个10位的二进制计数,这样能节约两根IO,不过程序译码就麻烦点儿了、、
最后,对我的小小博客,敬上一个“垃圾”代码:
--三位十进制计数器 mige - 2012.07.23
LIBRARY IEEE; --使用IEEE的库
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; -- 库文件 程序包
ENTITY cnt10b3 IS
PORT ( CLK,RST,EN : IN STD_LOGIC; -- 使能 复位 时钟信号
CQ ,CQ1, CQ2 : OUT STD_LOGIC_VECTOR (3 DOWNTO 0); -- 分别对应 输出显示
的 三个数码管端口
COUT : OUT STD_LOGIC); --进位信号 对应LED显示 溢出显示
END cnt10b3 ;
ARCHITECTURE mige OF cnt10b3 IS
BEGIN
PROCESS (CLK, RST ,EN)
VARIABLE CQI : STD_LOGIC_VECTOR (3 DOWNTO 0 ); --变量 0
VARIABLE CQI1 : STD_LOGIC_VECTOR (3 DOWNTO 0 ); --变量 1
VARIABLE CQI2 : STD_LOGIC_VECTOR (3 DOWNTO 0 ); --变量 2
BEGIN
IF RST = '1' THEN CQI := (OTHERS => '0');
CQI1:= (OTHERS => '0');
CQI2:= (OTHERS => '0'); -- 复位信号
ELSIF CLK'EVENT AND CLK='1' THEN -- 时钟信号是否上升沿到来
IF EN = '1' THEN -- 如果使能信号允许 则计数
IF CQI < 9 THEN CQI := CQI + 1; -- 十进制计数
ELSE CQI := (OTHERS => '0' ); --清零
-- CQ <= CQI; --显示 第一位数码管
IF CQI1 < 9 THEN CQI1 := CQI1 + 1; -- 第一个数码管满9 进位到第二个数码管
ELSE CQI1 := (OTHERS => '0' ); --清零
-- CQ1 <= CQI1; --显示 第二位数码管
IF CQI2 < 9 THEN CQI2 := CQI2 + 1; -- 第二个数码管满9 进位到第三个数码管
ELSE CQI2 := (OTHERS => '0' ); --清零
-- CQ2 <= CQI2; --显示 第三位数码管
END IF;
END IF;
END IF;
END IF;
END IF;
IF CQI2 = 9 AND CQI1 = 9 AND CQI = 9 THEN COUT<='1'; -- 999 溢出 LED显示
ELSE COUT <= '0' ;
END IF ;
CQ <= CQI;
CQ1 <= CQI1;
CQ2 <= CQI2; --计数值向端口输出
END PROCESS ;
END mige;
用户1707737 2012-7-27 16:54
用户1567315 2012-7-26 16:46
用户1707737 2012-7-24 16:33
用户403664 2012-7-24 16:13