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 beginstate<=S0;STate<=ST0;
    end
    // 下面是状态转移逻辑
    always @(posedge clk) beginif(~rst_n)//异步清零beginstate<=S0;STate<=ST0;endif(set)begin//if(fenpin==50000000)begincase(state)S0: beginled <=0;state <= S1;seq_out = 1'b1;din_vld = seq_out;endS1: beginstate <= S2;seq_out = 1'b1;din_vld = seq_out;endS2: beginstate <= S3;seq_out = 1'b0;din_vld = seq_out;endS3: beginstate <= S4;seq_out = 1'b1;din_vld = seq_out;endS4: beginstate <= S5;seq_out = 1'b1;din_vld = seq_out;endS5: beginstate <= S6;seq_out= 1'b0;din_vld = seq_out;endS6: beginstate <= S7;seq_out = 1'b1;din_vld = seq_out;endS7: beginstate <= S8;seq_out = 1'b1;din_vld = seq_out;endS8: beginstate <= S9;seq_out = 1'b0;din_vld = seq_out;       endS9: beginstate <= S10;seq_out = 1'b1;din_vld = seq_out;endS10: beginstate <= S11;seq_out = 1'b1;din_vld = seq_out;endS11: beginstate <= S12;seq_out = 1'b0;din_vld = seq_out;endS12: beginstate <= S13;seq_out = 1'b1;din_vld = seq_out;endS13: beginstate <= S14;seq_out = 1'b1;din_vld = seq_out;endS14: beginstate <= S15;seq_out = 1'b0;din_vld = seq_out;endS15: beginstate <= S0;seq_out = 1'b1;led <=1; din_vld = seq_out;endendcase
    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 beginclk   = 1'b0;rst_n   = 1'b0;set = 1'b1;#100rst_n   = 1'b1;
    endalways #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.hqwc.cn/news/7437.html

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

相关文章

MySQL数据库第三课 ------简单命令再进阶-------成为大牛必备

作者前言 欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com ———————————————————————————————— 目录 命令的简单介绍 1.重定向命令 2.cat 3. ln 4.grep 5.通配符 6.find 7.tar —————————————————————…

国金QMT量化交易系统的Bug及应对策略

国金QMT量化交易系统中的 账号成交状态变化主推 deal_callback() &#xff0c; 当账号成交状态有变化时&#xff0c;这个函数被客户端调用。 我的策略是&#xff0c;在handlebar()里面挂单&#xff0c;等待成交&#xff0c;而判断成交的方式是根据系统主推deal_callback()通知…

前置声明、源文件include、编译链接顺序问题

TestB.h (前置声明&#xff0c;无需在源文件include)重点&#xff1a; 1.前置声明用在指针变量使用&#xff0c;无需在头文件或源文件include 2.继承或者普通变量在头文件使用的时候(除非所有的编译顺序都正确&#xff0c;才能在源文件include)&#xff0c;最好不要在源文件i…

vue项目使用自定义域名开启本地服务(ip地址和域名映射)

前言 有的时候&#xff0c;我们直接用script请求需要在同一个顶级&#xff08;一级&#xff09;域名下才可以拿到数据。 本地服务在开启时一般都是localhost&#xff0c;或者带ip。如果想要自定义域名访问本地服务&#xff0c;需要做以下配置。 ip地址和域名映射 在域名请求…

Java面试Day16

1.Dubbo 是什么&#xff1f;是否了解过它的架构设计&#xff1f; Dubbo官网&#xff1a;Apache Dubbo Dubbo是一个高性能、轻量级的开源Java RPC框架&#xff0c;它提供了完整的RPC协议栈&#xff0c;包括服务发布、服务引用、负载均衡、容错、服务治理和服务监控等功能&#…

Linux 学习记录45(C++篇)

Linux 学习记录45(C篇) 本文目录 Linux 学习记录45(C篇)一、纯虚函数和抽象类1. 纯虚函数2. 抽象类 二、C中的异常处理1. 抛出异常2. 处理/捕获异常 三、模板(template)1. 模板函数(1. 模板函数的定义和调用(2. 模板函数需要显性调用的时机 2. 模板类3. 模板函数和模板类实现的…

只出现一次的数字

题目链接 只出现一次的数字 题目描述 注意点 1 < nums.length < 30000-30000 < nums[i] < 30000除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次 解答思路 最初想到使用一种数据结构将元素存储起来&#xff0c;但是空间复杂度为O(n)&#xff0…

kafka的broker和replica和文件存储

zookeeper中存储的kafka信息 /brokers/ids&#xff0c;记录存在的服务器id/brokers/topics/test/partitions/0/state&#xff0c;记录leader和可用副本服务器/comsumers&#xff0c;0.9版本之前存储消费者的offset信息&#xff0c;但是会产生zookeeper和broker的跨节点通信/co…

MyBatis—操作数据库

MyBatis &#x1f50e;前置铺垫创建数据库MyBatis 的执行流程创建对应流程 &#x1f50e;MyBatis—查询查询用户信息执行流程创建实体类创建 Interface 与 xml在 xml 中编写 SQL 语句模拟执行流程 &#x1f50e;单元测试定义优点执行单元测试引入依赖生成单元测试编写代码Asser…

计讯物联5G数采仪助力打造化工园区企业工况监测系统

项目背景 随着我国化工行业的快速发展&#xff0c;化工园区已成为化工行业发展的重要阵地&#xff0c;化工企业聚集&#xff0c;危险化学品安全风险集中&#xff0c;安全规范问题逐渐成为行业关注的焦点。然而&#xff0c;我国化工园区发展水平发展参差不齐&#xff0c;尤其是…

吴恩达ChatGPT《Building Systems with the ChatGPT API》笔记

1. 课程介绍 使用ChatGPT搭建端到端的LLM系统 本课程将演示使用ChatGPT API搭建一个端到端的客户服务辅助系统&#xff0c;其将多个调用链接到语言模型&#xff0c;根据前一个调用的输出来决定使用不同的指令&#xff0c;有时也可以从外部来源查找信息。 课程链接&#xff1a…

SpringBoot整合RabbitMQ实现消息延迟队列(含源码)

环境依赖 SpringBoot 3.1.0 JDK 17 前期准备 安装MQ: liunxdockerrabbitmq安装延迟队列插件 实例 实现延迟队列的一种方式是在 RabbitMQ 中使用消息延迟插件&#xff0c;这个插件可以让你在消息发送时设置一个延迟时间&#xff0c;超过这个时间后消息才会被消费者接收到…