FPGA实验三:状态机的设计

news2025/1/20 19:25:02

目录

一、实验目的

二、实验要求

三、实验代码

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.coloradmin.cn/o/718929.html

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

相关文章

Linux-vim与gdb与make/makefile

三个模式&#xff1a;命令模式 文本模式 底行模式 yum :instell 安装 remove 卸载 gcc -o执行后生成文件命名 gcc 1.c -o fst.out -E预编译 -S汇编 -c生成机器码 Linux 中 静态库&#xff1a;.a&#xff1b;动态库&#xff1a;.so Linux默认动态库&#xff0c;…

Redis的安装,启动,关闭

一&#xff0c;redis安装linux 1&#xff0c;安装gcc环境 yum -y install gcc-c2,上传压缩包到/usr/soft目录&#xff0c;并解压 cd /soft tar -xvf redis-3.2.11.tar.gz3&#xff0c;进入redis-5.0.7目录&#xff0c;使用make命令编译redis [rootlocalhost soft]# cd re…

【DBA课程-笔记】第1章:MongoDB数据库入门

一、MongoDB 概览及新特性 1. MongoDB 简介 目前最流行的NoSQL数据库&#xff08;NO.1&#xff09;MongoDB是一个基于分布式文件存储的数据库&#xff0c;由C语言编写&#xff0c;特点是高性能、易部署、易使用、存储数据非常方便&#xff0c;旨在为Web应用提供可扩展的高性能…

企业该如何防止数据泄漏问题

关键词&#xff1a;企业网盘、知识文档管理系统、群晖NAS、数据安全 根据Verizon《2022 数据泄露调查报告》显示&#xff0c;2022年数据泄露事件中82%的违规行为涉及人为因素&#xff0c;勒索软件泄露事件增加了13%&#xff0c;超过过去五年的总和&#xff0c;数据安全已变成关…

【JUC-7】ReentrantLock (可重入锁)基础

ReentrantLock (可重入锁) ReentrantLock实现了Lock接口, 内部通过继承AQS, 实现了一个同步器. 可以通过同步器来创建Condition条件变量, 可以用作容器, 存放不同条件的等待线程. 说明ReentrantLock与AQS的关系 类图: 相对于synchronized, 都支持可重入. 它还具备如下特点: …

【算法练习】24:凯撒密码

一、凯撒密码介绍&#xff1a; 采用替换的方式对英文字母进行处理&#xff0c;将每一个英文字符循环替换为字母表序列中该字符的后面的第三个字符&#xff0c;即循环右移3位。 明文字母表&#xff1a;ABCDEFGHIJKLMNOPQRSTUVWXYZ 密文字母表&#xff1a;DEFGHIJKLMNOPQRSTUV…

微信小程序如何读取本地云存储txt数据,避免乱码

第一步 找到你的txt文件&#xff0c;重命名为json文件 第二步 上传到云存储中&#xff0c;获取File ID 第三步 编写js代码 相关技术文档&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.readFile.html onShow(){wx.cloud.d…

《Redis 核心技术与实战》课程学习笔记(三)

高性能 IO 模型&#xff1a;为什么单线程 Redis 能那么快&#xff1f; Redis 是单线程&#xff0c;主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的&#xff0c;这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能&#xff0c;比如持久化、异步删…

CDS Core Data Services S4 CDS view--2

7.2 怎么加注释 首先要看懂注释&#xff0c;comparefilter 一般都是true,这样在association 里的join只被验证一次&#xff0c;如果是FALSE就会不停的被验证。 preservekey, 验证和数据库表的key是否一致。 authorizationcheck, 需要验证权限。不过我们没有设access control…

STM32F1 GPIO 简介

GPIO 是控制或者采集外部器件的信息的外设&#xff0c;即负责输入输出。它按组分配&#xff0c;每组 16 个 IO 口&#xff0c;组数视芯片而定。STM32F103ZET6 芯片是 144 脚的芯片&#xff0c;具有 GPIOA、GPIOB、GPIOC、 GPIOD、GPIOE、GPIOF 和 GPIOG 七组 GPIO 口&#xff0…

13---罗马数字转整数

罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xf…

【DBA课程-笔记】MongoDB入门到云上开发

课程目的&#xff1a;成为专业MongoDB的DBA nosql第一&#xff1a;MongoDB 一、讲师&#xff1a; 二、课程目录 第1章&#xff1a;MongoDB数据库入门 第2章&#xff1a;MongoDB数据数据查询与分析 第3章&#xff1a;MongoDB数据库核心知识 第4章&#xff1a;MongoDB数据库管…

时间序列预测 | Matlab基于粒子群算法优化门控循环单元(PSO-GRU)的时间序列预测,PSO-GRU时间序列预测,单列数据集

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列预测 | Matlab基于粒子群算法优化门控循环单元(PSO-GRU)的时间序列预测,PSO-GRU时间序列预测,单列数据集。 优化参数为学习率,隐藏层节点个数,正则化参数,要求2020b及以上版本&#

Redhat7.6安装mysql5.7

环境准备&#xff1a;硬盘剩余空间最少8G,内存剩余最少2G Mysql官网下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.7.html 在Mysql官网下载列表中选择需要安装的版本: RedHat7.6安装MySQL5.7 安装之前&#xff0c;先要保证系统环境是干净的&#xff0c;不能存…

Dual In-Line Package(双列直插式封装)和Pin Grid Array Package(针栅阵列插入式封装)

DIP封装示意图 1.Dual In-Line Package&#xff08;双列直插式封装&#xff09; DIP的详细介绍&#xff1a; 1.封装形式&#xff1a;DIP是一种插件式封装&#xff0c;它由一个狭长的塑料或陶瓷封装体组成&#xff0c;具有在两侧排列的引脚。引脚通常是分布均匀的&#xff0c…

17. 订单金额趋势分析

文章目录 题目需求思路一实现一实现二&#xff1a;使用 over(range)学习链接题目来源 题目需求 查询截止每天的最近3天内的订单金额总和以及订单金额日平均值&#xff0c;保留两位小数&#xff0c;四舍五入。 最近三天 的业务逻辑通常是基于当天往前推2天 期望结果如下&#x…

Kepware.KEPServer安装

1.1 Kepware.KEPServer安装 1.1.1 解压并安装 首先解压并安装KEPServerEX v4.500.465.zip,右键点击KEPServer执行文件进行安装,如图2-2-14所示, 图2-2-14 2) 运行KEPServer安装文件之后出现如图2-2-15所示:点击Next继续。 图2-2-15 3) 选择I accept the tems of the lice…

Keras-5-深度学习用于文本和序列-处理文本数据

深度学习用于文本和序列 说明: 本篇学习记录为&#xff1a;《Python 深度学习》第6章第1节&#xff08;处理文本数据&#xff09; 知识点: 深度学习处理文本或序列数据的基本方法是&#xff1a;循环神经网络 (recurrent neural network) 和 一维卷积神经网络 (1D convert)&…

Python中怎样用索引和切片取出字符串片段?

Python 语言为字符串中的元素编号&#xff0c;以实现对字符串中的单个字符或字符片段的索引。按照不同的方向&#xff0c;索引分为正向索引和逆向索引。假设字符串的长度为L&#xff0c;正向索引中字符串的字符编号从左至右由0递增为L-1&#xff0c;逆向索引中字符串的字符编号…

【雕爷学编程】Arduino动手做(151)---S12SD紫外线模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…