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

news2024/11/26 12:24:11

文章目录

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

第七讲

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)begin
	state<=0;d_out<=0;
end
else begin
	case(state)
	0://上升;
	begin
		d_out<=d_out+1;
		if(d_out==299)begin
			state<=1;
		end
	end
	1://下降
	begin
		d_out<=d_out-1;
		if(d_out==1)begin
			state<=0;
		end
	end	
  endcase
end

endmodule

//---------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 begin
	                 clk<=0;res<=0;
	           #17   res<=1;
	           #8000 $stop;
end

always #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)begin
	state<=0;d_out<=0;con<=0;
end
else begin
	case(state)
	0://上升;
	begin
		d_out<=d_out+1;
		if(d_out==299)begin
			state<=1;
		end
	end
	1://平顶
	begin
		if(con==200)begin
			state<=2;
			con<=0;
		end
		else begin
		  con<=con+1;
	  end	
	end
	2://下降
	begin
		d_out<=d_out-1;
		if(d_out==1)begin
			state<=3;
		end
	end	
	3://平顶
	begin
		if(con==200)begin
			state<=0;
			con<=0;
		end
		else begin
		  con<=con+1;
	  end	
	end
  endcase
end

endmodule

//---------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 begin
	                  clk<=0;res<=0;
	           #17    res<=1;
	           #40000 $stop;
end

always #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)begin
	state<=0;con<=0;con_bits<=0;RX_delay<=0;en_data_out<=0;
	data_out<=0;
end
else begin
	RX_delay<=RX;
	case(state)
	0://等空闲:
	begin
		if(con==5000-1)begin
		con<=0;
		end
		else begin
		con<=con+1;
		end
		if(con==0)begin
			if(RX)begin
				con_bits<=con_bits+1;
		  end
		  else begin
		  	con_bits<=0;
		  end
		end
		
		if(con_bits==12)begin
			state<=1;
		end	
	end

	1://等起始位
	begin
	en_data_out<=0;
		if(~RX&RX_delay)begin
			state<=2;
		end
	end
	2://收最低位b0;
	begin
		if(con==7500-1)begin
			con<=0;
			data_out[0]<=RX;
			state<=3;
		end
		else begin
			con<=con+1;
		end
	end
	3://收最低位b1;
	begin
		if(con==5000-1)begin
			con<=0;
			data_out[1]<=RX;
			state<=4;
		end
		else begin
			con<=con+1;
		end
	end
	4://收最低位b2;
	begin
		if(con==5000-1)begin
			con<=0;
			data_out[2]<=RX;
			state<=5;
		end
		else begin
			con<=con+1;
		end
	end
	5://收最低位b3;
	begin
		if(con==5000-1)begin
			con<=0;
			data_out[3]<=RX;
			state<=6;
		end
		else begin
			con<=con+1;
		end
	end
	6://收最低位b4;
	begin
		if(con==5000-1)begin
			con<=0;
			data_out[4]<=RX;
			state<=7;
		end
		else begin
			con<=con+1;
		end
	end
	7://收最低位b5;
	begin
		if(con==5000-1)begin
			con<=0;
			data_out[5]<=RX;
			state<=8;
		end
		else begin
			con<=con+1;
		end
	end
	8://收最低位b6;
	begin
		if(con==5000-1)begin
			con<=0;
			data_out[6]<=RX;
			state<=9;
		end
		else begin
			con<=con+1;
		end
	end
	
	9://收最低位b7;
	begin
		if(con==5000-1)begin
			con<=0;
			data_out[7]<=RX;
			state<=10;
		end
		else begin
			con<=con+1;
		end
	end
	10://产生使能信号脉冲;
	begin
		en_data_out<=1;
		state<=1;
	end
	default://
	begin
		state<=0;
		con<=0;
		con_bits<=0;
		en_data_out<=0;
	end
	endcase
end

endmodule

//-------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 begin
												 clk<=0;res<=0;RX_send<={1'b1,8'haa,1'b0,16'hffff};con<=0;
				#17              res<=1;
				#4000000         $stop;
end

always #5 clk<=~clk;

always@(posedge clk) begin
	if(con==5000-1)begin
		con<=0;
	end
	else begin
		con<=con+1;
	end
	
	if(con==0)begin
		RX_send[24:0]<=RX_send[25:1];
		RX_send[25]<=RX_send[0];
	end
	
end
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)begin
	state<=0;send_buf<=1;con<=0;send_flag<=10'b10_0000_0000;
	rdy<=0;
end
else begin
	case(state)
	0://等待使能信号
	begin
		if(en_data_in)begin
			send_buf={1'b1,data_in,1'b0};
			send_flag<=10'b10_0000_0000;
			rdy<=1;
			state<=1;
		end
	end
	1://串口发送,寄存器右移;
	begin
		if(con==5000-1)begin
			con<=0;
		end
		else begin
			con<=con+1;
		end
		if(con==5000-1)begin
			send_buf[8:0]<=send_buf[9:1];
			send_flag[8:0]<=send_flag[9:1];
		end
		if(send_flag[0])begin
			rdy<=0;
			state<=0;
		end
	end
		
	endcase
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 begin
                          clk<=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;
end

always #5 clk=~clk;



endmodule

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

第十讲

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

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

相关文章

vr飞机驾驶舱模拟流程3D仿真演示加大航飞安全法码

众所周知&#xff0c;航空航天飞行是一项耗资大、变量参数很多、非常复杂的系统工程&#xff0c;因此可利用虚拟仿真技术经济、安全及可重复性等特点&#xff0c;进行飞行任务或操作的模拟&#xff0c;以代替某些费时、费力、费钱的真实试验或者真实试验无法开展的场合&#xf…

Lua学习笔记:在Visual Studio中调试Lua源码和打断点

前言 本篇在讲什么 调试Lua源码 本篇需要什么 对Lua语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f449; ♠ 一级标题 &#x1f448; &…

C#中的方法

引言 在C#编程语言中&#xff0c;方法是一种封装了一系列可执行代码的重要构建块。通过方法&#xff0c;我们可以将代码逻辑进行模块化和复用&#xff0c;提高代码的可读性和可维护性。本文将深入探讨C#中的方法的定义、参数传递、返回值、重载、递归等方面的知识&#xff0c;…

【Hadoop】HDFS API 操作大全

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1…

Vue3 Ajax(axios)异步

文章目录 Vue3 Ajax(axios)异步1. 基础1.1 安装Ajax1.2 使用方法1.3 浏览器支持情况 2. GET方法2.1 参数传递2.2 实例 3. POST方法4. 执行多个并发请求5. axios API5.1 传递配置创建请求5.2 请求方法的别名5.3 并发5.4 创建实例5.5 实例方法5.6 请求配置项5.7 响应结构5.8 配置…

【配代码演示】Cookie和Session的区别

一、共同之处&#xff1a; cookie和session都是用来跟踪浏览器用户身份的会话方式。 二、工作原理&#xff1a; 1.Cookie的工作原理 &#xff08;1&#xff09;浏览器端第一次发送请求到服务器端 &#xff08;2&#xff09;服务器端创建Cookie&#xff0c;该Cookie中包含用户的…

控制台日志打印console的封装,加入美化与打印开关

控制台日志打印console的封装&#xff0c;加入美化与打印开关 为什么要写这个&#xff1f; 封装这个控制台日志打印工具&#xff0c;主要是在项目中自己做的SDK需要提供给其他开发人员使用&#xff0c;加入了日志美化和打印打开&#xff0c;方便了开发人员查找SDK中的日志&am…

以神龙出行小程序为例,说一些网站技术

注册和登录功能&#xff1a; 用户注册和登录可以使用手机号验证、第三方登录等方式来实现。这需要与后台服务器进行数据交互&#xff0c;并进行身份验证。 数据存储和管理&#xff1a; 用户的个人信息和常用地址需要进行存储和管理。这可以通过数据库来实现&#xff0c;如关系…

【八大经典排序算法】冒泡排序

【八大经典排序算法】冒泡排序 一、概述二、思路解读三、代码实现四、优化 一、概述 冒泡排序由于其简单和易于理解&#xff0c;使其成为初学者学习排序算法的首选&#xff0c;也是初学者接触到的第一个排序算法。其原理是通过重复交换相邻的元素来将最大的元素逐步“冒泡”到…

Python数据库编程:连接、操作和管理数据库

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 Python作为一门多用途的…

前端screenfull实现界面全屏展示功能

还是先引入依赖 我们要先执行 npm config set registry https://registry.npmjs.org/将本地npm registry地址设置为官方的npm registry地址 不然这个东西安装会有点问题 然后我们执行命令安装 npm install screenfull安装完之后 我们终端执行一下 npm config delete registr…

华为云HECS云服务器docker环境下安装redis

当前有个华为云HECS云服务器&#xff0c;已经安装了docker环境&#xff0c;准备下docker环境下安装redis。 一、HECS云服务器安装docker 登录华为HECS云服务器&#xff0c;安装docker环境。 安装docker参考如下文章&#xff1a; 华为云HECS安装docker并安装mysql-CSDN博客 …

构建个人图床云盘—EasyImage的简单部署及远程访问配置

文章目录 1.前言2. EasyImage网站搭建2.1. EasyImage下载和安装2.2. EasyImage网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2 Cpolar内网穿透本地设置 4. 公网访问测试5. 结语 1.前言 一个好的图床&#xff0c;是网站或者文章图片能稳定显示的关键&…

ros---服务端和客户端

服务模型&#xff1a; 想对于发布订阅模型的区别&#xff1a;请求一次才会接收一次&#xff0c;而不是不断的发布。 自定义服务数据 1.定义srv文件 2.在package.xml中添加功能包依赖 <build_depend>message_generation</build_depend> <exec_depend>mess…

商业大厦为什么要烟感监控?一篇看懂

烟感监控在现代商业大厦的安全体系中扮演着至关重要的角色。随着城市化的不断发展和商业大厦的不断增多&#xff0c;建筑物内的火灾风险也相应增加。 因此&#xff0c;采取有效的烟感监控措施&#xff0c;以及建立快速响应火警的机制&#xff0c;对于保护人员生命安全和财产安全…

Java之String类

作者简介&#xff1a; zoro-1&#xff0c;目前大二&#xff0c;正在学习Java&#xff0c;数据结构等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; Java之String类 String的构造String底层String之间…

【计算机毕业设计】基于SpringBoot+Vue的流浪猫狗救助救援网站的设计与实现

博主主页&#xff1a;一季春秋博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容&#xff1a;毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题…

讨论问题--数据类型、数组、传值/址API函数等

前言 数据类型是编程语言中用于表示数据的分类。常见的数据类型包括整数、浮点数、字符串、布尔值等。数据类型决定了变量能存储的值的种类和范围。 数组是一种存储多个相同类型数据的数据结构。它通过索引来访问并操作其中的元素。数组在内存中是连续存储的&#xff0c;可以…

前后端分离vue简介

vue简介 vue是一个渐进式js框架&#xff0c;用于构建用户界面&#xff0c;其主要特点是易学易用、轻量、灵活和高效。Vue.js由前Google工程师尤雨溪&#xff08; Evan You&#xff09;在2014年创建&#xff0c;它的核心库只关注视图层&#xff0c;是一款非常优秀的MVVM框架&…

大数据驱动业务增长:数据分析和洞察力的新纪元

文章目录 大数据的崛起大数据的特点大数据技术 大数据驱动业务增长1. 洞察力和决策支持2. 个性化营销3. 风险管理4. 产品创新 大数据分析的新纪元1. 云计算和大数据示例代码&#xff1a;使用AWS的Elastic MapReduce&#xff08;EMR&#xff09;进行大数据分析。 2. 人工智能和机…