【RK3568+PG2L50H开发板实验例程】FPGA部分 | 键控LED实验

本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(www.meyesemi.com)

1.实验简介

实验目的:

  从创建工程到编写代码,完成引脚约束,最后生成 bit 流下载到开发板上,完成 Key0 控 制 led0 闪烁,Key1 控制 led1 亮灭。

实验环境:

  Window11 PDS2022.2-SP6.4 芯片型号: PG2L50H-484

2.实验原理

通常的时,分,秒的计时进位大家应该不陌生;

1 小时=60 分钟=3600 秒,当时针转动 1 小时,秒针跳动 3600 次;

在数字电路中的时钟信号也是有固定的节奏的,这种节奏的开始到结束的时间,我们通常称之为周期(T)

在数字系统中通常关注到时钟的频率,那频率与周期的关系如下:

f=\frac{1}{T}

而本次开发板上的晶振提供了一个 25MHZ 的单端时钟。

所以其周期约为 40ns。而在我们FPGA 的设计中,我们的 always 块通常都是在时钟的上升沿时对数据进行赋值,因此我们可以定义一个变量,每到时钟的上升沿就让该变量+1,让其变成一个计数器,该变量每加 1 就表示经过了 40ns,那如果要定时 1s 的话,只需要让其计数到 24999999 即可,因为从 0 开始计数,所以计数到 24999999 即可,此时就是一秒了。以此类推,12499999 就是 0.5s。

  错误!未定义书签。为开发板上 2 个 LED 灯的原理图。

     错误!未定义书签。为开发板上 2 个按键的原理图。

     KEY0 控制 LED0 每 1s 更换一次 LED 灯状态,KE1 控制 LELD1 亮灭状态。(高电平用 1 表示,低电平用 0 表示)

3.接口列表

     接口列表 top.v 顶层模块接口列表:

端口I/O位宽描述
 sys_clk input1 系统时钟 25MHZ
 key0 input1 用户按键 0
 key1 input1 用户按键 1
 led_0 output1 led 灯控制信号
 led1 output1 led 灯控制信号

  btn_deb_fix.v 按键消抖模块接口列表:

端口I/O位宽描述
 BTN_WIDTH parameter4 案件数量
 sys_clk input1 系统时钟 25MHZ
 rst_n input1 全局复位
 btn_in inputBTN_WIDTH 用户按键输入
 btn_deb_fix outputBTN_WIDTH 按键消抖后的输出(脉冲信号)

4.工程说明

  该工程框架如下所示:

      本次工程主要完成按键控制 led 的状态。按键 0 控制 led0 闪烁,按键 1 控制 led1 亮灭。首先,key0 和 key1 均会经过按键消抖模块,因为开发板上使用的是机械按键,所以每次 按下均会产生抖动,如果不进行消抖,会造成误判。经过消抖后,每次按下按键均会产生持续一个 clk 的高电平即key0_flag和key1_flag。key0_flag控制是否打开 1s计数器来开启 led0 的闪烁,key1_flag 直接控制 LED1 翻转,每按下一次 key1,led 的状态翻转一次。

5.代码模块说明

 //key0->led0 闪烁//key1->key1 翻转module top(input wire sys_clk , //系统时钟 25MHZinput wire key0 , input wire key1 , output reg led_0 , output reg led_1);//--------------------------------parameter-------------------------------- parameter   CNT_MAX = 32'd25_000_000 ; //1s 计数//----------------------------------reg---------------------------------- reg [7:0]   rsn_cnt =0 ; //复位计数器reg [31:0]  cnt_1s ; //计数器reg led0_en ; //led0 闪烁使能//----------------------------------wire---------------------------------- wire        rst_n ; //复位信号,低电平有效wire        key0_flag ; //按键按下后的上升沿wire        key1_flag ; //按键按下后的上升沿//-----------------------------always & assign----------------------------- //产生复位always@(posedge sys_clk) beginif(rsn_cnt >=100)rsn_cnt <= rsn_cnt;elsersn_cnt <= rsn_cnt + 1'b1;endassign rst_n = (rsn_cnt>=100)?1'b1:1'b0 ;//每按下一次 key0 进行一次翻转always@(posedge sys_clk) beginif(!rst_n)led0_en <= 1'd0;else if(key0_flag)led0_en <= ~led0_en;end//计数 1salways@(posedge sys_clk) beginif(!rst_n)cnt_1s <= 32'd0;else if(led0_en) //led0 闪烁使能beginif(cnt_1s == CNT_MAX-1) //1 秒cnt_1s <= 32'd0;elsecnt_1s <= cnt_1s + 1'b1;endelsecnt_1s <= 32'd0;end//led0  1s 闪烁always@(posedge sys_clk) beginif(!rst_n)led_0 <= 1'd0;else if(led0_en)beginif(cnt_1s == CNT_MAX-1) //1s 翻转 ledled_0 <= ~led_0;elseled_0 <= led_0;endelseled_0 <= 1'd0;end//led1 翻转always@(posedge sys_clk) beginif(!rst_n)led_1 <= 1'd0;else if(key1_flag)led_1 <= ~led_1;end//-----------------------------instance----------------------------- //按键消抖模块btn_deb_fix#(.BTN_WIDTH ( 4'd2 ) //2 个按键)u_btn_deb_fix(.sys_clk ( sys_clk ), .rst_n ( rst_n ), .btn_in ( {key1,key0} ), .btn_deb_fix ( {key1_flag,key0_flag} ));endmodule

     CNT_MAX定义了一个最大的计数值,由于我们的系统时钟是 25MHZ,也就是25000000,所以要让 LED 实现 1s 闪烁的话就是从 0 计数到 24999999 的时候让 led 进行一次翻转。 

     在 26-31 行中,利用系统时钟计数 100 个周期后产生了一个复位信号用来给后续模块和 时序逻辑提供复位。

     在 43-55 行中,当 led0_en 拉高时才开始计数一秒。否则计数器一直保持 0。

     在 82-89 行中,例化了一个按键消抖的模块,按键按下并松开后将产生一个脉冲信号即 key0_flag,key1_flag,其中 key_0flag 控制 led0 闪烁,key1_flag 控制 led1 翻转。

 //按键消抖`define UD #1module btn_deb_fix#(parameter BTN_WIDTH = 4'd8 //按键数量)( input                    sys_clk , input  wire              rst_n , input   [BTN_WIDTH-1:0]  btn_in , output reg [BTN_WIDTH-1:0] btn_deb_fix );//----------------------------parameter---------------------------- parameter CNT_20MS_MAX = 32'd500_000 ; //20MS 计数//-------------------------------reg-------------------------------reg [23:0] cnt[BTN_WIDTH-1:0]; //计数器reg [BTN_WIDTH-1:0] btn_in_reg ; //寄存按键信号//打一拍always @(posedge sys_clk) beginbtn_in_reg <= btn_in;end//------------------------ 消 抖 主 要 逻 辑------------------------ genvar i;generatebeginfor(i=0;i<BTN_WIDTH;i=i+1)beginalways @(posedge sys_clk) beginif(!rst_n)cnt[i] <= 24'd0;if (btn_in_reg[i] == 1'b0)   //按下时 计数 20ms 时归零cnt[i] <= 24'd0;else if(cnt[i]==CNT_20MS_MAX)   //抖动区间有效时计数cnt[i] <= cnt[i];elsecnt[i] <= cnt[i] + 1'b1;endalways @(posedge sys_clk) beginif(!rst_n)btn_deb_fix[i] <= 1'd0;else if(cnt[i]==CNT_20MS_MAX-1) //消抖后输出一个 clk 的高电平btn_deb_fix[i] <= 1'b1;elsebtn_deb_fix[i] <= 1'b0;endendendendgenerateendmodule

       该部分为按键消抖模块,parameter 定义了按键输入的数量,模块的输出将产生一个脉冲信号即产生一个持续一个 clk 的高电平信号。

       在 30-50 行中,cnt 会不断进行 20ms 的计数,当按键按下时,cnt 归 0,从 0 开始计数直到 20ms。当计数到 20ms 的时候,就输出一个 clk 的高电平,即将 btn_deb_fix 置 1,并让其只保持一个 clk。

6.实验步骤

      这里将会详细介绍从新建工程到下载程序的具体步骤,后续的工程将不再详细解释。

6.1. 打开 PDS 软件,创建工程

  Step1:打开 PDS 软件,点击 NEW Project,然后对其设置完成新建工程。

  Step2:单击 NEXT

 Step3:创建名为 led_water 的工程到对应的文件目录,之后单击 Next。

     新建工程大致包括设置工程名和工程路径、工程类型、工程文件及器件信息。

    【Project Name】是工程文件名称,默认为 project。(只允许字母、数字、下划线(_)、杠(-)、点(.))。

    【Project Location】用于选择新工程的工作路径,文件夹名只允许字母、数字、下划线

    (_)、杠(-)、点(.)、@、~、,、+、=、#、空格( ),但空格不能出现在路径名首尾,即工程文件放置的路径。

    【Create Preject Subdirectory】将工程文件名作为工作目录的一部分。

 Step4:选择 RTL project,点击 Next。

    【RTL Project】用于创建 RTL 工程。新建的工程可以执行 synthesize,device map,place& route,report timing,report power,generate netlist 及 generate bitstream 等。

    【Post-Synthesize Project】用于创建综合后工程。新建的工程可以执行 device map, place& route,report timing,report power, generate netlist 及 generate bitstream 等。

 Step5:单击 Next

     该界面可以 Add Files 和 Add Directories 来添加 rtl 源文件及新建 rtl 源文件,以及调整 rtl 文件编译顺序,Add Files 添加选中的文件,Add Directories 添加选中的文件夹下所有合适的文件,若勾选了下方的 Add source from subdirecotires 则添加所有的子目录下合适的文件,也可直接 NEXT 跳过添加文件。

 Step6:单击 Next

 Step7:单击 Next

 Step8:选择器件系列、型号、封装、速率、综合工具,之后单击 Next

synthesize tool 中可以选择综合工具为 Synplify Pro 或 ADS,在实验中使用 ADS 综合工具。

 Step9:在 summary 单击 Finish,完成工程的创建

6.2. 添加设计文件

  PDS 软件界面如下图:

       双击 Designs,将前面设计的 module 新建到文件中,或者将前面编辑好的 verilog 文件添加到工程中:

     添加文件到工程:

     在窗口中点击 Add Files,选择添加文件到工程;

    新建文件到工程:

    1)在窗口中点击 Create File;

      2)选择 Verilog Design File,文件名和 module 名一致,默认路径,点击 OK;

      3)点击 OK;

     4)点击 Cancel;

     5)默认打开新建文件,将前面设计的 代码 复制进去,

 6)点击保存,新建文件完成

 Crtl+s 保存。

双击 Designs。

     点击 Add Files;

添加 btn_deb_fix.v 模块,即按键消抖模块。

    点击 OK。 

6.3. 编译

  可采用以下方式运行 Compile 流程:

(1)双击 Flow 中的 Compile 进行综合;

(2)右击 Compile 点击 Run 进行综合;

6.4. 工程约束

    点击 Tools 选择 User Constraint Editor(Timing and Logic)或者点击工具栏图标 ,User Constraint Editor(Timing and Logic) 选择 Pre Synthesize UCE,如下图所示。

     Tools 下的 User Constraint Editor(Timing and Logic)

6.4.1. 时钟约束

     打开 UCE 后,选择 Timing Constraints 后选择 Create Clock 添加基准时钟,基准时钟一般是通过输入 port 输入用户所使用的板上时钟。

     在弹窗中对时钟命名,关联时钟管脚,添加时钟参数,点击 OK 会创建一条时钟约束,Reset 重置该页面。创建完成如下图所示:

     提供给开发板的时钟是 25MHZ,即周期为 40ns。

6.4.2. 物理约束

    打开 UCE 后,选择 Device 后选择 I/O,根据原理图编辑 IO 的分配。

按照原理图编辑好 IO 分配后,点击保存,会生成.fdc 文件,完成约束。

6.5. 综合

  运行 Synthesize 流程有以下四种方式可以实现:

(1)双击 Flow 中的 Synthesize 进行综合;

(2)右击 Synthesize 点击 Run 进行综合;

完成 Synthesize 操作后,会看到下图所示:

6.6. Device Map

   Device Map 的主要作用是将设计映射到具体型号的子单元上(LUT、FF、Carry 等)。

   运行 Device Map 流程有以下方式可以实现:

(1)直接双击 Device Map;

(2)右击 Device Map 点击 Run;

  完成 Device Map 操作后,会看到下图所示:

6.7. Place & Route

  布局布线(Place & Route)根据用户约束和物理约束,对设计模块进行实际的布局及布线。

  运行 Place & Route 流程有以下方式可以实现:

(1)直接双击 Place & Route;

(2)右击 Place & Route 点击 Run;

  完成 Device Map 操作后,会看到下图所示:

6.8. Generate Bitstream

  Generate Bitstream 生成二进制位流文件。运行 Generate Bitstream 流程有以下方式可以实现: (1)直接双击 Generate Bitstream;

(2)右击 Generate Bitstream 点击 Run;

  完成以上操作,将会产生位流文件。

  运行 Generate Bitstream,可以看到界面如下图所示:

6.9. 下载生成的位流文件

点击 Tools 选择 Configuration 或者点击工具栏图标 Configuration,如下图所示。

Tools 下的 Configuration

    工具栏 Configuration 图标

    打开 Configuration 后直接选择 Scan Device 直接进行扫描 Jtag 链操作,初始化链成功,会将链上扫描到的所有器件显示于工作区内,并在器件属性窗口显示当前器件的器件 信息,并弹出对话显示能够为器件添加的配置文件:

初始化链成功

在对话框中选择位流文件,添加该配置文件,提示所载入文件的绝对路径并在信息栏中显示,如下图所示:

    下载位流文件

     当发现这 4 个信号均为 1 时,表示下载成功。

     同时,开发板也配置了一个外部 flash,其中,若需要将程序固化到板卡上需要将尾流文 件转化为.sfc 文件。

     首先点击 Configuration 页面的 Operations 选项的 Covert File 选项。

       点击后会出现如下画面,在Generate Flash Programing File页面选择对应的Flash 器件的厂商名、型号、再在 BitStreamFile 位置选择位流文件的路径,点击 OK。(若使用的 flash 器件不在可选的 flash 列表中,需手动添加对应 flash 型号,操作步骤请参考开发板下载与固化相说明)

   转化.sfc 文件成功后,页面会如下图所示,点击 OK。

页面会显示板卡搭载的 Flash 的型号,点击.sfc 文件,点击 OPEN。

在下图位置点击鼠标右键后,点击 Program。

固化 Flash 成功如下图所示:

      此时将板卡断电,再重新上电,如果按下 key0 和 key1 能看到对应的实验现象的话,则表示固化成功。(等大概 15s)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914152.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python练习】039. 编写一个函数,反转一个单链表

039. 编写一个函数,反转一个单链表 039. 编写一个函数,反转一个单链表方法 1:迭代实现运行结果代码解释方法 2:递归实现运行结果代码解释选择方法迭代法与递归法的区别039. 编写一个函数,反转一个单链表 在 Python 中,可以通过迭代或递归的方式反转一个单链表。 方法 1…

BERT代码简单笔记

参考视频&#xff1a;BERT代码(源码)从零解读【Pytorch-手把手教你从零实现一个BERT源码模型】_哔哩哔哩_bilibili 一、BertTokenizer BertTokenizer 是基于 WordPiece 算法的 BERT 分词器&#xff0c;继承自 PreTrainedTokenizer。 继承的PretrainedTokenizer&#xff0c;具…

PID控制算法理论学习基础——单级PID控制

这是一篇我在学习PID控制算法的过程中的学习记录。在一开始学习PID的时候&#xff0c;我也看了市面上许多的资料&#xff0c;好的资料固然有&#xff0c;但是更多的是不知所云。&#xff08;有的是写的太过深奥&#xff0c;有的则是照搬挪用&#xff0c;对原理则一问三不知&…

【Elasticsearch】function_score与rescore

它们俩都是用来“**干涉评分**”的&#xff0c;但**工作阶段不同、性能开销不同、能做的事也不同**。一句话总结&#xff1a;> **function_score** 在 **第一次算分** 时就动手脚&#xff1b; > **rescore** 在 **拿到 Top-N 结果后** 再“重新打分”。下面把“能干嘛”…

无广告纯净体验 WPS2016 精简版:移除联网模块 + 非核心组件,古董电脑也能跑

各位办公小能手们&#xff01;今天给你们介绍一款超神的办公软件——WPS2016精简版&#xff01;它有多小呢&#xff1f;才33MB&#xff0c;简直就是软件界的小不点儿&#xff01;别看它个头小&#xff0c;功能可一点儿都不含糊&#xff0c;文字、表格、演示这三大功能它全都有。…

《PyWin32:Python与Windows的桥梁,解锁系统自动化新姿势》

什么是 PyWin32在 Windows 平台的 Python 开发领域中&#xff0c;PyWin32 是一个举足轻重的库&#xff0c;它为 Python 开发者打开了一扇直接通往 Windows 操作系统底层功能的大门。简单来说&#xff0c;PyWin32 是用于 Python 访问 Windows API&#xff08;Application Progra…

vite如何生成gzip,并在服务器上如何设置开启

1. 安装插件npm install vite-plugin-compression -D2. 在 vite.config.ts 中配置TypeScriptimport { defineConfig } from vite import compression from vite-plugin-compressionexport default defineConfig({plugins: [compression({algorithm: gzip,ext: .gz,threshold: 1…

1068万预算!中国足协大模型项目招标,用AI技术驱动足球革命

中国足协启动国际足联“前进计划”下的大数据模型项目&#xff0c;预算1068万元。该项目将建立足球大数据分析平台&#xff0c;利用AI技术为国家队、青少年足球、业余球员及教练员裁判员提供精准数据分析服务&#xff0c;旨在通过科技手段提升中国足球竞技水平。 中国足球迎来数…

AI产品经理面试宝典第12天:AI产品经理的思维与转型路径面试题与答法

多样化思维:如何跳出单一框架解题? 面试官:AI产品常面临复杂场景,请举例说明你如何运用多样化思维解决问题? 你的回答:我会从三个维度展开:多角度拆解需求本质,多层级融合思维模式,多变量寻找最优解。比如设计儿童教育机器人时,不仅考虑功能实现(技术层),还融入情…

vscode.window对象讲解

一、vscode.window 核心架构图 #mermaid-svg-fyCxPz1vVhkf96nE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-fyCxPz1vVhkf96nE .error-icon{fill:#552222;}#mermaid-svg-fyCxPz1vVhkf96nE .error-text{fill:#5522…

为什么一个 @Transactional 注解就能开启事务?揭秘 Spring AOP 的底层魔法

你是否也曾深陷在各种“额外”逻辑的泥潭&#xff0c;为了给一个核心业务方法增加日志、权限校验或缓存&#xff0c;而不得不将这些非核心代码硬塞进业务类中&#xff0c;导致代码臃肿、职责不清&#xff1f;是时候用代理设计模式 (Proxy Design Pattern) 来解脱了&#xff01;…

《Spring 中上下文传递的那些事儿》Part 8:构建统一上下文框架设计与实现(实战篇)

&#x1f4dd; Part 8&#xff1a;构建统一上下文框架设计与实现&#xff08;实战篇&#xff09; 在实际项目中&#xff0c;我们往往需要处理多种上下文来源&#xff0c;例如&#xff1a; Web 请求上下文&#xff08;RequestContextHolder&#xff09;日志追踪上下文&#xf…

配置驱动开发:初探零代码构建嵌入式软件配置工具

前言在嵌入式软件开发中&#xff0c;硬件初始化与寄存器配置长期依赖人工编写重复代码。以STM32外设初始化为例&#xff0c;开发者需手动完成时钟使能、引脚模式设置、参数配置等步骤&#xff0c;不仅耗时易错&#xff08;如位掩码写反、模式枚举值混淆&#xff09;&#xff0c…

Elasticsearch混合搜索深度解析(下):执行机制与完整流程

引言 在上篇中&#xff0c;我们发现了KNN结果通过SubSearch机制被保留的关键事实。本篇将继续深入分析混合搜索的执行机制&#xff0c;揭示完整的处理流程&#xff0c;并解答之前的所有疑惑。 深入源码分析 1. SubSearch的执行机制 1.1 KnnScoreDocQueryBuilder的实现 KNN结果被…

Apache HTTP Server 从安装到配置

一、Apache 是什么&#xff1f;Apache&#xff08;全称 Apache HTTP Server&#xff09;是当前最流行的开源Web服务器软件之一&#xff0c;由Apache软件基金会维护。它以稳定性高、模块化设计和灵活的配置著称&#xff0c;支持Linux、Windows等多平台&#xff0c;是搭建个人博客…

php中调用对象的方法可以使用array($object, ‘methodName‘)?

是的&#xff0c;在PHP中&#xff0c;array($object, methodName) 是一种标准的回调语法&#xff0c;用于表示“调用某个对象的特定方法”。这种语法可以被许多函数&#xff08;如 call_user_func()、call_user_func_array()、usort() 等&#xff09;识别并执行。 语法原理 在P…

【设计模式】单例模式 饿汉式单例与懒汉式单例

单例模式&#xff08;Singleton Pattern&#xff09;详解一、单例模式简介 单例模式&#xff08;Singleton Pattern&#xff09; 是一种 创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。&#xff08;对象创建型模式&…

vue3 el-table 行数据沾满格自动换行

在使用 Vue 3 结合 Element Plus 的 <el-table> 组件时&#xff0c;如果你希望当表格中的行数据文本过长时能够自动换行&#xff0c;而不是溢出到其他单元格或简单地截断&#xff0c;你可以通过以下几种方式来实现&#xff1a;方法 1&#xff1a;使用 CSS最简单的方法是通…

windows电脑远程win系统服务器上的wsl2

情况 我自己使用win11笔记本电脑&#xff0c;想要远程win11服务器上的wsl2 我这里只有服务器安装了wsl2&#xff0c;win11笔记本没有安装 因此下面提到的Ubuntu终端指的是win服务器上的wsl2终端 一定要区分是在哪里输入命令&#xff01;&#xff01; 安装SSH 在服务器上&#x…

神经辐射场 (NeRF):重构三维世界的AI新视角

神经辐射场 (NeRF)&#xff1a;重构三维世界的AI新视角 旧金山蜿蜒起伏的街道上&#xff0c;一辆装备12个摄像头的Waymo自动驾驶测试车缓缓驶过。它记录的280万张街景图像并未被简单地拼接成平面地图&#xff0c;而是被输入一个名为Block-NeRF的神经网络。数周后&#xff0c;一…