Verilog刷题笔记52

news2024/9/22 17:19:26

题目:
Fsm serial
In many (older) serial communications protocols, each data byte is sent along with a start bit and a stop bit, to help the receiver delimit bytes from the stream of bits. One common scheme is to use one start bit (0), 8 data bits, and 1 stop bit (1). The line is also at logic 1 when nothing is being transmitted (idle).
在这里插入图片描述
解题:

module top_module(
    input clk,
    input in,
    input reset,    // Synchronous reset
    output done
); 

    parameter s0=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6,s7=7,s8=8,s9=9,s10=10,s11=11;
    reg [3:0]state,next_state;
    always@(posedge clk)begin
        if(reset)
            state=s0;
        else
            state=next_state;
    end
    always@(*)begin
        case(state)
            s0:next_state=(in==0)?s11:s0;
            s11:next_state=s1;
            s1:next_state=s2;
            s2:next_state=s3;
            s3:next_state=s4;
            s4:next_state=s5;
            s5:next_state=s6;
            s6:next_state=s7;
            s7:next_state=s8;
            s8:next_state=(in==1)?s9:s10;
            s9:next_state=(in==0)?s11:s0;
            s10:next_state=(in==1)?s0:s10;
            default:next_state=s0;
        endcase
    end
    assign done=(state==s9)?1:0;
endmodule

结果正确
在这里插入图片描述
网络上看到的好的解题方法:
简单粗暴方法:
空闲状态IDLE,在接收到输入in=0,意味着传输的开始跳到START,接着跳到BIT1-8状态接,在BIT8再次判断in,如果接收到1,则此次传输结束跳到STOP,如果不是,意味这次传输数据无效,等接收到in=1,此次传输结束。
状态转移图:

module top_module(
    input clk,
    input in,
    input reset,    // Synchronous reset
    output done
); 
    parameter [3:0] IDLE  = 4'd0;
    parameter [3:0] START = 4'd1;
    parameter [3:0] BIT1  = 4'd2;
    parameter [3:0] BIT2  = 4'd3;
    parameter [3:0] BIT3  = 4'd4;
    parameter [3:0] BIT4  = 4'd5;
    parameter [3:0] BIT5  = 4'd6;
    parameter [3:0] BIT6  = 4'd7;
    parameter [3:0] BIT7  = 4'd8;
    parameter [3:0] BIT8  = 4'd9;
    parameter [3:0] STOP  = 4'd10;
    parameter [3:0] ERROR  = 4'd11;
    reg [3:0] state,nstate;
    
    always @(posedge clk)begin
        if(reset)begin
            state <= IDLE;
        end
        else begin
           state <= nstate; 
        end
    end
    
    always @(*)begin
       nstate = IDLE;
        case(state)
            IDLE: nstate = in? IDLE:START;
            START:nstate = BIT1;
            BIT1: nstate = BIT2;
            BIT2: nstate = BIT3;
            BIT3: nstate = BIT4;
            BIT4: nstate = BIT5;
            BIT5: nstate = BIT6;
            BIT6: nstate = BIT7;
            BIT7: nstate = BIT8;
            BIT8: nstate = in? STOP:ERROR;
            STOP: nstate = in? IDLE:START;
            ERROR: nstate = in? IDLE:ERROR;
            default: nstate = IDLE;
        endcase
    end
    
    assign done = (state == STOP);
endmodule

还有一种缩减状态机数量方法:对于中间过程很多的情况,我们无法全部写出,这时候可以使用循环整型变量来计数当前的时钟周期,从而描述复杂状态的转移。以下代码采用变量cnt记录过去的个时钟周期数,而不是使用八个状态描述接收过程。

module top_module(
    input clk,
    input in,
    input reset,    // Synchronous reset
    output done
); 

    localparam idle = 0;
    localparam start = 1;
    localparam data = 2;
    localparam stop =3;
    localparam error = 4;
    
    reg[2:0] state, next_state;
    reg[3:0] cnt;
    reg done_r;
    
//transition
    always@(*)begin
        case(state)
            idle:next_state=in?idle:start;
            start:next_state=data;
            data:next_state=(cnt==8)?(in?stop:error):data;
            stop:next_state=in?idle:start;
            error:next_state=in?idle:error;
        endcase
    end
    
//state
    always@(posedge clk)begin
        if(reset)
            state <= idle;
        else
            state <= next_state;
    end
    
//cnt
    always@(posedge clk)begin
        if(reset)
            cnt<=0;
        else
            case(next_state)
                start:cnt<=0;
                data:cnt<=cnt+1;
                default:cnt<=cnt;
            endcase
    end
    
//done_r
    always@(posedge clk)
        case(next_state)
            stop:done_r <= 1;
            default:done_r <= 0;
        endcase
    
    assign done = done_r;
    
endmodule

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

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

相关文章

如何打包CST仿真结果【电磁仿真基础教程】

本期介绍一个小的技巧关于打包仿真结果。很多时候我们需要把仿真的结果传递给同事&#xff0c;领导或者导师等看。如果把整个仿真文件夹压缩&#xff0c;很不方便。其实CST软件自带Archive功能能很方便的打包你想要的部分结果。 比如我们仿真完一个喇叭天线&#xff0c;结果中带…

ubuntu-linux ifconfig只有回环IP问题解决

问题如下图所示&#xff1a; 解决方案&#xff1a; sudo dhclient

uniapp - plugins的组件配置使用

点击进入到uniapp中mp-weixin的配置中 点击进入小程序的plugin的配置 在项目中&#xff0c;我们可引用插件的使用&#xff0c;例如一些快递100&#xff0c;点餐插件的业务引入 添加插件 在使用插件前&#xff0c;首先要在小程序管理后台的“设置-第三方服务-插件管理”中添加…

【论文阅读】SegNeXt:重新思考卷积注意力设计

《SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation》 原文&#xff1a;https://github.com/Visual-Attention-Network/SegNeXt/blob/main/resources/paper.pdf 源码&#xff1a;https://github.com/Visual-Attention-Network/SegNeXt 1、简介 …

图书管理系统900pf

TOC springboot533图书管理系统900pf 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0…

(十四)SpringCloudAlibaba-Nacos集群

前言 Nacos集群官方部署说明集群部署说明https://nacos.io/docs/latest/guide/admin/cluster-mode-quick-start/ 1.官方Nacos集群图 2.集群计划 因为本次的重点在于搭建Nacos集群&#xff0c;为了方便本次数据库我们使用单节点; 3.资源规划 节点IPPortnacos_8845127.0.0.18…

Java语聊大厅个人厅陪玩厅陪玩系统小程序源码

&#x1f389;【探索语聊新纪元】&#x1f389; —— 语聊大厅&#xff1a;你的专属社交乐园 &#x1f31f;【初识语聊大厅&#xff0c;开启无限可能】&#x1f31f; 嘿宝贝们&#xff0c;今天我要带你们走进一个超燃的社交新天地——语聊大厅&#xff01;这可不是普通的聊天…

链表OJ题——删除链表中等于给定值 val 的所有节点

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 删除链表中等于给定值 val 的所有节点 二、解题思路 三、解题代码

基于JavaWeb的本科生交流培养管理平台的设计与实现--论文pf

TOC springboot529基于JavaWeb的本科生交流培养管理平台的设计与实现--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和…

Linux搭建环境:从零开始掌握基础操作(二)

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 软件测试第一步就是搭建测试环境&#xff0c;如何搭建好测试环境&#xff0c;需要具备两项的基础知识&#xff1a; 1、Linux 命令: 软件测试第一个任务, 一般都需要进行环境搭建, 一部分&#xff0c;环境搭建内容是在服…

力扣:加一

文章目录 需求分析结尾 需求 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 示例 1&#xff1a…

C盘空间满了有什么招吗?

最好的答案就是Dism 第一步&#xff1a;下载软件 第二步&#xff1a;打开&#xff0c;如下&#xff1a; 第三步&#xff1a; 如何选择&#xff1f;如果不懂&#xff0c;就选默认就行了。 但是临时文件&#xff0c;就比较简单了&#xff0c;直接删除。

【前端】VUE动态引入组件 通过字符串动态渲染模板 动态生成组件

【前端】VUE动态引入组件 通过字符串动态渲染模板 应用场景&#xff1a; js增强 动态代码 扩展一类的 可以配合低代码平台等 灵活配置在线表单 在线列表等 适合灵活性 扩展性比较强的组件 VUE2 <template><div><textarea v-model"templateString"…

深度学习--时间序列预测方法总结

时间序列预测是分析和预测一系列时间顺序数据的方法。不同的时间序列预测方法在应用中根据数据特征和目标有不同的适用性。以下是时间序列预测方法的详细总结&#xff0c;包括概念、原理和Python实现代码。 1. 简单平均法 (Simple Average Method) 概念与原理&#xff1a; 简…

QT网络编程: 实现UDP通讯设置

目录 一.widget.ui界面设计 二.创建UDP通信 1.pro文件添加network模块。 2.添加对应头文件 3.定义槽函数&#xff0c;即与 UI 中的按钮点击事件相关联的函数 4.定义类的私有成员 5.关闭按钮 6.信息处理 7.绑定端口 8.发送信息 9.效果图 三.代码演示 1.widget.h 2.…

鸿蒙公共事件和通知

创建一个鸿蒙应用项目&#xff0c;在Index页面中创建一个按钮&#xff0c;点击该按钮&#xff0c;可以创建一个公共事件订阅者&#xff0c;可以订阅自定义公共事件&#xff08;事件名称为&#xff1a;“ncwu.harmonytest.event1”&#xff09;&#xff1b;创建一个Toggle组件&a…

解决 kill -9 PID 无法杀死 python 进程的问题:杀死 defunct 进程

文章目录 1. 一定要用 Ctrl C 结束程序2. 如何杀死后台僵尸 (defunct) 进程2.1 查看 defunct 进程2.2 杀死 defunct 进程的父进程 1. 一定要用 Ctrl C 结束程序 CtrlZ 和 CtrlC 都可以中断程序&#xff0c;但他们却有很大的差异&#xff0c;主要体现在&#xff1a; CtrlC: …

FSR超分笔记

最近因为工作原因&#xff0c;接触到了超分以及AMD家出的FSR算法&#xff0c;特意记录了解一下~ 前言 超分辨率是通过硬件或软件方法提高原有图像分辨率的方法&#xff0c;通过一幅或者多幅低分辨率的图像来得到一幅高分辨率的图像。 FSR是AMD提出的一种超分辨率方法&#x…

力扣面试经典算法150题:轮转数组

轮转数组 今天的题目是力扣面试经典150题中的数组的基础难度题&#xff1a;轮转数组。 题目链接&#xff1a;https://leetcode.cn/problems/rotate-array/description/?envTypestudy-plan-v2&envIdtop-interview-150 问题描述 给定一个整型数组 nums 和一个整数 k&…

微服务实战系列之玩转Docker(十一)

前言 在云原生的世界&#xff0c;经过十多年的进化&#xff0c;Docker已经形成了较完备的“后勤”保障服务和建立了荣辱与共的“密友圈”。用一句话可以概括&#xff1a;“Docker走遍天下&#xff0c;Swarm功不可没”。 因此&#xff0c;我们需尽可能做到对Swarm有充分的认识…