练习九-利用状态机实现比较复杂的接口设计

练习九-利用状态机实现比较复杂的接口设计

      • 1,任务目的:
      • 2,RTL代码
      • 3,RTL原理框图
      • 4,测试代码
      • 5,波形输出

1,任务目的:

(1)学习运用状态机控制的逻辑开关,并设计出一个比较复杂的接口逻辑;
(2)在复杂设计中使用任务(task)结构,以提高程序的可读性;
(3)加深对可综合风格模块的认识。

下面例子是一个并行数据转换为串行位流的变换器,利用双向总线输出。该案例来自于EPROM读写器,电路工作的步骤是:
(1)把并行地址存入寄存器; (2)把并行数据存入寄存器; (3)连接串行单总线; (4)地址的串行输出; (5)数据的串行输出; (6)挂起串行单总线; (7)给信号源应答; (8)让信号源给出下一个操作对象; (9)结束写操作。

2,RTL代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/11/22 10:52:02
// Design Name: 
// Module Name: writing
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module writing(
rst_n, clk, address, data, sda, ack);input			rst_n, clk;
input	[7:0]	data, address;inout			sda;			// 	串行数据的输出或者输入接口
output			ack;			//	模块给出的应答信号
reg				link_write;		// link_write决定何时输出reg		[3:0]	state;			//	主状态机的状态字
reg		[4:0]	sh8out_state;	// 从状态机的状态字
reg		[7:0]	sh8out_buf;		// 输入数据缓冲
reg				finish_F;		//	用以判断是否处理完一个操作对象
reg				ack;parameter	idle 		= 0;
parameter	addr_write	= 1;
parameter	data_write	= 2;
parameter	stop_ack	= 3;parameter	bit0		= 1;
parameter	bit1		= 2;
parameter	bit2		= 3;
parameter	bit3		= 4;
parameter	bit4		= 5;
parameter	bit5		= 6;
parameter	bit6		= 7;
parameter	bit7		= 8;assign		sda = link_write ? sh8out_buf[7] : 1'bz;always@(posedge clk)	beginif(!rst_n)	begin	// 复位link_write		<= 0;		// 挂起串行总线sh8out_state	<= idle;sh8out_buf		<= 0;state			<= idle;finish_F		<= 0;		// 结束标志清零ack				<= 0;endelse	case(state)idle:	beginlink_write		<= 0;	// 断开串行单总线sh8out_state	<= idle;sh8out_buf		<= address;	// 并行地址存入寄存器state			<= addr_write;	// 进入下一个状态finish_F		<= 0;				ack				<= 0;endaddr_write:		// 地址的输入if(finish_F == 0)	shift8_out	;	// 地址的串行输出//	?	任务else	beginsh8out_state	<= idle;sh8out_buf		<= data;	// 并行数据存入寄存器state			<= data_write;finish_F		<= 0;enddata_write:		// 数据的写入if(finish_F	== 0)shift8_out	;	//	数据的串行输出// 任务else	beginlink_write	<= 0;state		<= stop_ack;finish_F	<= 0;ack			<= 1;	// 向信号源发出应答endstop_ack:	begin // 向信号源发出应答结果ack		<= 0;state	<= idle;endendcase
endtask	shift8_out;	// 地址和数据的串行输出
begincase(sh8out_state)idle:	beginlink_write		<= 1;	// 连接串行单总线,立即输出地址或数据的最高位(MSB)sh8out_state	<= bit7;endbit7:	beginlink_write		<= 1;	// 连接串行单总线sh8out_state	<= bit6;sh8out_buf		<= sh8out_buf << 1;	// 输出地址或数据的次高位(bit6)endbit6:	beginsh8out_state	<= bit5;sh8out_buf		<= sh8out_buf << 1;endbit5:	beginsh8out_state	<= bit4;sh8out_buf		<= sh8out_buf << 1;endbit4:	beginsh8out_state	<= bit3;sh8out_buf		<= sh8out_buf << 1;endbit3:	beginsh8out_state	<= bit2;sh8out_buf		<= sh8out_buf << 1;endbit2:	beginsh8out_state	<= bit1;sh8out_buf		<= sh8out_buf << 1;endbit1:	beginsh8out_state	<= bit0;sh8out_buf		<= sh8out_buf << 1;	// 输出地址或数据的最低位(LSB)endbit0:	beginlink_write		<= 0;	// 挂起串行单总线finish_F		<= 1;	// 建立结束标志endendcase
end
endtaskendmodule

3,RTL原理框图

在这里插入图片描述

4,测试代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/11/22 10:53:46
// Design Name: 
// Module Name: writing_top
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//// 测试代码
`define	clk_cycle	50
module	writing_top;
reg		rst_n,	clk;
reg		[7:0]	data, address;
wire	ack,	sda;always #`clk_cycle	clk = ~clk;initial	beginclk 	= 0;rst_n	= 1;data	= 0;address	= 0;#(2   * `clk_cycle)		rst_n = 0;#(2   * `clk_cycle)		rst_n = 1;#(100 * `clk_cycle)		$stop;
endalways@(posedge ack)	begin// 接收到应答信号后,给出下一个处理对象data 	= data + 1;address	= address + 1;
endwriting u_writing(
.rst_n			(rst_n		),
.clk			(clk		),
.data			(data		),
.address		(address	),
.ack			(ack		),
.sda			(sda		)
);endmodule

5,波形输出

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

小红书干货类笔记怎么写?建议收藏

小红书干货类笔记是指在小红书这个社交平台上&#xff0c;用户分享的各种实用、有价值的生活技巧、经验、心得等内容的笔记。这类笔记通常具有以下特点&#xff1a;内容详实、实用性强、独特见解、图文并茂。 比如&#xff1a;某个妆要怎么化、某种技能该怎么学、某个城市该怎…

Linux 中 .tar 和 tar.gz 的区别

1、前言 有时候你会发现&#xff0c;即便是有些拥有 3 年左右工作经验的运维或开发工程师对 .tar 和 .tar.gz 的区别并不是很清楚。.tar 和 .tar.gz 是在 Linux 系统中用于打包和压缩文件的两种常见格式。它们之间的主要区别在于压缩算法和文件扩展名。 2、区别 .tar .tar 是…

一款好用的window ssh远程终端term工具

这是一款可以在window10上运行的ssh终端工具. 官方下载地址&#xff1a; https://github.com/kingToolbox/WindTerm/releases 具体页面如下 下载解压后&#xff1a; 把它移动到C目录下面&#xff0c;并且搞一个桌面快捷方式&#xff0c;就可以了

厦门某智慧社区的智慧排水监测系统实施落地

厦门某智慧社区的智慧排水监测系统实施落地 智慧社区的排水系统是一种高度智能化、高效且环保的排水解决方案&#xff0c;它结合了自动化控制系统、计算机网络技术、传感监测技术以及环保理念等多个领域的知识。其主要作用是确保社区的排水系统能够高效、稳定、环保地运行&…

【计算方法与科学建模】矩阵特征值与特征向量的计算(一):Jacobi 旋转法及其Python实现

文章目录 一、Jacobi 旋转法1. 基本思想2. 计算过程演示3. 注意事项 二、Python实现迭代过程&#xff08;调试&#xff09; 矩阵的特征值&#xff08;eigenvalue&#xff09;和特征向量&#xff08;eigenvector&#xff09;在很多应用中都具有重要的数学和物理意义。Jacobi 旋转…

作品Demo:大全

实用小demo 1.3D-地图工程 获取连接&#xff1a;nullhttps://m.tb.cn/h.5kzPTgJ?tkRPBlWep4ZIf 2.3D-饼图 获取连接&#xff1a;https://m.tb.cn/h.5Pt4A8k?tkXRzWWepUnu4https://m.tb.cn/h.5Pt4A8k?tkXRzWWepUnu4

Wagtail-基于Python Django的内容管理系统CMS如何实现公网访问

Wagtail-基于Python Django的内容管理系统CMS实现公网访问 文章目录 Wagtail-基于Python Django的内容管理系统CMS实现公网访问前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 前言 Wagtail是一个…

Redis-Day1基础篇(初识Redis, Redis常见命令, Redis的Java客户端)

Redis-Day1基础篇 初识Redis认识NoSQL认识Redis安装Redis启动RedisRedis客户端 Redis命令数据结构介绍通用命令操作命令StringHashListSetSortedSet Redis的Java客户端客户端对比Jedis客户端Jedis快速入门Jedis连接池 SpringDataRedis客户端SpringDataRedis概述SpringDataRedis…

反电诈指南:如何通过技术手段精准有效的识别银行卡出租出售行为?

目录 出租出售的银行卡被用来做什么&#xff1f; 个人出租出售银行卡的法律后果 如何通过技术手段快速识别被出租出售的银行卡 电信网络诈骗已成为一种普遍且危害性极大的犯罪行为。其中&#xff0c;银行卡和电话卡是诈骗者最常利用的工具。这些卡不仅被用于线上和线下的欺诈活…

Hadoop -hdfs的读写请求

1、HDFS写数据&#xff08;宏观&#xff09;&#xff1a; 1、首先&#xff0c;客户端发送一个写数据的请求&#xff0c;通过rpc与NN建立连接&#xff0c;NN会做一些简单的校验&#xff0c;文件是否存在&#xff0c;是否有空间存储数据等。 2、NN就会将校验的结果发送给客户端…

2023亚太杯数学建模思路 - 案例:粒子群算法

文章目录 1 什么是粒子群算法&#xff1f;2 举个例子3 还是一个例子算法流程算法实现建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是粒子群算法&#xff1f; 粒子群算法&#xff08;Pa…

Microsoft Dynamics 365:Dynamics NAV 2016 Setup 安装(澳洲版)

今天与大家一起分享 CU 06 for Microsoft Dynamics NAV 2016 的 Setup 安装&#xff08;澳洲版&#xff09;的安装&#xff0c;步骤截图如下。包括下载地址、操作、安装步骤、问题解决等。 1、下载地址&#xff08;微软官方&#xff09; https://support.microsoft.com/en-us…