12.5單端口RAM,JS計數器,流水線乘法器,不重疊序列檢測器(狀態機+移位寄存器),信號發生器,交通燈

單端口RAM?

`timescale 1ns/1nsmodule RAM_1port(input clk,input rst,input enb,input [6:0]addr,input [3:0]w_data,output wire [3:0]r_data
);reg [6:0]mem[127:0];integer i;always @(posedge clk or negedge rst) beginif(!rst) beginfor (i=0; i<127 ; i=i+1) beginmem[i] <= 'b0;endendelse if (enb) beginmem[addr] <= w_data;endendassign r_data = (!enb)?mem[addr]:'b0;endmodule

JS計數器

`timescale 1ns/1nsmodule JC_counter(input                clk ,input                rst_n,output reg [3:0]     Q  
);always@(posedge clk or negedge rst_n)beginif(!rst_n) Q <= 'd0;else Q <= {~Q[0], Q[3 : 1]};end
endmodule

流水線乘法器

 assign mul_1 = mul_b[0]? mul_a: 0;assign mul_2 = mul_b[1]? mul_a<<1: 0;assign mul_3 = mul_b[2]? mul_a<<2: 0;assign mul_4 = mul_b[3]? mul_a<<3: 0;

這步就是豎式乘法,認為是b個a相加在一起,b的最低位上的數字意味著有1個a,b[1]位上的數字意味著有2個a,b[2]意味有4個,B【3】意味有8個。所以就采用移位方式。

  assign sum_1 = {size*(1'b0),mul_r1} + {size*(1'b0),mul_r2};assign sum_2 = {size*(1'b0),mul_r3} + {size*(1'b0),mul_r4};
`timescale 1ns/1nsmodule multi_pipe#(parameter size = 4
)(input 						clk 		,   input 						rst_n		,input	[size-1:0]			mul_a		,input	[size-1:0]			mul_b		,output	reg	[size*2-1:0]	mul_out		
);//parameter parameter N = size * 2;//definationwire [N - 1 : 0] temp [0 : 3];reg [N - 1 : 0] adder_0;reg [N - 1 : 0] adder_1;//output genvar i;generatefor(i = 0; i < 4; i = i + 1)begin : loopassign temp[i] = mul_b[i] ? mul_a << i : 'd0;endendgeneratealways@(posedge clk or negedge rst_n)beginif(!rst_n) adder_0 <= 'd0;else adder_0 <= temp[0] + temp[1];endalways@(posedge clk or negedge rst_n)beginif(!rst_n) adder_1 <= 'd0;else adder_1 <= temp[2] + temp[3];endalways@(posedge clk or negedge rst_n)beginif(!rst_n) mul_out <= 'd0;else mul_out <= adder_0 + adder_1;end
endmodule

這里注意temp[]的位數是N-1.即兩倍的乘法位數。

變量名前的【】表示變量的位寬,每位的位寬。變量名后的【】表示數組長度,相同變量的個數,串在一起。

不重疊序列檢測

狀態機

`timescale 1ns/1ns
module sequence_detect(input clk,input rst_n,input data,output reg match,output reg not_match);parameter ZERO=0, ONE=1, TWO=2, THREE=3, FOUR=4, FIVE=5, SIX=6, FAIL=7;reg [2:0] state, nstate;reg [2:0] cnt;always@(posedge clk or negedge rst_n) beginif(~rst_n)cnt <= 0;elsecnt <= cnt==6? 1: cnt+1; endalways@(posedge clk or negedge rst_n) beginif(~rst_n)state <= ZERO;elsestate <= nstate;endalways@(*) beginif(~rst_n)nstate = ZERO;elsecase(state)ZERO : nstate = data? FAIL : ONE;ONE  : nstate = data? TWO  : FAIL;TWO  : nstate = data? THREE: FAIL;THREE: nstate = data? FOUR : FAIL;FOUR : nstate = data? FAIL : FIVE;FIVE : nstate = data? FAIL : SIX;SIX  : nstate = data? FAIL : ONE;FAIL : nstate = cnt==6&&data==0? ONE: FAIL;default: nstate = ZERO;endcaseendalways@(*) beginif(~rst_n) beginmatch     = 0;not_match = 0;endelse beginmatch     = cnt==6&&state==SIX;not_match = cnt==6&&state==FAIL;endendendmodule
FAIL : nstate = cnt==6&&data==0? ONE: FAIL;

移位寄存器

`timescale 1ns/1ns
module sequence_detect(input clk,input rst_n,input data,output reg match,output reg not_match);reg [2:0] cnt;reg [5:0] data_r;always@(posedge clk or negedge rst_n) beginif(~rst_n)cnt <= 0;else cnt <= cnt==5? 0: cnt+1;endalways@(posedge clk or negedge rst_n) beginif(~rst_n)data_r <= 6'b0; elsedata_r <= {data_r[4:0], data};endalways@(posedge clk or negedge rst_n) beginif(~rst_n) beginmatch     <= 1'b0;not_match <= 1'b0;endelse beginmatch     <= (cnt==5) && ({data_r[4:0], data}==6'b011100);not_match <= (cnt==5) && ({data_r[4:0], data}!=6'b011100);endendendmodule

判斷必須要這樣判斷,不可寫為~match。

因為要match時,是要取反的是當下周期,但是由于是非阻塞,此時macth是上個周期的,但非阻塞,就會導致下個Not_match取反的就是上個周期的match而不是當下周期的,下個周期的match取反才是需要的

需要注意由于是非阻塞,所以當前進入的數據會在下一個周期里才會進入寄存器,所以在本周期中如果要輸出,就需要額外再移位判斷一下

信號發生器

在方波時,

// 僅在方波模式工作的計數器
always@(posedge clk or negedge rst_n) beginif(~rst_n)cnt <= 0;elsecnt <= wave_choise!=0 ? 0:cnt        ==19? 0:cnt + 1;
end

如果波形選擇不是0,即!=0成立,那么cnt就一直保持為0;不然就是==0成立,然后判斷cnt是不是等于19,如果是的話,就復位,重新計數,不然就+1?

wave <= cnt ==9 ? 20: cnt ==19? 0 :wave;

?就是cnt是只在方波模式下才工作的,先判斷cnt是否==9,是的話就讓wave=20;不是的話,就判斷是不是等于19,是的話復位到0,不然就保持,這樣實現出來的話,每個周期下,前半個周期是低電平,只有到cnt==9時,wave在下個周期設置為20,才會在后半個周期顯示為高電平。

`timescale 1ns/1ns
module signal_generator(input clk,input rst_n,input [1:0] wave_choise,output reg [4:0]wave);reg [4:0]cnt;reg up;always @(posedge clk or negedge rst_n)if (!rst_n)begin wave <= 0;cnt <= 0;endelse case (wave_choise)2'b00:				//產生方波,保持0十個時鐘,保持20十個時鐘beginif (cnt == 19)begin	wave <= 0;cnt <= 0;endelse if(cnt == 9)begin	wave <= 20;cnt <= cnt + 1;endelsebeginwave <= wave;cnt <= cnt + 1;endend2'b01:				//產生鋸齒,0遞增到20beginif (wave == 20)beginwave <= 0;endelse beginwave <= wave + 1;endend2'b10:beginif (wave == 20)beginwave <= wave - 1;up <= 0;endelse if (wave == 0)beginwave <= wave + 1;up <= 1;endelse if (up)beginwave <= wave + 1;endelse beginwave <= wave - 1;endenddefault:beginwave <= 1;endendcase
endmodule

交通燈

競爭與險象

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

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

相關文章

Linux--權限問題(1)

前文 Linux--初識和基本的指令&#xff08;1&#xff09;-CSDN博客 Linux--初識和基本的指令&#xff08;2&#xff09;-CSDN博客 Linux--初識和基本的指令&#xff08;3&#xff09;-CSDN博客 目錄 前文 前言 1.剩余指令部分 1.1 打包和壓縮的其它指令 2.權限部分 2.1權…

探秘MSSQL存儲過程:參數傳遞、錯誤處理、性能優化

參數傳遞、錯誤處理和性能優化是存儲過程中非常重要的方面。在本節中&#xff0c;我們將深入探討這些主題&#xff0c;并提供相應的示例代碼。 1、參數傳遞 存儲過程可以接受輸入參數和輸出參數&#xff0c;以便與外部代碼進行交互。以下是一些常見的參數傳遞方式&#xff1a;…

Qt基礎-程序打包發布方法

本文講解Qt程序打包發布方法。 一、使用Qt自帶的windeployqt 生成可運行的包 準備將Qt生成的exe拷入到單獨的文件夾,并進行命名,本文命名為packDemorun,并將文件放到D盤(自己隨意放置) 1、找到Qt自帶的命令終端 2、啟動命令終端 3、輸入:cd /d D:\packDemorun,進入文…

IDEA刪除最近打開的文件記錄

IDEA刪除最近打開的文件記錄 遇見問題&#xff1a;如何刪除IDEA中最近打開的文件記錄 解決方法 先關閉IDEA 找到 recentProjects.xml 文件 windows 位置&#xff1a;&#xff08;AppData是隱藏文件夾&#xff09; 1.C:\Users\電腦用戶名\AppData\Roaming\JetBrains\IntelliJIde…

Git 請輸入一個提交信息以解釋此合并的必要性

操作方法&#xff1a;按住Ctrl加下面的某個字母

linux-man命令的使用及練習

目錄 1. 命令概述 2. 使用 3. 練習 ?man services時報錯&#xff1a;No manual entry for services的解決辦法 4. man命令中常用按鍵以及用途 1. 命令概述 Linux提供了豐富的幫助手冊&#xff0c;當你需要查看某個命令的參數時不必到處上網查找&#xff0c;只要man一下即…

MySQL六 | 索引

目錄 索引 優缺點 結構 語法 創建索引 查看索引 刪除索引 索引 索引是幫助數據庫高效獲取數據的數據結構。如果沒有設置索引會進行全表掃描&#xff0c;性能較低。 優缺點 優點缺點提高數據檢索的效率&#xff0c;降低數據的IO成本索引列也是要占用空間的通過索引列對數…

viewPager的adapter--FragmentInstancePagerAdapter

之前分享過幾個tabviewPager的庫。。這種東西開發中特別常見。今天抽空補一個viewPager的adapter。用來搭配使用 創建FragmentInstancePagerAdapter,如下&#xff1a; mport androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.f…

AI降重軟件,AI降重后原創高質量文章

在當今信息爆炸的時代&#xff0c;寫作與創作的重要性日益凸顯。隨著大量內容的涌現&#xff0c;文章降重成為了許多作者和內容創作者的一大問題。本文將專心分享該軟件的優勢&#xff0c;并為廣大用戶推薦幾款好用的AI降重軟件。 AI降重使用場景 AI降重技術利用機器學習算法和…

OpenCV圖像相似性比對算法

背景 在做圖像處理或者計算機視覺相關的項目的時候&#xff0c;很多時候需要我們對當前獲得的圖像和上一次的圖像做相似性比對&#xff0c;從而找出當前圖像針對上一次的圖像的差異性和變化點&#xff0c;這需要用到OpenCV中的一些圖像相似性和差異性的比對算法&#xff0c;在O…

使用LangSmith來快速學習LangChain

好風憑借力&#xff0c;送我上青云&#xff01; 什么是LangSmith LangSmith is a platform for building production-grade LLM applications. It lets you debug, test, evaluate, and monitor chains and intelligent agents built on any LLM framework and seamlessly int…

Python學習路線 - Python語言基礎入門 - 循環語句

Python學習路線 - Python語言基礎入門 - 循環語句 前言為什么學習循環語句 while循環的基礎語法while循環語句while循環注意點 while循環的基礎案例while循環的嵌套應用while循環的嵌套 while循環的嵌套案例補充知識 - print輸出不換行補充知識 - 制表符\t練習案例 - 打印九九乘…

創建dockerSwarm nfs掛載

創建dockerSwarm nfs掛載 nfs高可用部署(lsyncd兩主機雙向同步) nfs高可用部署(lsyncd三主機三向同步) 1. 通過 Volume 1.1 創建 Docker Volume 每個 swarm 節點均創建相同名稱的 Docker Volume&#xff08;名稱為 nfs120&#xff09; docker volume create --driver local …

算法:進制之前的轉換

1. X進制轉換成十進制-V1&#xff1a; /*** 笨辦法&#xff0c;從左往右開始* Tips&#xff1a;只支持正數** param num* param radix* return*/private static Integer xToTenV1(String num, Integer radix) {if (num.length() 0 || num.charAt(0) -) {throw new IllegalArg…

外貿找客戶軟件工具:BotMaster 18.5 Crack

BotMaster 拓展您的業務大師增加銷量Whatsapp營銷&#xff0c;使用 BotMaster 將您的業務提升到新的水平 - 最強大的 WhatsApp 營銷軟件&#xff0c;可促進銷售和發展您的業務。 BotMaster 是一款革命性的 WhatsApp 營銷工具&#xff0c;于 2022 年 1 月推出。這款功能強大的工…

10 大 Mac 數據恢復軟件深度評測

對于任何依賴計算機獲取重要文件&#xff08;無論是個人照片還是重要商業文檔&#xff09;的人來說&#xff0c;數據丟失可能是一場噩夢。值得慶幸的是&#xff0c;有多種專門為 Mac 用戶提供的數據恢復工具&#xff0c;可以幫助檢索丟失或意外刪除的文件。在本文中&#xff0c…

HNU計算機體系結構-實驗3:多cache一致性算法

文章目錄 實驗3 多cache一致性算法一、實驗目的二、實驗說明三 實驗內容1、cache一致性算法-監聽法模擬2、cache一致性算法-目錄法模擬 四、思考題五、實驗總結 實驗3 多cache一致性算法 一、實驗目的 熟悉cache一致性模擬器&#xff08;監聽法和目錄法&#xff09;的使用&am…

從零構建屬于自己的GPT系列4:模型訓練3(訓練過程解讀、序列填充函數、損失計算函數、評價函數、代碼逐行解讀)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 實戰系列 總目錄 有任何問題歡迎在下面留言 本篇文章的代碼運行界面均在PyCharm中進行 本篇文章配套的代碼資源已經上傳 從零構建屬于自己的GPT系列1&#xff1a;數據預處理 從零構建屬于自己的GPT系列2&#xff1a;模型訓…

[力扣100] 10.滑動窗口的最大值

添加鏈接描述 class Solution:def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:# 思路是使用單調隊列&#xff0c;把滑動窗口中最大的元素放在最頭quecollections.deque()nlen(nums)res[]# 初始化隊列,隊頭保存最大的數的下標&#xff0c;因為需要下標來…

Spring Security 6.x 系列(10)—— SecurityConfigurer 配置器及其分支實現源碼分析(二)

一、前言 在本系列文章&#xff1a; Spring Security 6.x 系列&#xff08;4&#xff09;—— 基于過濾器鏈的源碼分析&#xff08;一&#xff09; 中著重分析了Spring Security在Spring Boot自動配置、 DefaultSecurityFilterChain和FilterChainProxy 的構造過程。 Spring …