提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
不论是熟悉FPGA开发流程还是熟悉软件的使用,完成LED流水灯任务都是一个不错的任务。 严格来说,第一个任务更多的是知道怎么用,第二个项目才是熟练地使用这些软件和开发。 详细的pdf介绍链接在这里·链接:https://pan.baidu.com/s/1mRIBvzK4DLr1QkRrAZn0oA?pwd=6t65
提取码:6t65
一、硬件简要介绍
有必要介绍的是ax309的引脚:
4个led对应的FPGA管脚情况:
LED1----------PIN:P4
LED2---------PIN:N5
LED3---------PIN:P5
LED4----------PIN:M6
端口为“1”点亮LED,为“0”熄灭LED
二、软件使用流程及相关代码
1.led_test.v代码
/***************************************************************
* filename : led_test.v
*****************************************************************/
`timescale 1ns/1ps
module led_test(
clk, //开发板时钟
rst_n, //开发板复位
led //输出led,控制开发板上4个led
);
/****************************************************************
* port declarations
********************************************************************/
input clk;
input rst_n;
output [3:0]led;
//寄存器定义
reg [31:0] timer;
reg [3:0] led;
//计数循环
always@(posedge clk or negedge rst_n )
begin
if(~rst_n)
timer<=0;
else if(timer==32'd199_999_999)//开发板晶振是50mhz,4秒计数减去1个clk是199_999_999
timer<=0;
else
timer<=timer+1'b1;//计数器+1
end
/**********************************************************************************
* led ctrl
********************************************************************************/
always@(posedge clk or negedge rst_n )
begin
if(~rst_n)
led<=4'b1111;//led灯全高,4个都亮
else if(timer==32'd49_999_999)
led<=4'b1110;
else if(timer==32'd99_999_999)
led<=4'b1101;
else if(timer==32'd149_999_999)
led<=4'b1011;
else if(timer== 32'd199_999_999)
led<=4'b0111;
end
endmodule
2.vtf_led_test.v代码(tb)
代码如下
module vtf_led_test;
//input
reg clk;
reg rst_n;
//output
wire [3:0] led;
//例化单元
led_test uut(
.clk(clk),
.rst_n(rst_n),
.led(led)
);
initial
begin
clk=0;
rst_n=0;
#100;
rst_n=1;
#2000;
$stop;
end
always #10 clk = ~clk; //产生50mhz的时钟源
endmodule
3.UCF管脚约束
##
NET clk LOC = T8 | TNM_NET = sys_clk_pin | IOSTANDARD="LVCMOS33";
TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 50000 kHz;
##
##
NET rst_n LOC=L3 | IOSTANDARD = "LVCMOS33";##Reset Button
##
###########LED PIN define##########################
NET led<0> LOC = P4 | IOSTANDARD = "LVCMOS33"; ##LED1
NET led<1> LOC = N5 | IOSTANDARD = "LVCMOS33"; ##LED2
NET led<2> LOC = P5 | IOSTANDARD = "LVCMOS33"; ##LED3
NET led<3> LOC = M6 | IOSTANDARD = "LVCMOS33"; ##LED4
特别说明:
ucf文件我在编译的时候遇到了bug
显示如下
是相关的空格没有添加上。ucf的空格是不能省的,看一下相关行数的空格是否都加全了(“|”两边都是有空格的)
总结
简单总结一下,led流水灯这种项目只会在代码上出问题?
私以为pdf的教程是很详细的,跟着走就不会出问题。如果对verilog的掌握还不能够独立写完整个流水灯的代码,建议可以直接copy。看写好的代码也是一种学习方式?
吐槽一句markdown为什么是使人集中在内容上的文本编辑器——因为他的文本编辑真的不好用——简单,明显。
我想找个全局字体的代码找了半天。