Verilog三段式FSM,實現十字路口紅綠燈

運行環境:VCS + verdi

狀態說明:

S0 :?初始狀態
S1 :?東西方向綠燈亮,南北方向紅燈亮;點亮30周期
S2 :?東西方向黃燈亮,南北方向紅燈亮;點亮2 周期
S3?:?東西方向紅燈亮,南北方向綠燈亮;點亮30周期
S4 :?東西方向紅燈亮,南北方向黃燈亮;點亮2 周期

狀態轉換說明:

S0 → S1

S1:點亮30周期,進入S2,不足30周期維持S1

S2:點亮2周期,進入S3,不足2周期維持S2

S3:點亮30周期,進入S4,不足30周期維持S3

S4:點亮2周期,進入S1,不足2周期維持S4

代碼如下:

如果需要控制時間,自行添加分頻器,或者修改tb文件。

module traffic_light (input   clk,input   rst_n,output [2:0] light_east_west, light_south_north
);// 紅路燈點亮的時間定義
localparam GREEN  = 30;
localparam YELLOW = 2;// 亮燈的顏色定義
localparam dark  = 2'b00;
localparam green = 2'b01;
localparam yello = 2'b10;
localparam red   = 2'b11;// 狀態定義
parameter S0 = 5'b0_0001;  // 初始狀態
parameter S1 = 5'b0_0010;  // 東西方向綠燈亮,南北方向紅燈亮;30周期
parameter S2 = 5'b0_0100;  // 東西方向黃燈亮,南北方向紅燈亮;2 周期
parameter S3 = 5'b0_1000;  // 東西方向紅燈亮,南北方向綠燈亮;30周期
parameter S4 = 5'b1_0000;  // 東西方向紅燈亮,南北方向黃燈亮;2 周期reg [4:0] status;
reg [4:0] next_status;
reg [7:0] cnt;// 計數器控制
always @(posedge clk or negedge rst_n) beginif(!rst_n) cnt <= 8'b0;else if (   (status == S1 && cnt == GREEN-1 ) ||(status == S2 && cnt == YELLOW-1) ||(status == S3 && cnt == GREEN-1 ) ||(status == S4 && cnt == YELLOW-1)   )cnt <= 8'b0;elsecnt <= cnt + 1'b1;
end// 狀態轉換
always @(posedge clk or negedge rst_n) beginif(!rst_n)status <= S0;elsestatus <= next_status;
end// 狀態判斷
always @(*) beginif(!rst_n) beginnext_status = S0;endelse begincase(status)S0 : next_status = S1;S1 : next_status = (cnt == GREEN-1)  ? S2 : S1;S2 : next_status = (cnt == YELLOW-1) ? S3 : S2;S3 : next_status = (cnt == GREEN-1)  ? S4 : S3;S4 : next_status = (cnt == YELLOW-1) ? S1 : S4;default : next_status = S0;endcaseend
endreg [2:0] r_light_east_west, r_light_south_north;// 輸出控制
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginr_light_east_west  <= dark;r_light_south_north  <= dark;endelse begincase(status)S0 : beginr_light_east_west   <= dark;r_light_south_north <= dark;endS1 : beginr_light_east_west   <= green;r_light_south_north <= red;endS2 : beginr_light_east_west   <= yello;r_light_south_north <= red;endS3 : beginr_light_east_west   <= red;r_light_south_north <= green;endS4 : beginr_light_east_west   <= red;r_light_south_north <= yello;enddefault: beginr_light_east_west   <= dark;r_light_south_north <= dark;endendcaseend
endassign light_east_west   = r_light_east_west;
assign light_south_north = r_light_south_north;endmodule

tb文件:

module tb_traffic_light ();
localparam CLK_PERIDO = 20;reg   clk;
reg   rst_n;
reg [2:0] light_east_west;
reg [2:0] light_south_north;traffic_light traffic_light_inst(.clk    (clk),.rst_n  (rst_n),.light_east_west    (light_east_west), .light_south_north  (light_south_north)
);initial beginclk = 0;forever #(CLK_PERIDO / 2) clk = ~clk;   
endinitial beginrst_n = 0;repeat(4) @(posedge clk);#(CLK_PERIDO /5);rst_n = 1;repeat(500) @(posedge clk);$finish;
endinitial begin$dumpfile("traffic_light.fsdb");$dumpvars(0);
endendmodule

時序圖:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98694.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98694.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98694.shtml

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

相關文章

java 將pdf轉圖片

如何將pdf文件轉為圖片 import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class Pdf2Png {/**…

手搓Spring

目錄 兩種方法創建Spring容器 自定義Spring容器及前置操作 Spring掃描邏輯實現 createBean()方法 getBean()方法 依賴注入&#xff08;DI&#xff09; BeanNameAware接口 InitializingBean接口 BeanPostProcessor接口 AOP的實現 Spring 是一個輕量級的 Java 開發框架…

.NET 單文件程序詳解:從原理到實踐

C# 混淆加密大師在最新版本中, 提供了.NET單文件解包打包功能, 它可以快速解包官方打包的單文件程序&#xff0c;恢復為原始的多文件結構。也可以對解包后的程序集進行混淆與加密&#xff0c;有效提升逆向門檻。最后還能重新打包成單文件程序&#xff0c;保持對用戶友好的分發形…

Spring面試題記錄?

請簡述 Spring 框架的核心是什么&#xff1f;它主要包含了哪些核心模塊&#xff1f; spring的核心模塊主要有spring-core&#xff08;工具類&#xff0c;資源加載&#xff09;&#xff0c;spring-bean&#xff08;bean的定義&#xff0c;創建&#xff0c;封裝&#xff09;&…

一次緩存引發的文件系統數據不一致問題排查與深度解析

01 起因EFC&#xff08;Elastic File Client&#xff09;是 NAS 自研的分布式文件系統客戶端&#xff0c;最近完成了對緩存架構的更新&#xff0c;現在支持多個客戶端之間構成分布式緩存&#xff0c;底層支持 NAS、CPFS 和 OSS。由于開發時間較短&#xff0c;一直沒有做 NAS 場…

Spring Boot Gateway 教程:從入門到精通

一、Spring Cloud Gateway 簡介Spring Cloud Gateway 是基于 Spring 5、Project Reactor 和 Spring Boot 2 構建的 API 網關&#xff0c;旨在為微服務架構提供一種簡單而有效的路由管理方式。它取代了 Netflix Zuul&#xff0c;提供了更高效和更強大的網關解決方案。核心特點&a…

防火墻 只允許信任的幾臺服務器訪問

1. 首先&#xff0c;確保 firewalld 服務正在運行&#xff1a;systemctl start firewalld systemctl enable firewall2. 設置默認拒絕規則&#xff1a;設置默認拒絕所有流量&#xff08;拒絕所有的入站流量&#xff09;&#xff1a;firewall-cmd --zonepublic --add-rejectal…

十三,數據結構-樹

定義樹也是基于節點的數據結構&#xff0c;和鏈表不同的是&#xff0c;樹的節點可以指向多個節點。首先對樹的一些常用術語進行說明&#xff1a;最上面的節點叫做根節點&#xff0c;根位于樹頂&#xff0c;如圖中的節點A&#xff1b;和族譜一樣&#xff0c;節點有后代和祖先&am…

JVM-默背版

1.JVM對sychronized的優化&#xff1a;鎖膨脹、鎖消除、鎖粗化、自適應自旋鎖 &#xff08;1&#xff09;鎖膨脹&#xff1a;從無鎖、偏向鎖、輕量級鎖、重量級鎖的過程叫做鎖膨脹。在JDK1.6以前&#xff0c;sychronized是由重量級鎖實現的&#xff0c;加鎖和解鎖的過程需要從用…

Mac M 系列芯片 YOLOv8 部署教程(CPU/Metal 后端一鍵安裝)

在 Mac M 系列芯片&#xff08;Apple Silicon/ARM 架構&#xff09;上部署 YOLOv8&#xff0c;有一些注意事項&#xff1a;PyTorch 需要安裝 ARM 原生版本&#xff0c;推理可利用 Metal 后端加速 CPU。本文教你一步步完成環境配置、模型下載、依賴安裝和驗證推理。1?? 環境準…

Python爬蟲實戰:研究Units模塊,構建氣象數據采集和分析系統

1. 引言 1.1 研究背景 隨著信息技術的飛速發展,互聯網已成為全球最大的信息庫,涵蓋氣象、金融、醫療、農業等多個領域的海量數據。這些數據蘊含著巨大的潛在價值,如何有效獲取并深入分析這些數據成為當下研究的熱點。Python 作為一種功能強大的編程語言,憑借其豐富的庫資…

網頁設計模板 HTML源碼網站模板下載

互聯網已成為現代社會不可或缺的一部分&#xff0c;網站則是連接線上與線下世界的橋梁。無論是用于展示個人作品集、推廣商業產品還是提供公共服務信息&#xff0c;一個設計精良且功能完善的網站都能發揮巨大作用。然而&#xff0c;傳統的手工編碼方式不僅耗時費力&#xff0c;…

Flink KeyedProcessFunction為什么能為每個key定義State和Timer?

問題描述 一個常見的開窗邏輯&#xff08;12H 或者 500條&#xff09;&#xff1a; import org.apache.flink.api.common.state.ValueState; import org.apache.flink.api.common.state.ValueStateDescriptor; import org.apache.flink.api.common.typeinfo.Types; import or…

【C++】模版初階---函數模版、類模版

&#x1f31f;個人主頁&#xff1a;第七序章 &#x1f308;專欄系列&#xff1a;C&#xff0b;&#xff0b; 目錄 ??前言&#xff1a; &#x1f308;1.泛型編程&#xff1a; &#x1f308;2.函數模板 &#x1f36d;2.1函數模板概念 &#x1f36d;2.2函數模板格式 &am…

查找算法(Java)

目錄 一.定義 二.分類 三.線性查找 原理&#xff1a; 思路分析 代碼實現 例題實踐 1.兩數之和 方法一&#xff1a;暴力窮舉法 思路分析 代碼實現 方法二&#xff1a;創建哈希表 思路分析 代碼實現 2.移動零 思路分析 代碼實現 四.二分查找 原理&#xff1a; …

計算機網絡--四層模型,IP地址和MAC地址

四層模型&#xff1a;分別是應用層&#xff0c;傳輸層&#xff0c;網絡層和鏈路層。應用層&#xff1a;提供了應用程序之間相互通信的接口&#xff0c;允許用戶訪問網絡服務。這一層定義了應用程序如何與底層網絡進行交互。例如HTTP協議。傳輸層&#xff1a;它處理數據的分段、…

解析、創建Excel文件的開源庫OpenXLSX介紹

OpenXLSX是一個C庫&#xff0c;用于讀取、寫入、創建和修改.xlsx格式的Microsoft Excel文件&#xff0c;源碼地址&#xff1a;https://github.com/troldal/OpenXLSX &#xff0c;License為BSD-3-Clause&#xff0c;可在Windows、Linux、MaCOS平臺上使用。最新發布版本為v0.3.2&…

【C++】C++11 篇二

【C】C11 篇二前言移動構造函數移動賦值運算符重載類成員變量初始化 &#xff08;缺省值出自C11強制生成默認函數的關鍵字default:禁止生成默認函數的關鍵字delete:繼承和多態中的final與override關鍵字&#xff08;出自C11可變參數模板遞歸函數方式展開參數包逗號表達式展開參…

構建Python環境的幾種工具

本文主要介紹如何構建Python環境來處理不同的工作。 1.常用的構建Python環境的工具 ①venv(內置模塊):Python 3.3 內置標準庫模塊&#xff0c;無需額外安裝。 ②virtualenv:venv的前身&#xff0c;功能更強大且支持舊版Python。 ③conda:來自 Anaconda 或 Miniconda。不僅能…

c#項目編譯時外部依賴文件的同步問題

很多場景因為資源文件太多或太大無法放到資源里面或者是依賴的dll文件&#xff0c;需要編譯時同步到bin\debug或bin\release下的&#xff0c;這里面要修改工程文件代碼實現。 比如&#xff0c;我把這個項目依賴的dll和附加文件放到ref_dll文件夾里面&#xff0c;希望編譯的時候…