【microchip PolarFire SoC FPGA 套件】③艰难啃下基于verilog语言的跑马灯
[复制链接]
https://bbs.eeworld.com.cn/thread-1307592-1-1.html
书接上回,上次跑了一个基于官方的范例,也就是个最简单的 与门 电路。
也就是这样的:按下按键1或按键2,LED1灯亮。基本学习了如何编写程序及如何烧录。
有了初步的入门,那么怎么进一步编写自己的程序呢,看到开发板上8个LED陷入沉思,何不写个跑马灯的程序呢。
多方查资料学习,于是就有了如下的程序。
其中OSC_RC2MHZ_0是 Libero自带的时钟程序块(Macro Libray中)。
需要说明,把选中到OSC_RC2MHZ_0选中到电路图中,需要把左端脚上拉(Tie High)
cc03_0是我自编的基于verilog语言的程序,也是本文的重点。
首先新建一个 Creat HDL,选择verilog。
要实现跑马灯就需要比较精准的时钟,我们使用了2MHz的时钟源,每1个周期是(1/2,000,000 S )要想实现1秒钟计时,就需要数数到2,000,000
LED的跑马灯效果就是通过移位来实现,RST是复位功能。
比如
00000001 向左移位1位
00000010 再向左移位1位
00000100 再向左移位1位
00001000 再向左移位1位
00010000 再向左移位1位
00100000 再向左移位1位
01000000 再向左移位1位
10000000 等到最高位是1时就恢复到最初状态
00000001
程序如下:
module cc03( clk,rst_n,led);
input clk;
input rst_n;
output reg [6:0] led;
reg [20:0] counter;
//计数器
always@(posedge clk)
if(!rst_n)//低电平复位
counter <= 0;
else if(counter == 21'd1999999) //1秒
counter <= 0;
else
counter <= counter + 1'b1;
always@(posedge clk)
if(!rst_n)
led <= 7'b0000001;
else if(counter == 21'd1999998)begin
if(led == 7'b1000000)
led <= 7'b0000001;
else
led <= led << 1;
end
else
led <= led;
endmodule
眼睑的你可能看到了,我这里LED【6:0】怎么只有7个LED,待会会提。
verilog程序编写完,点击Check HDL File。如果程序有错会提示:
程序检查无误就点击 Build Hierarchy。
将刚才编写好的cc03.v程序拖到电路图中。
置顶对应引脚(rst_n,LED 6:0)
Synthesize通过后,设置好对应引脚。
发现LED8对应的E1引脚无法选择,可能因为其是MSS(RISC-V核) I/O BANK的缘故,目前还没学会使用RISC-V核的IO,暂时就不用这个LED了。
最后编译下载程序就可以实现跑马灯效果了。
FPGA跑马灯
本次分享就到这里。
|