FPGA实验三:状态机的设计

目录

一、实验目的

二、实验要求

三、实验代码

1.design source文件部分代码

2.测试文件代码

四、实验结果及分析

1、引脚锁定

2、仿真波形及分析

(1)设计好序列检测器

(2)仿真波形(检测11010)

3、下载测试结果及分析(检测11011)

五、实验心得

1.关于实验设计过程中遇到的困难与解决心得

2.实验完成的心得


一、实验目的

(1)掌握序列发生和检测的工作原理;

(2)掌握时序电路中状态机的应用;

(3)掌握用Verilog语言实现复杂时序电路的设计过程。

二、实验要求

    设计序列发生和检测器:

(1)先实现串行序列发生器的设计,产生序列0111010011011010;再设计检测器,若检测到串行序列11010则输出为“1”,否则输出为“0”,并对其进行仿真和硬件测试,选择实验电路验证功能;

(2)下载程序后,可通过一个led灯串行输出序列信号,另用五个led灯来观测待检测序列,当11010五个全部出现在led上时,标识位灯M亮起,说明检测到“11010” 的信号,即符合设计要求。

产生的序列和检测的序列值仿真验收后老师现场指定11011后完成二次验收

发生器和检测器最好异步,以确保能检测到,可以将时钟经非门后再接入检测器。

三、实验代码

1.design source文件部分代码

(注:为了提高实验报告的美观性,在格式符合要求的情况下,我对所有的代码进行了高亮处理)

  1. `timescale 1ns / 1ps
    module zhuangtaiji(
    //模块输入输出
        input clk, // 时钟信号
        input set,
        input rst_n,
     output reg result,
     output reg seq_out, // 序列输出
        output reg led,//一整个序列输出后输出
        output reg [7:0]STate
        );
    reg [3:0] state; // 状态寄存器
    reg [30:0]fenpin = 0;
    reg din_vld;
    // 定义各种状态
    parameter S0 = 4'b0000;
    parameter S1 = 4'b0001;
    parameter S2 = 4'b0010;
    parameter S3 = 4'b0011;
    parameter S4 = 4'b0100;
    parameter S5 = 4'b0101;
    parameter S6 = 4'b0110;
    parameter S7 = 4'b0111;
    parameter S8 = 4'b1000;
    parameter S9 = 4'b1001;
    parameter S10 = 4'b1010;
    parameter S11 = 4'b1011;
    parameter S12 = 4'b1100;
    parameter S13 = 4'b1101;
    parameter S14 = 4'b1110;
    parameter S15 = 4'b1111;
    
    parameter ST0 = 8'b000_00000;
    parameter ST1 = 8'b001_00001;
    parameter ST2 = 8'b010_00011;
    parameter ST3 = 8'b011_00110;
    parameter ST4 = 8'b100_01101;
    parameter ST5 = 8'b101_11011;
    initial begin
     state<=S0;
     STate<=ST0;
    end
    // 下面是状态转移逻辑
    always @(posedge clk) begin
        if(~rst_n)//异步清零
            begin
            state<=S0;
            STate<=ST0;
            end
        if(set)
        begin
        //if(fenpin==50000000)
     begin
        case(state)
            S0: begin
                led <=0;
                state <= S1;
                seq_out = 1'b1;
                din_vld = seq_out;
            end
            S1: begin
                state <= S2;
                seq_out = 1'b1;
                din_vld = seq_out;
            end
            S2: begin
                state <= S3;
                seq_out = 1'b0;
                din_vld = seq_out;
            end
            S3: begin
                state <= S4;
                seq_out = 1'b1;
                din_vld = seq_out;
            end
            S4: begin
                state <= S5;
                seq_out = 1'b1;
                din_vld = seq_out;
            end
            S5: begin
                state <= S6;
                seq_out= 1'b0;
                din_vld = seq_out;
            end
            S6: begin
                state <= S7;
                seq_out = 1'b1;
                din_vld = seq_out;
            end
            S7: begin
                state <= S8;
                seq_out = 1'b1;
                din_vld = seq_out;
            end
            S8: begin
                state <= S9;
                seq_out = 1'b0;
                din_vld = seq_out;       
            end
            S9: begin
                state <= S10;
                seq_out = 1'b1;
                din_vld = seq_out;
            end
            S10: begin
                state <= S11;
                seq_out = 1'b1;
                din_vld = seq_out;
            end
            S11: begin
                state <= S12;
                seq_out = 1'b0;
                din_vld = seq_out;
            end
            S12: begin
                state <= S13;
                seq_out = 1'b1;
                din_vld = seq_out;
            end
            S13: begin
                state <= S14;
                seq_out = 1'b1;
                din_vld = seq_out;
            end
            S14: begin
                state <= S15;
                seq_out = 1'b0;
                din_vld = seq_out;
            end
            S15: begin
                state <= S0;
                seq_out = 1'b1;
                led <=1; 
                din_vld = seq_out;
            end
        endcase
    endmodule

2.测试文件代码

  1. `timescale 1ns / 1ps
    module testbench();
    reg  clk;
    reg  rst_n;
    reg set;
    wire result;
    wire led;
    wire seq_out;
    wire [7:0]STate;
    initial begin
     clk   = 1'b0;
     rst_n   = 1'b0;
     set = 1'b1;
     #100
     rst_n   = 1'b1;
    end
     
    always #10 clk = ~clk; //10MHz
    zhuangtaiji U(
    .clk(clk),
    .rst_n(rst_n),
    .set(set),
    .result(result),
    .led(led),
    .seq_out(seq_out),
    .STate(STate));
    end module

四、实验结果及分析

1、引脚锁定

set_property PACKAGE_PIN R2 [get_ports set]     

set_property IOSTANDARD LVCMOS33 [get_ports set]

set_property PACKAGE_PIN T1 [get_ports rst_n]     

set_property IOSTANDARD LVCMOS33 [get_ports rst_n]

set_property PACKAGE_PIN W5 [get_ports clk]       

set_property IOSTANDARD LVCMOS33 [get_ports clk]

create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk]

set_property PACKAGE_PIN L1 [get_ports seq_out] 

set_property IOSTANDARD LVCMOS33 [get_ports seq_out] 

set_property PACKAGE_PIN P1 [get_ports led] 

set_property IOSTANDARD LVCMOS33 [get_ports led] 

set_property PACKAGE_PIN U16 [get_ports result] 

set_property IOSTANDARD LVCMOS33 [get_ports result] 

2、仿真波形及分析

(1)设计好序列检测器

首先要理清不同信号输入时检测器应处于的工作状态 及下一时刻的位置,故先行绘制出序列检测状态转移图

(2)仿真波形(检测11010)

 

如上图所示,在使能端rst_n有效后后,出现序列“11010”时,输出位result显示了检测结果,图中所截选的序列出现了三次“11010”,result都进行了输出。验证了设计的正确性。

3、下载测试结果及分析(检测11011)

由于仿真检测的序列为11010,而上板子进行实验时老师指定的序列为11011

首先展示仿真波形

 

很明显,使能端有效后,当seq_out序列出现11011时,输出位result为1;不仅如此,由于序列11011011011……的特殊性,在同一段序列中,待检测序列会相隔很近的出现两次。观察波形可知,程序对两次检测序列都完成了检测和输出。

开发板实验结果:

第一个led灯显示序列,亮灯为1,熄灭为0;中间五个连续的led等表示的是测试序列的五个连续数字,最后一个led表示若检测到待检测序列,则进行输出。

如图,五个序列显示的是待检测序列11011,输出位亮灯,功能设计成功!

五、实验心得

1.关于实验设计过程中遇到的困难与解决心得

(1)序列检测器不能连续检测“11011”。 

解决方法:观察仿真结果,发现是因为每次成功检测完序列后检测器直接清零了,回看程序,是因为没有对检测完“11011”序列后的状态转移做出设计,只要补上这一段程序,并且正确转移状态,就可以连续检测序列并成功输出。

(2)检测成功的信号不能与 11011 的序列同时输出。 

解决方法:与原序列相比较不能同时输出,所以设计序列 s,比原序列晚一个时钟信号输入序列,就可以转换为并行输出。在仿真结果中将 s 与 m 放在一起,容易观察结果。 

2.实验完成的心得

本次实验接触到了一个新的内容——状态机的设计。理解状态机的转换,用状态机设计序列检测器,原理清晰设计具有条理,是一种很棒的设计方法,而且对状态转移图的绘制也十分有趣。除了一些代码设计上的问题,功能实现方面遇到的困难就是上述的两点,好在最后也得到了解决,也理解了这块内容为何如此设计。与直白的语言描述相比,一些附有技巧性的程序设计不仅大大缩短了代码长度,还能更好地完成目标功能,每次看见崭新的程序写法,都觉得自己学习的路途仍旧遥远。每一次实验的完成,都是一段新的学习旅程。之后的实验应该越来越复杂,涉及到的内容及功能实现也越来越多,但我们应仍保持最初的热情,勇于接受挑战、学习知识

总之状态机的设计实验是一项非常重要的电路设计实践项目,在这个实验中,我深刻地认识到了状态机对于硬件电路设计中的重要性,并且也加深了我对Verilog HDL编程语言的理解。

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫实战之原神公告获取

前言 好久不见了吧&#xff0c;博主最近也是成为了准高三&#xff0c;没有太多时间去创作文章了&#xff0c;所以这篇文章很有可能是高考前最后一篇文章了(也不一定&#x1f609;) 言归正传&#xff0c;本次文章主要讲解如何去爬取原神官网的公告(我不玩原神&#xff01;&…

英飞凌BLDC驱动芯片替换-屹晶微

EG12521替代IR2106&#xff0c;NCP5106 EG2003替代IR2003 EG2103替代IR2103、IRS2003&#xff0c;IRS2108 EG2104替代IR2104 EG2104D替代IR2104、IR2008、IR2004 EG2104M替代IR2104、IR2008、IR2004 EG2104S替代IR2104 EG2106替代IR2106、IR2101、FAN7382、IRS2005、NCP…

使用flask开启一个简单的应用

Flask是非常流行的 Python Web框架&#xff0c;它能如此流行&#xff0c;原因主要有如下几点: 。有非常齐全的官方文档,上手非常方便。 。有非常好的扩展机制和第三方扩展环境&#xff0c;.工作中常见的软件都会有对应的扩展。自己动手实现扩展也很容易。 。社区活跃度非常高。…

基于springboot的智慧养老系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

less 笔记

1 margin-left 之后有 margin: 0 导致margin-left 无效 --> 不能重复定义 .btn-group {margin-left: calc(100% - 350px);display: inline-block;margin: 0; // 重复定义 导致上面 没有效果padding: 0; } 2 一定要F12检查元素 看各个div的宽度是否太长 导致靠左靠右 计算不…

[SSM]Spring6基础

目录 一、Spring启示录 1.1OCP开闭原则 1.2DIP依赖倒置原则 1.3IoC控制反转 1.4DI依赖注入 二、Spring概述 2.1Spring简介 2.2Spring八大模块 2.3Spring特点 三、Spring的入门程序 3.1Spring的文件 3.2第一个Spring程序 3.3第一个Spring程序详细剖析 3.4Spring6启…

Vue绑定class样式

效果&#xff1a;指定变换成某种颜色 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>.basic{width: 400px;height: 100px;border: 1px solid black;}.happy{backg…

谈谈——互联网生活中的隐私保护

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

打包apk时出现Execution failed for task ‘:app:lintVitalRelease

程序可以正常运行&#xff0c;但是打包apk的时候报Execution failed for task ‘:app:lintVitalRelease导致打包失败&#xff0c;原因是执行lintVitalRelease失败了&#xff0c;存在错误。解决办法&#xff1a;在app模块的build.gradle的Android里面添加如下代码&#xff1a; l…

Nacos服务注册和配置中心(Config,Eureka,Bus)2

Nacos数据模型 Nacos领域模型,Namespace命名空间、Group分组、集群这些都是为了进行归类管理&#xff0c;把服务和配置文件进行归类&#xff0c;归类之后就可以实现一定的效果&#xff0c;比如隔离。对于服务来说&#xff0c;不同命名空间中的服务不能够互相访问调用 N…

Spring Boot 中的熔断器:原理和使用

Spring Boot 中的熔断器&#xff1a;原理和使用 什么是熔断器&#xff1f; 熔断器是一种用于处理分布式系统中故障的设计模式。它可以防止出现故障的服务对整个系统造成连锁反应。熔断器通过监控故障服务的调用情况&#xff0c;当故障服务出现问题时&#xff0c;熔断器会迅速…

MacOS使用USB接口与IPhone进行Socket通信

演示效果如下: 开源地址: GitHub - rsms/peertalk: iOS and Mac Cocoa library for communicating over USB 克隆源码: git clone https://github.com/rsms/peertalk.git 克隆后打开peertalk然后启动xcode工程 先启动MacOS服务端工程,再启动iOS客户端工程 客户端 服务端

MySQl数据库第八课-------SQL命令查询-------主要命脉

作者前言 欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com —————————————————————————————— 目录 查询数据 条件 逻辑运算符 模糊查询 范围查询 in 判断空 UNION 排序 聚合 分组&#xff1a;group by —————————…

C++中随机数的使用总结

随机数 rand() 随机数发生器 #include <stdio.h> #include <unistd.h> #include <iostream> #include <string>using namespace std;int main(int argc, char *argv[]) {cout << "this is main()" << endl;cout << rand…

弹性盒子布局

在弹性盒子布局&#xff08;flexbox&#xff09;中&#xff0c;存在两个关键概念&#xff1a;主轴&#xff08;main axis&#xff09;和交叉轴&#xff08;cross axis&#xff09;。 主轴是弹性盒子布局中的一个方向&#xff0c;它定义了弹性盒子的主要方向。在默认情况下&…

[MySQL]MySQL表中数据的增删查改(CRUD)

[MySQL]MySQL表中数据的增删查改(CRUD) 文章目录 [MySQL]MySQL表中数据的增删查改(CRUD)1. 新增数据1.1 单列插入1.2 多列插入1.3 插入否则更新1.4 替换 2. 基本查询数据2.1 全列查询2.2 指定列查询2.3 查询字段为表达式2.4 为查询结果指定别名2.5 结果去重2.6 where子句2.7 or…

flutter开发实战-多语言flutter intl

flutter开发实战-多语言flutter intl 之前做的应用中有用到多语言&#xff0c;一直没有整理&#xff0c;这里整理一下多语言设置流程。 使用的是Android studio 一、flutter_intl 插件 使用Android studio安装flutter_intl 插件&#xff0c;更新或者安装flutter_intl 插件后…

Django_自定义文件存储类并将图片上传到FastDFS

目录 将图片到FastDFS和浏览的流程图 使用自定义文件存储类 1、定义存储类 2、创建FastDFS的配置文件 3、修改settings.py配置 4、上传图片进行验证 4.1 定义一个包含ImageField字段的模型类 4.2 登录django的admin后台 4.3 上传图片 4.4 查看图片 源码等资料获取方…

webrtc源码阅读之视频RTP接收JitterBuffer

在音视频通信中&#xff0c;网络抖动和延迟是常见的问题&#xff0c;会导致音视频质量下降和用户体验不佳。为了解决这些问题&#xff0c;WebRTC引入了Jitter Buffer&#xff08;抖动缓冲区&#xff09;这一重要组件。Jitter Buffer是一个缓冲区&#xff0c;用于接收和处理网络…

树与图的(深度 + 广度)优先遍历

目录 一、树与图的存储1.树的特性2.图的分类3.有向图的储存结构 二、树与图的深度优先遍历的运用树的重心题意分析代码实现 三、树与图的广度优先遍历的运用图中点的层次题意分析代码实现 一、树与图的存储 1.树的特性 树是一种特殊的图,具有以下两个重要特性: 无环 树是一个…
最新文章