練習九-利用狀態機實現比較復雜的接口設計

練習九-利用狀態機實現比較復雜的接口設計

      • 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.pswp.cn/news/161487.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161487.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161487.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C++11】=default與=delete關鍵字使用詳解

系列文章目錄 C11新特性使用詳解-持續更新 文章目錄 系列文章目錄一、default關鍵字1. 為什么要引入default關鍵字2. 注意事項3. 使用default關鍵字有什么好處4.實例代碼 二、delete關鍵字1. 為什么要引入delete關鍵字2. 注意事項3. 使用場景3.1刪除默認構造函數3.2 刪除拷貝構…

2023.11.22 -數據倉庫的概念和發展

目錄 https://blog.csdn.net/m0_49956154/article/details/134320307?spm1001.2014.3001.5501 1經典傳統數倉架構 2離線大數據數倉架構 3數據倉庫三層 數據運營層,源數據層&#xff08;ODS&#xff09;&#xff08;Operational Data Store&#xff09; 數據倉庫層&#…

開發上門送桶裝水小程序要考慮哪些業務場景

上門送水業務已經有很長一段時間了&#xff0c;但是最開始都是給用戶發名片、貼小廣告&#xff0c;然后客戶電話訂水&#xff0c;水站工作人員再上門去送&#xff0c;這種人工記單和派單效率并不高&#xff0c;并且電話溝通中也比較容易出現偏差&#xff0c;那么根據這個情況就…

IT 領域中的主要自動化趨勢

48%的IT自動化流程屬于IT服務管理&#xff0c;過去一年中&#xff0c;IT運維自動化增長了272%。 IT部門從交付者轉變為戰略伙伴 今年的《工作自動化指數》數據顯示&#xff0c;自動化正在蔓延到組織的各個部門&#xff0c;越來越多的部門采用自動化&#xff0c;并且IT以外的員工…

一條命令徹底卸載Linux自帶多個版本jdk

一條命令徹底卸載Linux自帶多個版本jdk 檢查系統已經安裝的jdk rpm -qa | grep java卸載所有已經安裝的 jdk xargs 將參數逐個傳遞 將已安裝的 java 程序逐個當做參數傳遞給 rpm -e --nodeps rpm -qa | grep java | xargs rpm -e --nodeps再次檢查系統已經安裝的jdk rpm -qa | …

JS實現二分查找

最近在面試的時候被問到手寫實現二分查找&#xff0c;雖然二分查找很早就聽過&#xff0c;也知道實現原理&#xff0c;但是手擼起來&#xff0c;總是差點意思&#xff0c;正好復習一下。作為前端程序員&#xff0c;可能面試絕大部分公司不需要能寫很復雜的算法問題&#xff0c;…

Azure Machine Learning - 搜索中的語義排名

目錄 什么是語義排名&#xff1f;語義排名的工作原理如何收集和總結輸入語義排名的輸出如何對摘要進行評分 語義功能和限制 在 Azure AI 搜索中&#xff0c;“語義排名”通過使用語言理解對搜索結果重新排名來顯著提高搜索相關性&#xff0c; 本文概括性地介紹了語義排名工作原…

Nodejs JavaScript 字符串加密

情景 問題的場景是這樣的&#xff1a;我們需要在瀏覽器cookie中存儲用戶名&#xff0c;但又不想直接明文存儲&#xff0c;所以對它進行了簡單的加密存儲。 因為是簡單的加密&#xff0c;目的只是不希望明文存儲。我們使用了Base64 編碼&#xff0c;使得cookie里的存儲不可只讀…

Arthas 監聽 Docker 部署的java項目CPU占比高的信息

1、Linux上安裝Arthas wget https://alibaba.github.io/arthas/arthas-boot.jar2、docker ps 查看目標項目的容器ID 3、copy Arthas 到目標容器中 (注意有 &#x1f615; ) docker cp arthas-boot.jar d97e8666666:/4、進入到目標容器目錄中 docker exec -it d97e8666666 /b…

5-7求三種數的和

#include<stdio.h> int main(){double sum10;double sum20;double sum30;double sum;int i;for(i1;i<100;i){sum1sum1i;}printf("sum1結果是&#xff1a;%15.6f\n",sum1);for(i1;i<50;i){sum2sum2i*i;}printf("sum2結果是&#xff1a;%15.6f\n"…

TS是什么、為什么、怎么辦

TS是什么 javascript程序的靜態類型檢查器 為什么要用TS js編寫時在預期不同類型值的地方使用了某種類型的值&#xff0c;導致常見的類型錯誤 js只能提供動態類型&#xff0c;也就是運行一下代碼才能知道發生了什么&#xff0c;需要靜態類型的檢查 TS怎么用 1、安裝vscode…

連接服務器的腳本

對于記不住的服務器密碼且不愿用三方工具俺簡單寫了個腳本&#xff08;檢測下最近shell腳本的學習效果咋樣&#xff09; expect 是處理交互的一種腳本語言&#xff0c;spawn啟動指定進程 -> expect獲取指定關鍵字 -> send想指定進程發送指定指令 -> 執行完成后退出 sp…

Oracle:poor sql導致的latch: cache buffers chains案例

巡檢時&#xff0c;執行如下sql發現長會話&#xff1a; SELECT SE.SID,SE.SERIAL#,TO_CHAR(LOGON_TIME,YYYY-MM-DD HH24:MI:SS),SE.STATUS,SE.OSUSER,SE.MACHINE,SE.PROGRAM,SE.BLOCKING_SESSION, SE.SQL_ID,SE.PREV_SQL_ID ,SE.EVENT,SE.P1TEXT,SE.P1,SE.P2TEXT,SE.P2,SE.P3…

LeetCode1161. Maximum Level Sum of a Binary Tree

文章目錄 一、題目二、題解 一、題目 Given the root of a binary tree, the level of its root is 1, the level of its children is 2, and so on. Return the smallest level x such that the sum of all the values of nodes at level x is maximal. Example 1: Input:…

visionOS空間計算實戰開發教程Day 4 初識ImmersiveSpace

細心的讀者會發現在在??Day1???和??Day2???的示例中我們使用的都是??WindowGroup??。 main struct visionOSDemoApp: App {var body: some Scene {WindowGroup {ContentView()}} } 本節我們來認識在visionOS開發中會經常用到的另一個概念??ImmersiveSpace??…

Spark---集群搭建

Standalone集群搭建與Spark on Yarn配置 1、Standalone Standalone集群是Spark自帶的資源調度框架&#xff0c;支持分布式搭建&#xff0c;這里建議搭建Standalone節點數為3臺&#xff0c;1臺master節點&#xff0c;2臺worker節點&#xff0c;這虛擬機中每臺節點的內存至少給…

transformer之KV Cache

一、為什么要研究KV Cache 非常有效的加速推理速度&#xff0c;效果如下所示&#xff1a; import numpy as np import time import torch from transformers import AutoModelForCausalLM, AutoTokenizer NAME_OR_PATH r*************** device "cuda" if torch.cu…

中職組網絡安全 Server-Hun-1.img Server-Hun-2.img

一串密碼 smbuser用戶和密碼登錄ssh還是失敗提示需要密鑰&#xff0c;嘗試ftp登錄成功 發現密鑰存放在.ssh/下&#xff0c;在kali上生成一個密鑰&#xff0c;通過上傳到.ssh/下&#xff0c;將其替換掉 使用kali生成密鑰 登錄成功,但是無法拿到root目錄下的flag 獲取root用戶權限…

電子學會C/C++編程等級考試2022年12月(一級)真題解析

C/C++等級考試(1~8級)全部真題?點這里 第1題:加一 輸入一個整數x,輸出這個整數加1后的值,即x+1的值。 時間限制:1000 內存限制:65536輸入 一個整數x(0 ≤ x ≤ 1000)。輸出 按題目要求輸出一個整數。樣例輸入 9樣例輸出 10 答案: //參考答案: #include<bits/st…

opencv-常用代碼

以下是一些OpenCV中常用的代碼片段&#xff0c;涵蓋了一些基本的圖像處理和計算機視覺任務。 加載和顯示圖像: import cv2# 讀取圖像 img cv2.imread(image.jpg)# 顯示圖像 cv2.imshow(Image, img) cv2.waitKey(0) cv2.destroyAllWindows()調整圖像大小: resized_img cv2.res…