FPGA学习笔记(二):时序逻辑之计数器

news2024/11/19 10:37:26

与组合逻辑(给定输入,输出是确定的,与时间无关)相比较,时序逻辑不仅仅与输入信号相关,还与时钟信号相关。

D触发器:在上升沿时(CLK)才将输出(Q)修改为当前的输入值(D),具有存储的性质。

1s 闪烁的 LED 灯

注意根据时钟频率计算计数量。

时序逻辑使用 posedge 表示时钟信号。

module led_flash (
    clk,
    reset_n,
    led
);
    input clk, reset_n;
    output reg led;
    
    reg [24:0] counter;
    
    // ÍÆŒö·ÖΪÁœžö always£¬ÓÐÖúÓÚ·ÖÎö×ÛºÏ
    
    always@(posedge clk or negedge reset_n) // œöœöʱÖÓÉÏÉýÑصœÀŽ»òÕßžŽÎ»ÐźŲúÉú²Å»áŒ€»îÏÂÃæµÄŽúÂë¿é
        if(!reset_n)
                counter <= 0; // ·Ç×èÈûž³Öµ
        else if(counter == 25000000) // ×¢ÒâÕâÀïÓŠžÃ 25000000 - 1
                counter <= 0; // ºÍÉÏÃæÒ»ÐÐÒ»Æð×ö£¬ÐèҪʹÓÃbegin¿éʵÏÖ
        else
            counter <= counter + 1'd1;
        
    always@(posedge clk or negedge reset_n) // œöœöʱÖÓÉÏÉýÑصœÀŽ»òÕßžŽÎ»ÐźŲúÉú²Å»áŒ€»îÏÂÃæµÄŽúÂë¿é
        if(!reset_n)
                led <= 0;
        else if(counter == 25000000) 
                led <= !led;
        else
            counter <= counter + 1'd1;
endmodule

二者差值并非绝对的 500ms,问题出在计数变量的初始化上。
在这里插入图片描述

时序逻辑的 test_bench 怎么写?

`timescale 1ns/1ns

module led_flush_tb();
    
    reg clk;
    reg reset_n;
    wire led;
    
    led_flash led_flash_example (
        .clk(clk),
        .reset_n(reset_n),
        .led(led)
    );

    initial clk = 1;
    always #10 clk = ~clk; // ÊŒÖÕ10ns·­×ªÒ»ŽÎ
    
    initial begin
        reset_n = 0;
        #201
        reset_n = 1;
        #2000000000;
        $stop;
    end

endmodule

AXU3EG LED 灯实验

LED 灯控制实验,每秒钟控制开发板上的 LED 灯翻转一次。

Zynq 相比较其它 ARM 平台,其可以使用 PL 端资源定制很多 ARM 端的外设。

LED 硬件介绍

开发板的 PL 端连接了一个红色的 LED 灯,完全由 PL 端控制。如果 PL_LED1 为高电平,三极管导通,灯会亮,否则熄灭。

在这里插入图片描述
扩展板:确定 LED 和 PL 管脚的绑定关系。
在这里插入图片描述

核心板:
在这里插入图片描述

创建 Vivado 工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输入工程名和工程存放目录,工程路径不能有中文空格。
在这里插入图片描述
工程类型中选择 RTL Project。
在这里插入图片描述
目标语言选择 Verilog,VHDL 也可以使用,支持多语言混合编程,并可以在这里创建文件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
选择器件。
在这里插入图片描述
在这里插入图片描述
点击 Finish 完成工程创建。
在这里插入图片描述
在弹出的模块定义中可以指定端口,这里暂不指定。
在这里插入图片描述
在这里插入图片描述
双击 led2.v 文件编写,这里定义了一个 32 位寄存器 timer,用于循环计数 0~199999999(1秒钟),计数到 199999999 的时候,寄存器 timer 变为 0,并翻转四个 LED,原来 LED 是灭的话就会点亮,如果原来 LED 为亮的话,就会熄灭。由于输入时钟为 200MHz 的差分时钟,因此需要添加 IBUFDS 原语连接差分信号。

`timescale 1ns / 1ps 
module led(
//Differential system clock
    input sys_clk_p,
    input sys_clk_n,
    input rst_n,
(* MARK_DEBUG="true" *)    output reg  led
    );
(* MARK_DEBUG="true" *)reg[31:0] timer_cnt;
wire sys_clk ;

IBUFDS IBUFDS_inst (
      .O(sys_clk),   // 1-bit output: Buffer output
      .I(sys_clk_p),   // 1-bit input: Diff_p buffer input (connect directly to top-level port)
      .IB(sys_clk_n)  // 1-bit input: Diff_n buffer input (connect directly to top-level port)
   );

always@(posedge sys_clk)
begin
    if (!rst_n)
    begin
      led <= 1'b0 ;
      timer_cnt <= 32'd0 ;
    end
    else if(timer_cnt >= 32'd199_999_999)   //1 second counter, 200M-1=199999999
    begin
        led <= ~led;
        timer_cnt <= 32'd0;
    end
    else
    begin
        led <= led;
        timer_cnt <= timer_cnt + 32'd1;
    end
    
end
//Instantiate ila in source file
//ila ila_inst(
//  .clk(sys_clk),
//  .probe0(timer_cnt),
//  .probe1(led)
//  );


endmodule

添加管脚约束

Vivado 使用的约束文件格式为 xdc 文件。xdc 文件里主要是完成管脚的约束、时钟的约束、以及组的约束。这里我们需要对 led.v 程序中的输入输出端口分配到 FPGA 的真实管脚上。

在这里插入图片描述

  • Open Elaborated Design:将RTL源代码翻译转换成对应的电路。
  • Run Synthesis:同样提供了显示详细电路的功能,相比较前者,更偏向于显示 Xilinx 中已封装好的库。

在这里插入图片描述
在这里插入图片描述
时钟

在这里插入图片描述
核心板:
在这里插入图片描述
核心板:
在这里插入图片描述
扩展板:

在这里插入图片描述
扩展板:

在这里插入图片描述
核心板:

在这里插入图片描述

在 I/O Ports 中可以看到管脚分配情况。
在这里插入图片描述
将复位信号 rst_n 绑定到 PL 端的按键,给 LED 和时钟分配管脚、电平标准,完成后 Ctrl + S,弹出窗口,保存约束文件,文件类型默认为 XDC。

在这里插入图片描述

打开生成的 led2.xdc 文件,最基本的 XDC 编写语法:

普通 IO 口只需要约束引脚号和电压,管脚约束:

set_property PACKAGE_PIN "引脚编号" [get_ports "端口名称"]

电平信号约束:

set_property IOSTANDARD "电平标准" [get_ports "端口名称"]

电平标准中 ”LVCMOSS33“ 后面的数字指 FPGA 的 BANK 电压,LED 所在 BANK 电压为 3.3 伏,Vivado 默认要求为所有 IO 分配正确的电平标准和管脚编号。

添加时序约束

先分析综合,然后点击 Constraints Wizard:

在这里插入图片描述
在这里插入图片描述
时序约束向导分析出设计中的时钟,这里把 sys_clk_p 频率设置为 200MHz,然后点击 Skip to Finish,结束时序约束向导。
在这里插入图片描述
在这里插入图片描述
这个时候 led.xdc 文件已经更新,点击 Reload 重新加载文件,并保存文件。
在这里插入图片描述
在这里插入图片描述

生成 BIT 文件

在这里插入图片描述
查看目前状态:
在这里插入图片描述

Vivado 仿真

利用 Vivado 自带的仿真工具输出波形验证流水灯程序设计结果:

  1. 设置 VIvado 的仿真配置:

在这里插入图片描述
2. 在 Simulation Settings 窗口中进行如下配置,这里设置成 50ms,其它默认。
在这里插入图片描述
3. 添加激励测试文件,点击 Project Manager 下的 Add Sources 图标:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
不添加 IO 端口,

  1. 编辑内容,首先定义输入和输出信号,实例化 led_test 模块,让 led_test 程序作为本测试程序的一部分,再添加复位和时钟的激励。
`timescale 1ns / 1ps
//
// Module Name: vtf_led_test
//

module vtf_led_test;
// Inputs
reg sys_clk_p;
reg rst_n ;
wire sys_clk_n;
// Outputs
wire led;

// Instantiate the Unit Under Test (UUT)
led uut (
    .sys_clk_p(sys_clk_p),  
    .sys_clk_n(sys_clk_n),     
    .rst_n(rst_n),
    .led(led)
 );

initial 
begin
// Initialize Inputs
    sys_clk_p = 0;
    rst_n = 0;
// Wait for global reset to finish
	#1000;
    rst_n = 1; 
end
//Create clock
always #2.5 sys_clk_p = ~ sys_clk_p;  
assign  sys_clk_n = ~sys_clk_p ;
endmodule 
  1. 点击 Run Simulation ,选择 Run Behavioral Simulation,进行行为级仿真。

下载

连接 JTAG 线缆,调整到 JTAG 模式启动,开发板上电、

在 HARDWARE MANAGER 界面,点击 Auto Connect 自动连接设备。

选择 FPGA 芯片,右键选择 Program Device,点击 Program。

下载完成后,可以看到 PL LED 每秒钟变化一次。

只有 PL 工程不能直接烧写 Flash。

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

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

相关文章

Failed to load property source from location ‘classpath:/application.yaml‘

问题 项目起动时&#xff0c;找不到yaml&#xff0c;各种处理还是没有解决&#xff0c;比如&#xff0c;clean&#xff0c;重启电脑&#xff0c;检查utf8等。 同事拉的新代码又是正常可以跑&#xff0c;这就有点奇怪了。 11:07:39.682 [main] ERROR org.springframework.boot.…

【19】linux进阶——后台运行()和nohup命令

大家好&#xff0c;这里是天亮之前ict&#xff0c;本人网络工程大三在读小学生&#xff0c;拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识&#xff0c;希望能提高自己的技术的同时&#xff0c;也可以帮助到大家 另外其它专栏请关注&#xff1a; 锐捷数通实验&…

分享自己接私活常用的开源系统

目前开源系统是JNPF框架。技术栈上是SpringBoot、SpringCloud、Spring Web、MyBatis、Swagger、Vue、Element。 这些都是比较主流的技术&#xff0c;无论是技术层面的先进性还是学习难度都是比较低的&#xff0c;目前网络上有大量可供参考学习的资料。 并且它支持前后端分离和…

Ceph入门到精通-Ceph如何扩展到超过十亿个对象?

Ceph如何扩展到超过十亿个对象&#xff1f;-ceph部署多少个节点 (51cto.com) 越来越多的组织被要求管理数十亿个文件和几百上千PB的数据。无论是在公共云还是本地环境中&#xff0c;Ceph对象存储都是值得考虑的一个选项。本篇文章将通过七部分的精选内容为下面这些问题提供答案…

vue3+echarts实现世界地图以及轨线(label使用fomatter+rich动态添加图片及背景色,以及label如何添加动态边框色)

背景 最近项目开发&#xff0c;需要开发一个世界地图&#xff0c;并且实现经纬度对应的点对点轨线动效&#xff0c;效果如下&#xff1a; 问题 如何在刚打开页面的时候就显示地点名称label如何同时添加图片和背景色label怎么动态修改字体颜色及图片以及动态边框色添加动效及…

YumRepo Error: All mirror URLs are not using ftp, http[s] or file解决办法

文章目录 一、问题背景二、问题原因三、解决方法 一、问题背景 CentOS6.5利用yum -y install gcc命令安装程序报错YumRepo Error: All mirror URLs are not using ftp, http[s] or file.Eg. Invalid release/repo/arch combination/ removing mirrorlist with no valid mirror…

maven安装教程(结合eclipse和IDEA)

一.安装maven 本文须知:安装maven环境之前要先安装java jdk环境(没有安装java环境的可以先去看安装JAVA环境的教程)Maven 3.3+ require JDK 1.7 及以上。 第一步:下载maven(本教程安装的是3.8.4) 官方下载链接:https://maven.apache.org/download.cgi Binary是可执行版本…

电子台账:生成的数据和图表导出到一个excel表中

目录 1 数据选择 1.1 选择1行数据 1.2 选择1列数据 2 图表设置 3 数据导出 为了便于进行数据分析和数据展示&#xff0c;可以把生成的汇总数据生成图表&#xff0c;然后对图表进行定制修改&#xff0c;最后把数据和图表一起导出到一个excel表中。 程序目前支持两种数据作…

【C++学习笔记】函数

值传递 值传递&#xff1a;函数调用时实参将数值传入给形参 做值传递时函数的形参发生改变&#xff0c;并不会影响实参 因为形参的作用域在函数内只有在调用函数时才会为其分配内存&#xff0c;函数调用结束后释放函数内的变量内存。 #include<iostream> using namespa…

mybatis04-mybatis缓存、分页插件、注解开发(一对一、多对一、多对多)

mybatis04 mybatis 缓存 一、mybatis 缓存概述 1、缓存 ​ 缓存 是存在于内存中的临时数据&#xff0c;使用缓存的目的是&#xff1a;减少和数据库的交互次数&#xff0c;提高执行效率。 2、mybatis 缓存 ​ mybatis 与 大多数的持久层框架一样&#xff0c;提供了缓存策略…

网络视频监控如何入门?如何安装和配置、设备选择和实时监控?

网络视频监控是一种先进的安全技术&#xff0c;它可以通过互联网连接到远程视频服务器&#xff0c;使用户可以随时随地监控所关注的地点。本文将介绍网络视频监控的基础入门知识&#xff0c;包括安装和配置、设备选择和实时监控等方面。 一、安装和配置 在进行网络视频监控前&…

PMP项目管理-[第五章]范围管理

范围管理知识体系&#xff1a; 规划范围管理&#xff1a; 收集需求&#xff1a; 定义范围&#xff1a; 创建WBS&#xff1a; 确认范围&#xff1a; 控制范围&#xff1a; 5.1 范围管理 产品范围&#xff1a;某项产品、服务或成果所具有的特性和功能 项目范围&#xff1a;为交付…

商品价格监控业务场景,API数据分析

商品价格监控指的是对特定商品价格进行实时监控和跟踪&#xff0c;及时更新最新价格并分析价格变化的行为。这种监控可以帮助企业及时了解市场行情&#xff0c;并根据价格变化情况做出相应的调整&#xff0c;以更好地应对市场变化。 一般来说&#xff0c;商品价格监控需要以下…

使用RabbitMq实现延迟队列

下载RabbitMq&#xff1a;本地安装rabbitmq_王胖胖1112的博客-CSDN博客 1、pom文件引入 <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit-test</artifactId> <scope>test&…

关于小程序云开发cms内容管理无法使用,无法同步内容模型到云开发数据库的解决方案

小程序官方最近又搞大动作了&#xff0c;偷偷的升级的云开发cms&#xff08;内容管理&#xff09;以下都称cms&#xff0c;不升级不要紧&#xff0c;这一升级&#xff0c;就导致我们没有办法正常使用cms了。如果你开通完cms带下面这个标识的话&#xff0c;就代表你是新版本&…

NVT | NVT SDK光敏电阻ADC配置与调试

NVT | NVT SDK光敏电阻ADC配置与调试 时间:2023-04-21 文章目录 `NVT` | `NVT` `SDK`光敏电阻`ADC`配置与调试1.参考2.电路原理图3.代码编写3-1.配置ADC通道3-2.初始化ADC3-3.ADC值读取3-4.ADC读取测试4.头文件1.参考 1.光敏电阻:原理及作用、符号及参数、选型及电路 2.

科技现代闪耀上海秀场 北京现代在上海车展上演转型之姿

4月18日&#xff0c;作为疫情后的第一个大型国际车展&#xff0c;第二十届上海国际汽车工业展览会盛况空前&#xff0c;新产品、新技术、新战略、新体验争先登台。作为合资企业的技术实力代表&#xff0c;北京现代不仅重磅发布了首款智能家居SUV车型MUFASA&#xff0c;并且以强…

微信小程序开发教程(二)--上传小程序

接上文,我们已经有一个小例子了。 在模拟器的位置,点击头像,会登录。 此时我们可以第一次尝试将我们的小程序进行上传。 点击下图箭头所指位置: 点击确定: 填写版本号和备注信息,选择上传: 在网页管理小程序上,选择上传,以下都选择红框所在位置:

多线段合并的两种方法:Cadance allegro与CAD交互

文章目录 问题引入Pe命令&#xff08;推荐&#xff09;block命令 问题引入 我们知道在Cadance allegro 中&#xff0c;涉及到板框文件和丝印层倒角的问题。而这些板框和丝印倒角的图形来自于CAD中的结构文件&#xff08;dxf文件&#xff09;&#xff0c;再导入到Cadance allegr…

人工智能︱AI数字人有什么用?

有了数字人&#xff0c;直播都不用亲自上阵了&#xff1f; 那咱随便捏个数字人放到直播间&#xff0c;是不是就能轻松把货卖出去啦&#xff1f; 虚拟数字人是AI技术的一种应用&#xff0c;我们先来看看它的定义&#xff1a; 虚拟数字人是通过计算机程序和人工智能技术创建的…