【FPGA】状态机思想回顾流水灯

【FPGA】状态机思想回顾流水灯

    • 一、LED流水灯实现
      • 1. 基本要求
      • 2. 状态机思想
      • 3. 关键代码
      • 4. 仿真测试
      • 5. 效果演示
    • 二、CPLD和FPGA
      • 1. 技术区别
      • 2. 应用场景
    • 三、HDLbits组合逻辑题目
    • 四、实验总结

一、LED流水灯实现

1. 基本要求

  • 状态机思想写一个 LED流水灯的FPGA代码
  • 写出仿真测试代码,用Modelsim进行仿真分析
  • DE2-115板上验证

2. 状态机思想

用状态机思想的话,流水灯通常可以用几个状态来表示不同的LED亮的位置。

比如,每个状态对应一个LED亮,然后通过状态转移来实现流动的效果。由于我们流水灯是8个灯亮,所以对应8个状态。

所以,状态机的状态定义可能如下:

状态S0: LED[0]亮
状态S1: LED[1]亮

状态S7: LED[7]亮

流水灯就是一个状态持续一段时间再进入下一个状态。

3. 关键代码

// File: led_flow.v
module led_flow(input clk,          // 50MHz时钟 (DE2-115 PIN_Y2)input rst_n,        // 复位信号 (低电平有效)output reg [7:0] led// LED输出 (DE2-115 LEDG7-LEDG0)
);// 状态定义
localparam S0 = 3'b000; // 初始状态:LED0亮
localparam S1 = 3'b001;
localparam S2 = 3'b010;
localparam S3 = 3'b011;
localparam S4 = 3'b100;
localparam S5 = 3'b101;
localparam S6 = 3'b110;
localparam S7 = 3'b111;// 内部信号
reg [2:0] state;        // 当前状态
reg [24:0] cnt;         // 分频计数器
wire en;                // 状态切换使能(0.5Hz)// 0.5Hz分频(0.5秒切换)
assign en = (cnt == 25'd24_999_999); // 50MHz/(25M+1) ≈ 0.5Hz// 分频计数器
always @(posedge clk or negedge rst_n) beginif(!rst_n) cnt <= 0;else if(en) cnt <= 0;else cnt <= cnt + 1;
end// 状态机主逻辑
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginstate <= S0;led <= 8'b0000_0001; // 初始状态endelse if(en) begincase(state)S0: begin led <= 8'b0000_0010; state <= S1; endS1: begin led <= 8'b0000_0100; state <= S2; endS2: begin led <= 8'b0000_1000; state <= S3; endS3: begin led <= 8'b0001_0000; state <= S4; endS4: begin led <= 8'b0010_0000; state <= S5; endS5: begin led <= 8'b0100_0000; state <= S6; endS6: begin led <= 8'b1000_0000; state <= S7; endS7: begin led <= 8'b0000_0001; state <= S0; enddefault: state <= S0;endcaseend
endendmodule

4. 仿真测试

写完代码后,参考连接博客进行仿真。
Quartus使用步骤及联合Modelsim仿真教程-
知安的小白
操作步骤这篇博客讲的很清楚了,一同操作后的效果截图如下
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

仿真代码(tb_led_flow.v)

// File: tb_led_flow.v
`timescale 1ns/1ps
module tb_led_flow();reg clk;
reg rst_n;
wire [7:0] led;// 实例化被测模块
led_flow uut(.clk(clk),.rst_n(rst_n),.led(led)
);// 生成50MHz时钟
initial beginclk = 0;forever #10 clk = ~clk; // 20ns周期=50MHz
end// 测试激励
initial begin// 初始化rst_n = 0;#100;rst_n = 1;// 观察10个状态周期#100000000; // 仿真10ms(实际应仿真更长时间)$stop;
endendmodule

下面是仿真波形:
在这里插入图片描述

5. 效果演示

[FPGA]状态机思想回顾流水灯演示效果

二、CPLD和FPGA

1. 技术区别

特性特性FPGA
结构乘积项逻辑查找表(LUT)结构
逻辑容量通常<10万门可达数百万逻辑单元
布线结构固定互联可编程互联
时序特性确定延迟布线依赖延迟
存储资源有限包含专用Block RAM
配置方式非易失,上电即用通常需要外部配置芯片
功耗低静态功耗高动态功耗
适用场景胶合逻辑、状态机复杂算法、并行处理

2. 应用场景

  • CPLD典型应用:
    接口协议转换(UART、SPI)
    简单状态机控制
    地址译码电路
    上电时序管理

  • FPGA典型应用:
    数字信号处理(FIR滤波器)
    高速接口(PCIe、DDR)
    图像处理流水线
    协议加速(TCP/IP Offload)

三、HDLbits组合逻辑题目

HDLbits问题集(Verilog)精选题目及解答

题目1:Exams/m2014 q4g
在这里插入图片描述

module top_module (input in1,input in2,input in3,output out);assign out = (~(in1^in2)^in3);
endmodule

题目2:Gates
Module Declaration
module top_module(
input a, b,
output out_and,
output out_or,
output out_xor,
output out_nand,
output out_nor,
output out_xnor,
output out_anotb
);
大概意思就是写个逻辑语句实现名称。

module top_module( input a, b,output out_and,output out_or,output out_xor,output out_nand,output out_nor,output out_xnor,output out_anotb
);assign out_and=a&b;assign out_or=a|b;assign out_xor=a^b;assign out_nand=~(a&b);assign out_nor=~(a|b);assign out_xnor=~(a^b);assign out_anotb=a&(~b);
endmodule

题目3:Arithmetic Circuits–Adder(加法器设计)
在这里插入图片描述

 module top_module (input [3:0] x, input [3:0] y, output [4:0] sum);assign sum = x + y;
endmodule

题目4:7420
74LS20芯片内部逻辑电路如下,由两个nand(与非门)组成。需要写个语句实现7420功能。
在这里插入图片描述

module top_module ( input p1a, p1b, p1c, p1d,output p1y,input p2a, p2b, p2c, p2d,output p2y );assign p1y=~(p1a&p1b&p1c&p1d);assign p2y=~(p2a&p2b&p2c&p2d);
endmodule

题目5:Truthtable1
在这里插入图片描述
按真值表实现电路。
如果数电学的不好不知道怎么办的话,可以用logisim,点击Project->Analyze Circuit->Table:
在这里插入图片描述
再点击Build Circuit就生成电路图了。
在这里插入图片描述

module top_module( input x3,input x2,input x1,  // three inputsoutput f   // one output
);assign f=((~x3)&x2)|(x1&x3);
endmodule

四、实验总结

本次实验掌握了状态机编程思想,事实上,状态机思想也更简易更容易想到。

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

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

相关文章

Python网络爬虫:从入门到实践

目录 什么是网络爬虫&#xff1f; 网络爬虫的工作原理 常用Python爬虫库 编写爬虫的步骤 实战示例 注意事项与道德规范 未来趋势 1. 什么是网络爬虫&#xff1f; 网络爬虫&#xff08;Web Crawler&#xff09;是一种自动化程序&#xff0c;通过模拟人类浏览行为&#x…

3D意识(3D Awareness)浅析

一、简介 3D意识&#xff08;3D Awareness&#xff09;主要是指视觉基础模型&#xff08;visual foundation models&#xff09;对于3D结构的意识或感知能力&#xff0c;即这些模型在处理2D图像时是否能够理解和表示出图像中物体或场景的3D结构&#xff0c;其具体体现在编码场景…

红包-算法

function resPackage(money,num){// 总金额 目前剩余总金额let sum money, currentsum moneylet res [];// 最大值for(let i 0;i<num-1;i){let n parseFloat((Math.random()*currentsum).toFixed(2)) //0-10的随机数if(n<0.1) n 0.1;if(n>sum…

最小二乘求解器lstsq,处理带权重和L2正则的线性回归

目录 代码注释版&#xff1a; 关键功能说明&#xff1a; torch.linalg.cholesky 的原理 代码示例 Cholesky 分解的应用 与 torch.cholesky 的区别 总结 代码注释版&#xff1a; from typing import Optionalimport torchdef lstsq(matrix: torch.Tensor, rhs: torch.Te…

AI辅助下基于ArcGIS Pro的SWAT模型全流程高效建模实践与深度进阶应用

目前&#xff0c;流域水资源和水生态问题逐渐成为制约社会经济和环境可持续发展的重要因素。SWAT模型是一种基于物理机制的分布式流域水文与生态模拟模型&#xff0c;能够对流域的水循环过程、污染物迁移等过程进行精细模拟和量化分析。SWAT模型目前广泛应用于流域水文过程研究…

DHT11数字温湿度传感器驱动开发全解析(下) | 零基础入门STM32第八十八步

主题内容教学目的/扩展视频DHT11芯片电路连接&#xff0c;手册分析。驱动程序&#xff0c;读出数据。能读出温湿度值即可。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、硬件接口与通信原理1.1 硬件连接拓扑1.2 单总线通信时序 二、驱动代码深度解析&#xff…

24、网络编程基础概念

网络编程基础概念 网络结构模式MAC地址IP地址子网掩码端口网络模型协议网络通信的过程&#xff08;封装与解封装&#xff09; 网络结构模式 C/S结构&#xff0c;由客户机和服务器两部分组成&#xff0c;如QQ、英雄联盟 B/S结构&#xff0c;通过浏览器与服务器进程交互&#xf…

【超详细】讲解Ubuntu上如何配置分区方案

Ubuntu 的分区方案 一、通用分区方案&#xff08;200G为例&#xff09; EFI系统分区&#xff08;仅UEFI启动模式需要&#xff0c;&#xff09; 大小&#xff1a;512MB–1GB类型&#xff1a;主分区&#xff08;FAT32格式&#xff09;挂载点&#xff1a;/boot/efi说明&#xff1…

函数的局部变量和全局变量的区分,Kimi的回答

这段代码的目的是通过计算 2**i 和 5**i 的首位数字&#xff0c;并将这两个首位数字的乘积添加到一个集合中&#xff0c;最终返回这些乘积的总和。下面是具体的解释和问题的分析。 sum_t的角色&#xff1a; sum_t 是一个累加器&#xff0c;用来存储所有独特的&#xff08;不重复…

RNN模型及NLP应用(5/9)——多层RNN、双向RNN、预训练

声明&#xff1a; 本文基于哔站博主【Shusenwang】的视频课程【RNN模型及NLP应用】&#xff0c;结合自身的理解所作&#xff0c;旨在帮助大家了解学习NLP自然语言处理基础知识。配合着视频课程学习效果更佳。 材料来源&#xff1a;【Shusenwang】的视频课程【RNN模型及NLP应用…

【3.软件工程】3.4 原型及相关模型

软件开发模型进化论&#xff1a;从原型驱动到混合模型的完整指南 &#x1f504; 一、模型进化关系全景图 #mermaid-svg-GcOFjt54gUs4oPeu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GcOFjt54gUs4oPeu .error-i…

硬件与软件的边界-从单片机到linux的问答详解

硬件与软件的边界——从单片机到 Linux 设备驱动的问答详解 在嵌入式开发和操作系统领域&#xff0c;经常会有人问&#xff1a; “如果一个设备里没有任何代码&#xff0c;硬件是不是依然会工作&#xff1f;例如&#xff0c;数据收发、寄存器数据存储、甚至中断触发&#xff…

玛卡巴卡的k8s知识点问答题(七)

25. 说明 Job 与 CronJob 的功能 Job 功能&#xff1a; 用于运行一次性任务&#xff08;批处理任务&#xff09;&#xff0c;确保一个或多个 Pod 成功完成任务后退出。 适用于数据处理、备份、测试等场景&#xff0c;任务完成后 Pod 不会自动重启。 特点&#xff1a; 任务…

【NLP 51、一些LLM模型结构上的变化】

目录 一、multi-head 共享 二、attention结构 1.传统的Tranformer结构 2.GPTJ —— 平行放置的Transformer结构 三、归一化层位置的选择 1.Post LN&#xff1a; 2.Pre-LN【目前主流】&#xff1a; 3.Sandwich-LN&#xff1a; 四、归一化函数选择 1.传统的归一化函数 LayerNorm …

VS+Qt配置QtXlsx库实现execl文件导入导出(全教程)

一、配置QtXlsx 1.1 下载解压QtXlsxWriter&#xff08;在github下载即可&#xff09; 网址&#xff1a;https://github.com/dbzhang800/QtXlsxWriter 1.2 使用qt运行 点击qtxlsx.pro运行QtXlsxWriter 选择DesktopQt51211MSVC201564bit编译器&#xff08;选择自己本地电脑qt…

Golang的文件处理优化策略

Golang的文件处理优化策略 一、Golang的文件处理优化策略概述 是一门效率高、易于编程的编程语言&#xff0c;它的文件处理能力也非常强大。 在实际开发中&#xff0c;需要注意一些优化策略&#xff0c;以提高文件处理的效率和性能。 本文将介绍Golang中的文件处理优化策略&…

自学-C语言-基础-数组、函数、指针、结构体和共同体、文件

这里写自定义目录标题 代码环境&#xff1a;&#xff1f;问题思考&#xff1a;一、数组二、函数三、指针四、结构体和共同体五、文件问题答案&#xff1a; 代码环境&#xff1a; Dev C &#xff1f;问题思考&#xff1a; 把上门的字母与下面相同的字母相连&#xff0c;线不能…

VMware+Ubuntu+VScode+ROS一站式教学+常见问题解决

目录 一.VMware的安装 二.Ubuntu下载 1.前言 2.Ubuntu版本选择 三.VMware中Ubuntu的安装 四.Ubuntu系统基本设置 1.中文更改 2.中文输入法更改 3. 辅助工具 vmware tools 五.VScode的安装ros基本插件 1.安装 2.ros辅助插件下载 六.ROS安装 1.安装ros 2.配置ROS…

PostgreSQL pg_repack 重新组织表并释放表空间

pg_repack pg_repack是 PostgreSQL 的一个扩展&#xff0c;它允许您从表和索引中删除膨胀&#xff0c;并可选择恢复聚集索引的物理顺序。与CLUSTER和VACUUM FULL不同&#xff0c;它可以在线工作&#xff0c;在处理过程中无需对已处理的表保持独占锁定。pg_repack 启动效率高&a…

5G_WiFi_CE_射频输出功率、发射功率控制(TPC)和功率密度测试

目录 一、规范要求 1、法规目录&#xff1a; &#xff08;1&#xff09;RF Output Power (2)Transmit Power Control (TPC) &#xff08;3&#xff09;Power Density 2、限值&#xff1a; 二、EIRP测试方法 &#xff08;1&#xff09;测试条件 &#xff08;2&#xff…