Verilog零基础入门(边看边练与测试仿真)-状态机-笔记(7-10讲)

文章目录

  • 第七讲
  • 第八讲
  • 第九讲
  • 第十讲

第七讲

1、最简单的状态机-三角波发生器
在这里插入图片描述

1、两种状态的代码:

//最简单的状态机,三角波发生器;
`timescale 1ns/10ps
module tri_gen(clk,res,d_out);
input             clk;
input             res;
output[8:0]       d_out;reg               state;//主状态机寄存器
reg[8:0]          d_out;always@(posedge clk or negedge res )
if(~res)beginstate<=0;d_out<=0;
end
else begincase(state)0://上升;begind_out<=d_out+1;if(d_out==299)beginstate<=1;endend1://下降begind_out<=d_out-1;if(d_out==1)beginstate<=0;endend	endcase
endendmodule//---------testbench of tri_gen-----
module tri_gen_tb;
reg               clk,res;
wire[8:0]         d_out;
tri_gen U1(.clk(clk),.res(res),.d_out(d_out));initial beginclk<=0;res<=0;#17   res<=1;#8000 $stop;
endalways #5 clk<=~clk;
endmodule

仿真结果:
另一种波形查看方法
在这里插入图片描述

在这里插入图片描述
2、四种状态的代码

//2023-0913,time
//最简单的状态机,三角波发生器;
`timescale 1ns/10ps
module tri_gen(clk,res,d_out);
input             clk;
input             res;
output[8:0]       d_out;reg[1:0]          state;//主状态机寄存器
reg[8:0]          d_out;reg[7:0]          con;//计数器,记录平顶周期个数always@(posedge clk or negedge res )
if(~res)beginstate<=0;d_out<=0;con<=0;
end
else begincase(state)0://上升;begind_out<=d_out+1;if(d_out==299)beginstate<=1;endend1://平顶beginif(con==200)beginstate<=2;con<=0;endelse begincon<=con+1;end	end2://下降begind_out<=d_out-1;if(d_out==1)beginstate<=3;endend	3://平顶beginif(con==200)beginstate<=0;con<=0;endelse begincon<=con+1;end	endendcase
endendmodule//---------testbench of tri_gen-----
module tri_gen_tb;
reg               clk,res;
wire[8:0]         d_out;
tri_gen U1(.clk(clk),.res(res),.d_out(d_out));initial beginclk<=0;res<=0;#17    res<=1;#40000 $stop;
endalways #5 clk<=~clk;
endmodule

仿真波形:
在这里插入图片描述
3、如果state定义的[1:0],也就是有四种状态,那么如果有没用到的状态,应该用default写完全。

第八讲

1、串口数据接收
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码:

//2023-09-18,time
//串口数据接收
`timescale 1ns/10ps
module UART_RXer(clk,res,RX,data_out,en_data_out);
input                    clk;
input                    res;
input                    RX;
output[7:0]              data_out;//接受字节输出;
output                   en_data_out;//输出势能;reg[7:0]                 data_out;
reg[7:0]                 state;//主状态机;
reg[12:0]                con;//用于计算比特宽度;
reg[3:0]                 con_bits;// 用于计算比特数;reg                      RX_delay;//RX的延时;
reg                      en_data_out;
always@(posedge clk or negedge res)
if(~res)beginstate<=0;con<=0;con_bits<=0;RX_delay<=0;en_data_out<=0;data_out<=0;
end
else beginRX_delay<=RX;case(state)0://等空闲:beginif(con==5000-1)begincon<=0;endelse begincon<=con+1;endif(con==0)beginif(RX)begincon_bits<=con_bits+1;endelse begincon_bits<=0;endendif(con_bits==12)beginstate<=1;end	end1://等起始位beginen_data_out<=0;if(~RX&RX_delay)beginstate<=2;endend2://收最低位b0;beginif(con==7500-1)begincon<=0;data_out[0]<=RX;state<=3;endelse begincon<=con+1;endend3://收最低位b1;beginif(con==5000-1)begincon<=0;data_out[1]<=RX;state<=4;endelse begincon<=con+1;endend4://收最低位b2;beginif(con==5000-1)begincon<=0;data_out[2]<=RX;state<=5;endelse begincon<=con+1;endend5://收最低位b3;beginif(con==5000-1)begincon<=0;data_out[3]<=RX;state<=6;endelse begincon<=con+1;endend6://收最低位b4;beginif(con==5000-1)begincon<=0;data_out[4]<=RX;state<=7;endelse begincon<=con+1;endend7://收最低位b5;beginif(con==5000-1)begincon<=0;data_out[5]<=RX;state<=8;endelse begincon<=con+1;endend8://收最低位b6;beginif(con==5000-1)begincon<=0;data_out[6]<=RX;state<=9;endelse begincon<=con+1;endend9://收最低位b7;beginif(con==5000-1)begincon<=0;data_out[7]<=RX;state<=10;endelse begincon<=con+1;endend10://产生使能信号脉冲;beginen_data_out<=1;state<=1;enddefault://beginstate<=0;con<=0;con_bits<=0;en_data_out<=0;endendcase
endendmodule//-------testbench of UART_RXer-------
module UART_RXer_tb;
reg                      clk,res;
wire                     RX;
wire[7:0]                data_out;
wire                     en_data_out;reg[25:0]                RX_send;//里面装有串口字节发送数据
assign                   RX=RX_send[0];//连接RX;reg[12:0]                con;UART_RXer UART_RXer(		 //同名例化;clk,res,RX,data_out,en_data_out);
initial beginclk<=0;res<=0;RX_send<={1'b1,8'haa,1'b0,16'hffff};con<=0;#17              res<=1;#4000000         $stop;
endalways #5 clk<=~clk;always@(posedge clk) beginif(con==5000-1)begincon<=0;endelse begincon<=con+1;endif(con==0)beginRX_send[24:0]<=RX_send[25:1];RX_send[25]<=RX_send[0];endend
endmodule

仿真波形:
在这里插入图片描述
小结:
在这里插入图片描述

第九讲

1、串口数据发送
在这里插入图片描述
在这里插入图片描述
代码:

//2023-09-18,time
//串口发送模块
`timescale 1ns/10ps
module UART_TXer(clk,res,data_in,en_data_in,TX,rdy);
input                       clk;
input                       res;
input[7:0]                  data_in;//准备发送的数据
input                       en_data_in;//发送使能
output                      TX;
output                      rdy;//空闲标志,0表示空闲reg[3:0]                    state;//主状态机寄存器;
reg[9:0]                    send_buf;//发送寄存器;
assign                      TX=send_buf[0];//连接TX;reg[9:0]                    send_flag;//用于判断右移结束;reg[12:0]                   con;//用于计算波特周期;
reg                         rdy;always@(posedge clk or negedge res)
if(~res)beginstate<=0;send_buf<=1;con<=0;send_flag<=10'b10_0000_0000;rdy<=0;
end
else begincase(state)0://等待使能信号beginif(en_data_in)beginsend_buf={1'b1,data_in,1'b0};send_flag<=10'b10_0000_0000;rdy<=1;state<=1;endend1://串口发送,寄存器右移;beginif(con==5000-1)begincon<=0;endelse begincon<=con+1;endif(con==5000-1)beginsend_buf[8:0]<=send_buf[9:1];send_flag[8:0]<=send_flag[9:1];endif(send_flag[0])beginrdy<=0;state<=0;endendendcase
end
endmodule//------testbench of UART_TXer--------
module UART_TXer_tb;
reg                        clk,res;
reg[7:0]                   data_in;
reg                        en_data_in;
wire                       TX;
wire                       rdy;
UART_TXer UART_TXer(clk,res,data_in,en_data_in,TX,rdy);initial beginclk<=0;res<=0;data_in<=8'h7f;en_data_in<=0;#17	        res<=1;#30          en_data_in<=1;#10          en_data_in<=0;#2000000         $stop;
endalways #5 clk=~clk;endmodule

仿真波形:
在这里插入图片描述
小结:
在这里插入图片描述

第十讲

1、串口指令处理器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码:

//2023-09-19,time
//指令处理器
module cmd_pro(clk,res,din_pro,en_din_pro,dout_pro,en_dout_pro,rdy);
input                          clk;
input                          res;
input[7:0]                     din_pro;//指令和数据输入端口;
input                          en_din_pro;//输入使能;
output[7:0]                    dout_pro;//指令执行结果;
output                         en_dout_pro;//指令输出使能;
output                         rdy;//串口发送模块空闲标志,0表示空闲;parameter                      add_ab=8'h0a;
parameter                      sub_ab=8'h0b;
parameter                      and_ab=8'h0c;
parameter                      or_ab =8'h0d;reg[2:0]                       state;//主状态机寄存器
reg[7:0]                       cmd_reg,A_reg,B_reg;//存放指令、A和B;
reg[7:0]                       dout_pro;
reg                            en_dout_pro;always@(posedge clk or negedge res)begin
if(~res)beginstate<=0;cmd_reg<=0;A_reg<=0;B_reg<=0;dout_pro<=0;en_dout_pro<=0;
end
else begincase(state)0://等指令;beginen_dout_pro<=0;if(en_din_pro)begincmd_reg<=din_pro;state<=1;endend1://收Abeginif(en_din_pro)beginA_reg<=din_pro;state<=2;endend2://收Bbeginif(en_din_pro)beginB_reg<=din_pro;state<=3;endend3://指令译码和执行;beginstate<=4;//指令译码一个时钟周期就可以,所以可以没条件case(cmd_reg)add_ab: begin dout_pro<=A_reg+B_reg; endsub_ab: begin dout_pro<=A_reg-B_reg; endand_ab: begin dout_pro<=A_reg&B_reg; endor_ab:  begin dout_pro<=A_reg|B_reg; endendcaseend4://发送指令执行结果;beginif(~rdy)beginen_dout_pro<=1;state<=0;endenddefault://beginstate<=0;en_dout_pro<=0;endendcase
end
endmodule
//2023-09-19,time
//串口指令处理器;
`timescale 1ns/10ps
module UART_top(clk,res,RX,TX);
input                 clk;
input                 res;
input                 RX;
output                TX;wire[7:0]             	 din_pro;
wire                  	 en_din_pro;
wire[7:0]             	 dout_pro;
wire                   	 en_dout_pro;
wire                     rdy;UART_RXer UART_RXer(		 .clk(clk),.res(res),.RX(RX),.data_out(din_pro),.en_data_out(en_din_pro));UART_TXer UART_TXer(		 .clk(clk),.res(res),.data_in(dout_pro),.en_data_in(en_data_),.TX(TX),.rdy(rdy));cmd_pro cmd_pro(.clk(clk),.res(res),.din_pro(din_pro),.en_din_pro(en_din_pro),.dout_pro(dout_pro),.en_dout_pro(en_dout_pro),.rdy(rdy));													
endmodule   //-------testbench of UART_top------
module UART_top_tb;
reg                       clk,res;
wire                      RX;
wire                      TX;reg[45:0]                RX_send;//里面装有串口字节发送数据
assign                   RX=RX_send[0];//连接RX;reg[12:0]                con;UART_top UART_top(clk,res,RX,TX);initial beginclk<=0;res<=0;RX_send<={1'b1,8'h09,1'b0,1'b1,8'h06,1'b0,1'b1,8'h0a,1'b0,16'hffff};con<=0;#17              res<=1;#4000000         $stop;
endalways #5 clk<=~clk;always@(posedge clk) beginif(con==5000-1)begincon<=0;endelse begincon<=con+1;endif(con==0)beginRX_send[44:0]<=RX_send[45:1];RX_send[45]<=RX_send[0];endend
endmodule

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

小结:
在这里插入图片描述

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

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

相关文章

【Linux】【网络】传输层协议:TCP

文章目录 TCP 协议1. TCP 协议段格式2. TCP 报头解析3. TCP 的可靠性4. 面向字节流5. 粘包问题6. 连接队列维护 TCP 的 确认应答机制TCP 的 超时重传机制TCP 的 三次握手TCP 的 四次挥手setsockopt 函数&#xff1a;设置套接字选项&#xff0c;解决 TIME_WAIT 状态引起的 bind …

在B站上如何把已经上传的视频做成合集?

参考视频: 【在B站上如何把已经上传的视频做成合集&#xff1f;】 https://www.bilibili.com/video/BV1Uf4y1G7eR/?share_sourcecopy_web&vd_source8af85e60c2df9af1f0fd23935753a933 【B站投稿视频合集的几种方式最全攻略】 https://www.bilibili.com/video/BV1jZ4y1h7…

SpringCloud 学习(三)Ribbon 和 Feign

4. Netflix.Ribbon 4.1 简介 (1) 概念 Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡工具。 (2) 负载均衡&#xff08;LB&#xff1a;LoadBalance&#xff09;和集群架构 应用集群&#xff1a;将同一应用部署到多台机器上&#xff0c;组成处理集群&…

Android逆向技术高阶大法

原文链接 Android逆向技术高阶大法 安卓应用是一个客户端&#xff0c;与传统软件类似&#xff0c;需要把软件打包&#xff0c;然后通过某种渠道&#xff08;应用市场&#xff09;分发给用户&#xff0c;这是常规的发布方式&#xff0c;它的更新节奏很慢&#xff0c;从你在应用…

Docker 容器监控之CAdvisor+InfluxDB+Granfana

是什么 一句话&#xff1a;CAdvisor监控收集InfluxDB存储数据Granfana展示图表 CAdvisor InfluxDB Granfana 总结 容器编排CIG CIG CAdvisorInfluxDBGranfana 1、新建目录 2、新建docker-compose.yml文件 version: 3.1volumes:grafana_data: {}services:influxdb:image: t…

C语言实现八种功能的通讯录(添加、删除、查找、修改、显示、排序、退出、清空)

通讯录功能概要及前提说明 此通讯录利用C语言完成&#xff0c;可以实现八种功能的通讯录&#xff08;添加、删除、查找、修改、显示、排序、退出、清空&#xff09; 代码由三部分组成&#xff0c;为什么要写成三部分而不写成一部分可以参考我以前的博客&#xff0c;如下&…

【PMP/软考】软件需求的三个主要层次:业务需求、用户需求和功能需求解释及实例解析

简述 当进行需求分析时&#xff0c;通常着重考虑三个主要层次&#xff1a;业务需求、用户需求和功能需求。业务需求关注项目与组织战略目标的一致性&#xff0c;用户需求明确最终用户的期望&#xff0c;而功能需求定义具体的系统功能和特性。这三个层次为项目管理和软件工程提…

基于改进莱维飞行和混沌映射的粒子群优化BP神经网络预测股票价格研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

[架构之路-223]:数据管理能力成熟度评估模型DCMM简介

目录 一、背景 二、评估依据 三、评估内容 四、主要适用对象 五、能力等级 六、不同层次的文件&#xff1a; 一、背景 信息技术与经济社会的交汇融合引发了数据爆发式增长。数据蕴含着重要的价值&#xff0c;已成为国家基础性战略资源&#xff0c;正日益对全球生产、流通…

更适合程序员体质的PPT制作工具——Slidev

Slidev简介 Slidev是什么 Slidev是一款基于Vue.js的现代化幻灯片制作工具&#xff0c;它可以帮助用户快速、高效地制作出美观、专业的幻灯片。 目前市面上有很多功能丰富的、通用的、所见即所得的幻灯片制作工具&#xff0c;例如 微软 PowerPoint 或 苹果 Keynote. 它们在制…

tp8 Editor.md

Editor.md - 开源在线 Markdown 编辑器 放于public文件夹下 html代码&#xff1a; <div class"layui-col-md12" id"content"><textarea name"content" placeholder"详情" class"layui-textarea">{notempty nam…

buuctf web [极客大挑战 2019]Upload

上传头像&#xff0c;上传一下&#xff0c;看看能不能成功 抓包&#xff0c;抓取上传时的数据,看看限制条件 改两个地方&#xff0c;符合上传图片的要求&#xff0c;上传试试 一句话木马的<?被扳了 改一下木马的格式 <script language"php">eval($_POST[cm…

Tomcat 开启远程调试

Tomcat 部署的 war包工程开启远程调试 Linux服务器下&#xff0c;编辑Tomcat bin 目录下的 startup.sh 文件 vim startup.sh在第一行加入&#xff1a;(不换行&#xff0c;在同一行) declare -x CATALINA_OPTS"-server -Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:…

Redis 集群搭建教程

一、介绍 Redis 集群有着高可用、易扩展、更好的性能等优势&#xff0c;本文主要是实战搭建一个三主三从的 Redis 集群。 正常来说&#xff0c;搭建 Redis 集群需要 6 台服务器。为了简单一点&#xff0c;本文通过一台服务器&#xff0c;6 个端口&#xff0c;搭建一个 Redis …

孜然单授权系统V1.0[免费使用]

您还在为授权系统用哪家而发愁&#xff1f;孜然单授权系统为您解决苦恼&#xff0c;本系统永久免费。 是的&#xff0c;还是那个孜然&#xff0c;消失了一年不是跑路了是没有空&#xff0c;但是这些都是无关紧要的&#xff0c;为大家带来的孜然单授权系统至上我最高的诚意&…

数据安全态势管理:什么是事实,什么是虚构?

考虑到组织存储大量数据的日益复杂的云环境&#xff0c;数据安全态势管理 ( DSPM )的兴起并不令人意外。使组织能够全面了解云数据资产和敏感数据的安全状况的流程对于当今的安全团队来说非常有价值。 尽管 DSPM 的重要性日益凸显&#xff0c;但人们对于它能为企业做什么和不能…

序列化对象(ObjectOutputStream,ObjectInputStream)

1、对象序列化 作用&#xff1a;以 内存 为基准&#xff0c;把内存中的对象存储到磁盘文件中去&#xff0c;称为对象序列化使用到的流是对象字节输出流&#xff1a;ObjectOutputStream package com.csdn.d7_serializable; import java.io.*; public class ObjectOutputStreamDe…

电脑开机慢问题的简单处理

电脑用久了&#xff0c;开机时间要10-20分钟特别慢&#xff0c;一下介绍两种简单有效处理方式&#xff0c;这两种方式经测试不会影响原系统软件的使用&#xff1a; 方式一&#xff1a;禁用非必要启动项【效果不是很明显】 利用360里面的优化加速禁用启动项【禁用启动项还有其…

大数据Flink(八十九):Temporal Join(快照 Join)

文章目录 Temporal Join(快照 Join) Temporal Join(快照 Join) Temporal Join 定义(支持 Batch\Streaming):Temporal Join 在离线的概念中其实是没有类似的 Join 概念的,但是离线中常常会维护一种表叫做 拉链快照表,使用一个明细表去 join 这个 拉链快照表 的 join …

【LeetCode-简单题】501. 二叉搜索树中的众数

文章目录 题目方法一&#xff1a;暴力哈希方法二&#xff1a;利用二叉搜索树的特性&#xff08;递归双指针&#xff09; 题目 方法一&#xff1a;暴力哈希 这是针对于普通二叉树的解法 统计number出现次数 然后将次数最大的众数集 取出来 Map<Integer , Integer > map …