一、前情提要
上一节内容介绍了ngc、edf文件导入LabVIEW,Labview IP集成节点导入与编写方法,以及LabVIEW图形化的优点,本节内容承前节,对按键控制LED网表文件进行编写和导入。
【LabVIEW FPGA图形化】 ngc、edf网表文件的编写:LED流水灯
二、FPGA蔡氏定律
FPGA有两条蔡氏定律:
1、FPGA不仅仅是FPGA。
2、FPGA的最终目的是做出可用的电路。
FPGA的学习脱离不了硬件电路,因此本节实验我们需要结合Spartan6的硬件电路进一步了解实验要求:
- 按下按键1实现LED灯依次右移一位的功能;
- 按下按键2实现LED灯依次左移一位的功能;
- 按下按键3实现LED灯亮灭闪烁的功能;
- 按下按键4实现LED灯全亮的功能
按键电路
结合按键的硬件电路,该独立按键在正常状态下,上拉电阻使得IO处于高电平,当按键按下时IO为低电平,即低电平按键有效,因此程序中1‘b0表示按键按下。
LED灯电路
LED灯均采用低电平有效,LED灯点亮,因此我们在配置【3:0】LED变量的时候,逻辑0表示有效,复位状态下拉高IO。
LabVIEW FPGA IP集成节点网表文件的编写
根据模块的功能,我们要提前想好我们需要设计模块的输入和输出,怎么样才能实现我们的功能,因此我们先要绘制出RTL视图:
RTL视图反映出硬件之间的连接关系,有了这个,我们可以很清楚的定义输入和输出变量,根据每个变量之间的关系写出对应模块:
module LED_key(
input clk,
input reset,
input [3:0] key,
output reg [3:0] led
);
reg [3:0] State;
reg [1:0] Status;
reg [31:0] cnt;
always @(posedge clk or negedge reset) begin
if(!reset)
State<=4'b0000;
else if(key==4'b1110)
State<=4'b0001;
else if(key==4'b1101)
State<=4'b0010;
else if(key==4'b1011)
State<=4'b0100;
else if(key==4'b0111)
State<=4'b1000;
else
State<=State;
end
always @(posedge clk or negedge reset) begin
if(!reset)
cnt<=1'b0;
else if(cnt==32'd10000000)
cnt<=1'b0;
else
cnt<=cnt+1'b1;
end
always @(posedge clk or negedge reset) begin
if(!reset)
Status<=2'b00;
else if(State==4'b0001&&cnt==32'd10000000)
Status<=Status+1'b1;
else if(State==4'b0010&&cnt==32'd10000000)
Status<=Status+1'b1;
else if(State==4'b0100)
Status<=Status+1'b1;
else
Status<=Status;
end
always @(posedge clk or negedge reset) begin
if(!reset)
led<=4'b1111;
else if(State==4'b0001&&Status==2'b00)
led<=4'b1110;
else if(State==4'b0001&&Status==2'b01)
led<=4'b1101;
else if(State==4'b0001&&Status==2'b10)
led<=4'b1011;
else if(State==4'b0001&&Status==2'b11)
led<=4'b0111;
else if(State==4'b0010&&Status==2'b00)
led<=4'b0111;
else if(State==4'b0010&&Status==2'b01)
led<=4'b1011;
else if(State==4'b0010&&Status==2'b10)
led<=4'b1101;
else if(State==4'b0010&&Status==2'b11)
led<=4'b1110;
else if(State==4'b0100&&Status==2'b00)
led<=4'b0000;
else if(State==4'b0100&&Status==2'b01)
led<=4'b1111;
else if(State==4'b0100&&Status==2'b10)
led<=4'b0000;
else if(State==4'b0100&&Status==2'b11)
led<=4'b1111;
else if(State==4'b1000)
led<=4'b0000;
else
led<=led;
end
endmodule
编写好LED_key.v文件后需要修改综合参数,在Xilinx Specific Options中去掉 Add I/O Buffer选项,不添加I/O buffer并综合。
四、FPGA图形化程序编写
将上一个程序生成的LED_key.ngc 添加到vi所在的工程目录下,调用IP节点,对其各个端口进行连线。
添加网表文件后,由于复位为低电平复位,因此需要在程序首次调用后或非门取反,为了更直观的在前面板上显示出LED灯状态,可以添加显示控件。当然,本程序直接将key映射到物理按键上,通过前面板也可以虚拟出一个输入控件按键,通过虚拟按键实现实验中的功能。
在没有按下按键时,按键的状态都是高电平,物理LED是熄灭的,虚拟LED是点亮的,按下第一个按键LED灯间隔200ms向右流水,按下第二个按键 LED向左流水,按下第三个按键LED亮灭闪烁,按下第四个按键 LED灯全亮。
总结
FPGA图形化编程其优势在于逻辑图形化,若不去考虑底层verliog,在顶层设计上FPGA的图形化编程是有优势的,可以更有效率的完成FPGA的设计,本节实验的Verliog网表文件和LabVIEW的vi均开源在 我的资源 如有需要可以下载学习。