由组合逻辑开始学习FPGA编程
在掌握下载器的使用方法后,就可以利用Quartus II 13.1来编写和验证程序了。我是按照验证、修改、编写、应用的节奏来学习FPGA编程的。
所谓“验证”,就是利用光盘所配的例程来进行编程学习,并通过验证了解程序的功能和时序方式。我选的首个例程是LED灯测试程序。由于它的程序极为简单,故适于零起点起步。
由于该例程已带有sof文件,故直接下载即可得到图1所示的运行效果。
LED灯测试效果
所谓“修改”,就是我们通过极简单的功能,即可达到新的效果或功能,以LED灯的测试程序为例其核心就是根据赋值语句来控制LED灯的状态,仿此我们只需变更输出值即可改变LED灯的显示效果,如:
assign LED0 = 1'b1; //输出高电平,使LED灯熄灭
assign LED1 = 1'b0; //输出低电平,使LED灯点亮
assign LED2 = 1'b0;
assign LED3 = 1'b1;
assign LED4 = 1'b1;
assign LED5 = 1'b0;
assign LED6 = 1'b0;
assign LED7 = 1'b1;
然而在编译时才发现试用版的Quartus 是无法生成sof文件,必须进行破解才能解决。
再解决了sof文件生成之后,就可以自行走一轮程序的“编写”过程了,当然程序内容可以原样照搬例程的代码,目的不在别的就是完整掌握程序编写的流程。
有了前面的基础,才能够向“应用”迈进,当然应用有益有难,但即使功能再简单,若能按自己的设想来实现程序功能就是自己的应用成果。
从起点来讲,组合逻辑要比时序逻辑好一些,因此建议程序的编写从组合逻辑入手比较好,然后再接触时序逻辑的程序设计。
以按键的例程为基础,我们只需简单的修改就可以将它改造成一个逻辑功能模拟程序,其程序如下:
- //-----------------------------------------------------------------------------
- //-- 文件名 : A4_luojimoni.v
- //-- 作者 : jinglixixi
- //-- 描述 : 使用 LED0,LED1,LED2显示KEY0,KEY1,KEY2的输入状态,
- //-- 使用 LED4显示KEY0逻辑非
- //-- 使用 LED5显示KEY1,KEY2的逻辑与
- //-- 使用 LED6显示KEY1,KEY2的逻辑或
- //-- 使用 LED7显示KEY1,KEY2的逻辑异或
- //-----------------------------------------------------------------------------
- module A4_Key3
- (
- //输入端口
- KEY0,KEY1,KEY2,KEY3,KEY4,KEY5,KEY6,KEY7,
- //输出端口
- LED0,LED1,LED2,LED3,LED4,LED5,LED6,LED7
- );
- //---------------------------------------------------------------------------
- //-- 外部端口声明
- //---------------------------------------------------------------------------
- input KEY0,KEY1,KEY2,KEY3,KEY4,KEY5,KEY6,KEY7; //对应开发板上的KEY
- output LED0,LED1,LED2,LED3,LED4,LED5,LED6,LED7; //对应开发板上的LED
- //---------------------------------------------------------------------------
- //-- 逻辑功能实现
- //---------------------------------------------------------------------------
- assign LED0 = ~KEY0; //触摸按键1控制D1
- assign LED1 = ~KEY1; //触摸按键2控制D2
- assign LED2 = ~KEY2; //触摸按键3控制D3
- assign LED3 = 1'b1; //使LED灯熄灭
- assign LED4 = KEY0; //KEY0逻辑非
- assign LED5 =(~KEY1)&(~KEY2); //KEY1,KEY2的逻辑与
- assign LED6 = (~KEY1)|(~KEY2); //KEY1,KEY2的逻辑或
- assign LED7 = (~KEY1)^(~KEY2); //KEY1,KEY2的逻辑异或
- endmodule //模块的结束
开发板相关部分原理图
在此程序的基础上,若建立以下对应关系,则可模拟一个逻辑芯片的功能。
开发板与74C32的引脚对应关系:
KEY0 ---- 1A KEY1 ---- 1B LED0 ---- 1Y
KEY2 ---- 2A KEY3 ---- 2B LED2 ---- 2Y
KEY4 ---- 3A KEY5 ---- 3B LED4 ---- 3Y
KEY6 ---- 4A KEY7 ---- 4B LED6 ---- 4Y
实现逻辑芯片74LS32的程序如下:
assign LED0 =(~KEY0)|(~KEY1); //KEY0,KEY1的逻辑或
assign LED2 =(~KEY2)|(~KEY3); //KEY2,KEY3的逻辑或
assign LED4 = (~KEY4)|(~KEY5); //KEY4,KEY5的逻辑或
assign LED6 = (~KEY6)|(~KEY7); //KEY6,KEY7的逻辑或
仿此,我们实现四2输入与门74LS08、四2输入异或门74LS86等。
除了实现逻辑功能外,还可译码器和编码器等,下面就介绍一下译码器的实现方法,编码器类此。
开发板与74C32的引脚对应关系:
LED0 ---- Y0 LED1 ---- Y1
LED2 ---- Y2 LED3 ---- Y3
LED4 ---- Y4 LED5 ---- Y5
LED6 ---- Y6 LED7 ---- Y7
KEY0 ---- A0 KEY1 ---- A1
KEY2 ---- A2
74LS138逻辑表达式
实现译码器功能的程序如下::
assign LED0 = ~((~KEY0)&(~KEY1)&(~KEY2));
assign LED1 = ~(KEY0&(~KEY1)&(~KEY2));
assign LED2 = ~((~KEY0)&KEY1&(~KEY2));
assign LED3 = ~(KEY0&KEY1&(~KEY2));
assign LED4 = ~((~KEY0)&(~KEY1)&KEY2);
assign LED5 = ~(KEY0&(~KEY1)&KEY2);
assign LED6 = ~((~KEY0)&KEY1&KEY2);
assign LED7 = ~(KEY0&KEY1&KEY2);
后面将结合时序逻辑的程序设计来丰富逻辑芯片的模拟仿真功能,如采用数码管来显示逻辑芯片的名称,以按键来选取模拟的芯片功能及对应功能模块实现逻辑功能等。
略做了解