Verilog & FPGA学习(一)

这篇具有很好参考价值的文章主要介绍了Verilog & FPGA学习(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

        最近心血来潮买了一块fpga,来自spieed的Tang Nano 9K,基于高云半导体 GW1NR-9 FPGA芯片。

        其实之前买过一块紫光的fpga,但是嫌环境配置太麻烦就搁置了,这次换了一家的fpga,环境配置很快,直接用高云的gowin编译器就能很快实现程序编写与下载。但是这两天研究了很久,还是没搞太懂波形时序文件怎么生成和观看...

        先不说这个了,其实fpga我之前已经接触过一个学期了,之前学习数电的时候,有相关实验已经接触过fpga了,而且已经能实现数码管的操控之类的功能了。但是,我们的fpga程序编写其实就是“画图”,在quartus将数电各个模块,计数器,寄存器进行个画图连接再编译最后烧录到fpga里,所以说,我们用fpga其实只是单纯学习数电罢了。也没接触Verilog进行程序的编写。

数电实验fpga

关于为什么想学Verilog和fpga

        关于想学Verilog以及fpga其实要追溯到半年前,也就是23年暑假,缘由还真就是电赛。今年电赛H题,是信号分离类型的题目,听说就是如果用fpga做,非常快就能将这道题完成。

        于是我开始对fpga感兴趣,再加上对数电本身就有兴趣的(数电好像是我专业课最高分的科目了)(最开始接触数电是在MC的红石电路里),于是就开始学习了。

流水灯点亮实验

        Tang Nano 9K给了一个流水灯的例程,于是我对例程开始探索并且进行一些小改动。以下是流水灯点亮实验的Verilog代码。

module led (
    input sys_clk,          // clk input
    input sys_rst_n,        // reset input
    output reg [5:0] led    // 6 LEDS pin
);

reg [23:0] counter;

always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        counter <= 24'd0;
    else if (counter < 24'd1349_9999)       // 0.5s delay
        counter <= counter + 1'b1;
    else
        counter <= 24'd0;
end

always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        led <= 6'b111110;
    else if (counter == 24'd1349_9999)       // 0.5s delay
        led[5:0] <= {led[4:0],led[5]};
    else
        led <= led;
end

endmodule

        接下来我就依照我的理解对此代码进行解析。

        首先便是module和endmodule,在这里面包含着一个程序模块。module内括号的内容便是我们的输入和输出定义,不止有input和output类型,还有wire类型等,这些比较常用。我们定义了输入时钟sys_clk、输入复位信号sys_rst_n以及我们六个led的输出,这里我们用寄存器类型变量reg做一个六位数组,表示六个led输出。

        出了括号,便是一个寄存器变量counter,我们用24位的长度进行存储这个数。

        接下里便是两个always语句,表示一直循环执行,这个和C语言里的while很像,即符合条件遍进入括号里执行。

        第一个always里有sys_clk和sys_rst_n,其中posedge表示上升沿,negedge表示下降沿,则进入这个always的条件是sys_clk信号的上升沿或者sys_rst_n信号的下降沿,即时钟上升沿,由于我们的复位按键信号常态为高电平,按下的时候变为低电平,则采用下降沿来进入。进入后,便是ifelse的判断,这也和C语言很像,在第一个if里,如果按键低电平,即按键按下时候,计数器清零,这符合复位的思想。之后便是对计数器counter的操作了,如果counter小于24'1349_9999这个数,我们看到这个数很复杂,但是依照我的理解是这样组成的:位数 + ' + 进制 + 数的大小 + _ +数的最大值,那么我们这个就是24位的十进制数1349,它的最大值为9999。我们的晶振频率是27MHz的,即输入频率的sys_clk也是27MHz,那么依照这个计数器,我们有0.5ms的延迟。

        第二个always里便是对led灯进行操作了,最开始的时候,我们给led这个数组赋值为111110,即点亮led0(低电平点亮),之后,如果我们计时器计时到了,便循环左移,点亮led1,否则led不变,这样我们就可以依次循环点亮,形成流水灯。

        这就是我们整个流水灯点亮实验的Verilog程序,通过烧录程序,我们最后可以在fpga上形成流水灯。

我的流水灯实验改进

        以下是我对流水灯的拓展改进。

module led (
    input sys_clk,          // clk input
    input sys_rst_n,        // reset input
    input sys_key,
    output reg [5:0] led    // 6 LEDS pin
    
);

reg [23:0] counter;
reg flag = 1;


always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        counter <= 24'd0;
    else if (counter < 24'd0600_9999)       // 0.5s delay
        counter <= counter + 2'b01;
    else
        counter <= 24'd0;
end

always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        led <= 6'b011111;
    else if (counter == 24'd0600_9999)       // 0.5s delay
        begin
        if(flag)
            led[5:0] <= {led[0],led[5:1]};
        else if (!flag)
            led[5:0] <= {led[4:0],led[5]};
        end
    else
        led <= led;
end

always @(posedge sys_key) begin
    if (!sys_key)
       flag = ~flag;
end

endmodule

        我增加了一个输入按键以及调整了一下计数器的延时时间。其中通过按另外一个按键,可以实现流水灯的方向改变,这里我们采用一个reg寄存器变量flag作为标志位,在按下切换按键的时候,flag取反,进入另一个方向的流水灯。

总结

        虽然不是第一次接触fpga,但是第一次接触Verilog,作为硬件描述语言,我们也应该用硬件的思想去理解。

        我的打算是继续学习fpga和Verilog,并在打算今年电赛校赛上进行学习和使用。

        之前写完2023电赛C题后还说不搞电赛了,但是现在还是想靠电赛也巩固一下fpga知识。

        智能车系列也准备开始更新了,一方面是我们已经开始准备今年暑假的智能车华北赛,也准备开个专栏来记录自己的智能车学习历程。文章来源地址https://www.toymoban.com/news/detail-798522.html

到了这里,关于Verilog & FPGA学习(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA学习——verilog实现流水灯

    学习芯片: EP4CE6F17C8 verilog代码如下: 配置引脚,查看芯片的指导书: 烧录运行结果如下: 如图我们可以看见开发板上四个led灯同时被电亮。 代码如下: 配置引脚,查看clock和key的引脚: 运行结果如下图: 此时可以看见四个led灯同时闪烁。 流水灯代码实现: 实验效果图如

    2024年02月16日
    浏览(40)
  • 基于Verilog 语言开发的FPGA密码锁工程

    基于Verilog 语言开发的FPGA密码锁工程。 通过矩阵键盘输入按键值。 输入12修改密码,13清除密码,可以修改原来默认的密码,修改时首先要输入当前密码进行验证,正确后才能更新当前密码,否则修改不成功。 修改结束后按键15,确认修改成功。 也直接使用默认密码作为最终

    2024年02月10日
    浏览(44)
  • 基于FPGA的FSK调制解调系统verilog开发

    目录 1.算法仿真效果 2.verilog核心程序 3.算法涉及理论知识概要 4.完整verilog VIVADO2019.2仿真结果如下:       频移键控是利用载波的频率变化来传递数字信息。数字频率调制是数据通信中使用较 早的一种通信方式,由于这种调制解调方式容易实现,抗噪声和抗衰减性能较强,

    2024年02月05日
    浏览(46)
  • FPGA学习-Verilog实现独立按键消抖

    利用verilog语言实现独立按键消抖,文章首先对按键抖动产生的原因、消抖原理进行简要解释;之后详细阐述各模块verilog语言实现方法;最后利用四个独立按键控制led亮灭,在vivado下进行源码设计与仿真。(完成程序代码附在文章结尾) 按键一般是机械弹性开关,由于机械触

    2024年02月04日
    浏览(30)
  • FPGA学习日记——verilog实现分频器

    主要思想是利用计数器实现分频器功能,其中按原理不同可分为分频和降频 一、先说分频。 1、第一种实现方式 输入信号为系统时钟50MHz,本例子先以偶数倍六分频为例实现分频的第一种方式:计数器对系统时钟的上升沿进行计数,最大计数M=5,即count取值范围为0~5,当计数

    2024年02月04日
    浏览(32)
  • 【FPGA/verilog -入门学习2】verilog 生成上升沿下降沿脉冲

    使用脉冲边沿检测法设计一个上下降沿检测功能 preg1 =pluse preg2=preg2 preg1 比pluse 晚一个时钟, preg2比preg1晚一个时钟 在利用 与/非指令合并,生成上升沿的一个脉冲的 r_pluse = {r_pluse[0],pulse}; //等效于 r_pluse[0] =pluse r_pluse[1] =r_pluse[1] vlg_design testbench_top 3次测试中,测试1,测试2 ,

    2024年02月04日
    浏览(30)
  • 【FPGA学习记录3-1】Verilog语法之Verilog的数据类型

    写在前面 本科时学过FPGA的相关课程,因此对于Verilog相关语法的学习重在回顾。 1.Verilog的数据类型 Verilog 最常用的 2 种数据类型就是 线(wire)与寄存器(reg) ,其余类型可以理解为这两种数据类型的扩展或辅助。 1.1wire类型 wire 类型表示硬件单元之间的物理连线,由其连接

    2024年02月02日
    浏览(32)
  • FPGA开发] 使用Verilog实现一个简单的计数器

    计数器是数字电路中常见的元件之一,它能够按照一定的规律进行计数。在FPGA开发中,我们可以使用硬件描述语言Verilog来实现一个简单的计数器。本文将为您详细介绍如何使用Verilog编写一个基于FPGA的计数器,并提供相应的源代码。 首先,我们需要定义计数器的功能和规格

    2024年02月03日
    浏览(46)
  • fpga开发基于verilog HDL的四人抢答器

    鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen) 智能电子抢答器可容纳4组参赛者抢答,每组设一个抢答钮。 ③ 电路具有第一抢答信号的鉴别和锁存功能。

    2024年02月04日
    浏览(38)
  • 基于vivado+Verilog FPGA开发 — GT收发器

    代码规范:Verilog 代码规范_verilog代码编写规范-CSDN博客 开发流程:FPGA基础知识----第二章 FPGA 开发流程_fpga 一个项目的整个流程-CSDN博客   源码下载:GitHub - Redamancy785/FPGA-Learning-Record: 项目博客:https://blog.csdn.net/weixin_51460407 零、低速通信接口的缺陷 1、同步通信要求传输数据

    2024年04月17日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包