FPGA笔记

第一章 流水灯

目录

第一章 流水灯

Verilog HDL流水灯代码

程序综合与仿真

引脚分配与程序烧录


新建工程

套用正点原子FPGA教学视频工程文件模板

 

 

新建一个文件夹,起名test_led,用于本次流水灯实验。

 

打开quartus ii,新建一个工程,路径为刚刚新建的文件夹下的par文件,工程名为test_led。

注意:文件路径不要出现中文!!!

 

找到FPGA开发板的芯片系列和型号。

 

下一步,选取Verilog HDL语言。

 

完成。

新建一个Verilog HDL file。

 

 

好,工程新建完成。

Verilog HDL流水灯代码

任务:实现流水灯,流水灯速度为1s

流程图:

 

代码:

module test_led
(
    input           clk,           // 时钟
    input           rst_n,         // 复位
    output reg [3:0] led            // led
);
 

reg [27:0]      timer;  //28位计数器
parameter time_count = 28'd199_999_999;  //50M时钟,计满时间为(1/50M)*(time_count+1) = 4s,实际值28'd199_999_999,仿真把值改成28'd19
 
// 计数器,计满为4s
always@(posedge clk or negedge rst_n)
begin
    if (rst_n == 1'b0)
        timer <= 28'd0;                     
    else if (timer == time_count)      
        timer <= 28'd0;                     
    else
        timer <= timer + 28'd1;             
end
 
//流水灯
always@(posedge clk or negedge rst_n)
begin
    if (!rst_n)
        led <= 4'b1111;  //灯全灭                     
    else if (timer == 28'd49_999_999)       //计数在第一秒,实际值28'd49_999_999,仿真把值改成28'd4
        led <= 4'b1110;  //亮第一盏led
    else if (timer == 28'd99_999_999)       //计数在第二秒,实际值28'd99_999_999,仿真把值改成28'd9
        led <= 4'b1101;  //亮第二盏led
	 else if (timer == 28'd149_999_999)       //计数在第三秒,实际值28'd149_999_999,仿真把值改成28'd14
        led <= 4'b1011;  //亮第三盏led
	 else if (timer == 28'd199_999_999)       //计数在第四秒,实际值28'd199_999_999,仿真把值改成28'd19
        led <= 4'b0111;  //亮第四盏led
end
endmodule

代码讲解

配置输入、输出引脚

 

输出为4个led灯,所以定义为四位的寄存器类型。

定义计数器、参数类型变量

定义一个28位计数器用于计数。

这里说明一下为什么要定义28位的计数器,因为FPGA输入的时钟频率为50Mhz(外部晶振起振),有4盏led灯,需要计数4s,每隔一秒改变一次led的寄存器状态,以一次时钟周期计数一次,计满4s总共需要4s/20ns = 200000000次。

用计算机算一下,最后得出二进制数至少需要28位(可以多但是不可以少,少了会溢出)。

 

定义一个参数类型time_count用于判断计数是否达到200000000次,即4s的时间。

编写always块

计数器

 

这一段非常好理解。

每当时钟上升沿到来时判断计数器是否计满4s所需的次数,如果计满则清空计数器,如果没有计满,就自增。当复位下降沿信号到来时清空计数器。

流水灯

查看led对应的原理图。

 

得知4盏led是共阳的,即全部点亮需要拉低四个io口。

 

上面的计数器已经在计时,所以只需要判断计时是否达到想要的时间从而改变led寄存器状态。

当计数计数到49 999 999即第1s时,改变寄存器状态,点亮第一盏led。

当计数计数到99 999 999即第2s时,改变寄存器状态,点亮第二盏led。

当计数计数到49 999 999即第3s时,改变寄存器状态,点亮第三盏led。

当计数计数到49 999 999即第4s时,改变寄存器状态,点亮第四盏led。

如此循环形成流水灯。

程序综合与仿真

Verilog HDL代码写完检查无误后进行程序综合

 

 

综合完成,没有错误。

 

 

创建仿真文件

 

 

 

 

 

 

 

 

接下来需要设置一下引脚信号。

 

 

 

 

 

这里我们可以看到,其实仿真并没有我们想要的效果。

 

原因是因为仿真图形中是0ns~1000ns,而我们led寄存器变换时间是1s,远远大于这个范围,所以我们需要改一下源代码中的计数值。

 

再综合一次,综合好后打开我们刚才创建的仿真文件。

开始仿真

 

 

分析仿真图形证明代码逻辑是没有问题的。

再返回到源代码,把仿真值改成实际值,记得改完后要再综合一次!!!

进入下一步操作。

引脚分配与程序烧录

引脚分配

 

查询板子的引脚分配表。

 

 

Ok,引脚分配完成。

程序烧录

非固化烧录

非固化烧录程序是暂存在usb blester里面的,当断电重启时程序就会擦除,需要重新烧录。非固化烧录的操作比较快速、简单,一般用于调试程序。

 

没有驱动的话是因为驱动没有安装,网上有相关教程安装驱动。

 

 

 

给板子上电,上电后烧录!!!

 

实验现象

 

 

固化烧录

 

 

配置好后再综合一次!!!

 

实验现象

 

由于我的板子固化和非固化jtag的接口是不一样的,所以需要更改接口。

另一种配置固化烧录方式

 

这里需要根据你自己板子信号来选。

这时打开烧录,多了一个jic文件,用JTAG模式烧录就行,这种情况适应于非固化和固化共用一个JTAG口的时候。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为一名FPGA工程师,你可以通过以下方法来进行学习和实践: 1. 首先,熟悉FPGA的基础语法和概念。这包括了理解数字电路和信号处理的基础知识,以及了解FPGA代码的规范写法。你可以参考引用中提到的方法,先学习基础语法,再扎实相关知识。 2. 掌握不同的FPGA设计方式。除了使用原理图设计方式,你还可以尝试使用描述语言(如Verilog)进行设计。Verilog已经在FPGA开发和IC设计领域占据了领导地位,可以更好地满足实际项目的需求。你可以参考引用中的内容,了解Verilog的基础知识和逻辑电路的表示方式。 3. 在实践中提高设计能力。通过实际的项目设计和实现,你可以进一步提高自己的FPGA工程能力。尝试使用不同的开发工具,熟悉开发流程和操作。在实践中,你可以学习解决实际问题的方法和技巧,提高自己的设计能力。 4. 注意资源的合理使用。在FPGA设计中,要慎用%和/运算符,因为它们可能会消耗大量的资源。如果你的FPGA有内嵌的硬件乘法器或者除法器,可以使用它们来代替%,/运算符。而对于乘或除2的倍数次的操作,可以使用位移运算符来代替,这样可以减少资源的消耗。参考引用中的内容了解更多关于资源消耗的注意事项。 总结起来,作为一名FPGA工程师,你需要熟悉FPGA的基础语法和概念,掌握不同的设计方式,通过实践不断提升自己的设计能力,并注意资源的合理使用。这样,你将能够更好地进行FPGA工程师的学习和实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值