chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FPGA學(xué)習(xí)-序列檢測(cè)器

FPGA設(shè)計(jì)論壇 ? 來源:未知 ? 2023-08-29 10:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

點(diǎn)擊上方藍(lán)字關(guān)注我們

一、前言

數(shù)字電路中,序列檢測(cè)器(Sequence Detector)是指一種特殊類型的電路,用于尋找輸入信號(hào)中一定模式的子序列。該模式可以是任意模式,包括重復(fù)模式、連續(xù)模式、間隔模式等等。通常的序列檢測(cè)方法有2種:有限狀態(tài)機(jī)法(FSM);移位寄存器法。

為什么需要設(shè)計(jì)序列檢測(cè)電路呢?

數(shù)字集成電路中,序列檢測(cè)電路可以用于檢測(cè)輸入信號(hào)序列中是否存在特定的模式和序列,以及判斷實(shí)際輸出和理論輸出是否存在差異。序列檢測(cè)器是確保數(shù)字系統(tǒng)的正確運(yùn)行不可或缺的一部分!

那么數(shù)字IC中哪些部分需要設(shè)計(jì)呢?

數(shù)字集成電路(Digital Integrated Circuit,簡(jiǎn)稱DIC)中需要設(shè)計(jì)序列檢測(cè)電路的部分主要包括以下幾個(gè)方面:

數(shù)據(jù)輸入端:序列檢測(cè)電路可以用于檢測(cè)輸入數(shù)據(jù)是否符合特定的格式要求,或者是否存在錯(cuò)誤或干擾。在數(shù)字集成電路中,輸入數(shù)據(jù)通常是通過輸入端口輸入的,因此需要在輸入端口處設(shè)計(jì)序列檢測(cè)電路。

控制信號(hào):數(shù)字集成電路中的控制信號(hào)通常是用于控制數(shù)字系統(tǒng)的操作序列,以確保系統(tǒng)按照預(yù)期的順序執(zhí)行操作。在這種情況下,序列檢測(cè)電路可以用于檢測(cè)控制信號(hào)是否按照預(yù)期的序列進(jìn)行。

數(shù)據(jù)輸出端:序列檢測(cè)電路還可以用于檢測(cè)輸出數(shù)據(jù)是否符合特定的格式要求,或者是否存在錯(cuò)誤或干擾。在數(shù)字集成電路中,輸出數(shù)據(jù)通常是通過輸出端口輸出的,因此需要在輸出端口處設(shè)計(jì)序列檢測(cè)電路。

內(nèi)部信號(hào):數(shù)字集成電路中的內(nèi)部信號(hào)通常是在芯片內(nèi)部傳遞的信號(hào),例如時(shí)鐘信號(hào)、地址信號(hào)、數(shù)據(jù)信號(hào)等。在這種情況下,序列檢測(cè)電路可以用于檢測(cè)內(nèi)部信號(hào)是否按照預(yù)期的序列進(jìn)行。

IC設(shè)計(jì)的過程中,不同的部分的序列檢測(cè)器檢測(cè)的序列和發(fā)揮的具體作用不盡心相同。因此在數(shù)字集成電路中,需要根據(jù)具體的應(yīng)用場(chǎng)景,針對(duì)不同的部分設(shè)計(jì)相應(yīng)的序列檢測(cè)電路。

二、狀態(tài)機(jī)法和寄存器法

對(duì)于序列檢測(cè)器的設(shè)計(jì),常規(guī)的設(shè)計(jì)方法有兩種:狀態(tài)機(jī)法和移位寄存器法。

狀態(tài)機(jī)法最重要的是明白狀態(tài)機(jī)狀態(tài)的轉(zhuǎn)移過程:在數(shù)據(jù)輸入之后判斷是否匹配,若匹配則進(jìn)入下一狀態(tài),不匹配則根據(jù)輸入的數(shù)據(jù)具體判斷進(jìn)入的下一狀態(tài)(也有可能保持在原來的狀態(tài))。狀態(tài)機(jī)設(shè)計(jì)過程一定要注重狀態(tài)的數(shù)量和狀態(tài)轉(zhuǎn)移以及狀態(tài)轉(zhuǎn)移條件,避免狀態(tài)的缺失以及狀態(tài)轉(zhuǎn)移的不合理循環(huán)。

移位寄存器法法基本原理是數(shù)據(jù)的移位和移位數(shù)據(jù)的對(duì)比:首先將對(duì)應(yīng)的初始數(shù)據(jù)緩存在寄存器中作為一個(gè)數(shù)組,數(shù)據(jù)輸入后置于于數(shù)組的末尾,數(shù)組其它元素左移,把最早輸入的數(shù)據(jù)移出,每輸入一個(gè)數(shù)據(jù)后刷新一次。然后將數(shù)組和目標(biāo)序列對(duì)比,如果數(shù)組和目標(biāo)序列相等,則說明出現(xiàn)目標(biāo)序列。

2.1狀態(tài)機(jī)法2.11 使用狀態(tài)機(jī)檢測(cè)“1001”

題目:設(shè)計(jì)一個(gè)序列檢測(cè)器,用來檢測(cè)序列1001,用_狀態(tài)機(jī)完成電路,可重復(fù)檢測(cè)_序列1001(即本文第三部分的重疊檢測(cè))。

第一步,分析狀態(tài)機(jī)狀態(tài)轉(zhuǎn)移,分析如下:

IDLE: 初始狀態(tài),代表目前沒有接收到滿足要求的數(shù)據(jù)。

seq_in = 1時(shí),等于1001中的第一個(gè)數(shù),進(jìn)入S1狀態(tài);

seq_in = 0時(shí),保持狀態(tài)。

S1:代表目前已經(jīng)有了1個(gè)匹配的數(shù)據(jù)。

seq_in = 0時(shí),當(dāng)前序列為10,等于1001中的前兩個(gè)數(shù),進(jìn)入S2狀態(tài);

seq_in = 1時(shí),當(dāng)前序列為11,不是1001的前兩個(gè)數(shù),但1是1001的第一個(gè)數(shù),所以保持S1狀態(tài)。

S2:代表目前已經(jīng)有了2個(gè)匹配的數(shù)據(jù)。

seq_in = 0時(shí),當(dāng)前序列為100,等于1001中的前三個(gè)數(shù),進(jìn)入S3狀態(tài);

seq_in = 1時(shí),當(dāng)前序列為101,不是1001的前三個(gè)數(shù),但1是1001的第一個(gè)數(shù),所以進(jìn)入S1狀態(tài)。

S3:代表目前已經(jīng)有了3個(gè)匹配的數(shù)據(jù)。

seq_in = 1時(shí),當(dāng)前序列為1001,與要求序列匹配,進(jìn)入S4狀態(tài);

seq_in = 0時(shí),當(dāng)前序列為1000,與要求序列不配,0與初始狀態(tài)匹配,所以進(jìn)入IDLE狀態(tài)。

S4:最終狀態(tài),代表目前已經(jīng)得到了匹配的序列,輸出信號(hào)翻轉(zhuǎn)。

seq_in = 1時(shí),當(dāng)前序列為10011,1與要求序列的第一個(gè)數(shù)匹配,所以進(jìn)入S1狀態(tài);

seq_in = 0時(shí),當(dāng)前序列為10010,10與要求的前兩個(gè)數(shù)匹配,所以進(jìn)入S2狀態(tài)。

第二步:根據(jù)流程轉(zhuǎn)換分析畫出狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)移圖,如下圖所示:

chaijie_default.png

第三步:根據(jù)狀態(tài)機(jī)轉(zhuǎn)移圖用經(jīng)典三段式(或者二段式)寫出verilog代碼

2.12 verilog代碼//使用狀態(tài)機(jī)設(shè)計(jì)檢測(cè)“1001”的序列檢測(cè)器

//可重疊檢測(cè)序列“1001”

module sequence_detect01(

input clk,

input rst_n,

input seq_in,

output mismatch//檢驗(yàn)序列是否匹配,匹配輸出0,不匹配輸出0

);

//采用獨(dú)熱碼編譯五個(gè)狀態(tài),初始IDLE狀態(tài)為待機(jī)狀態(tài)

//獨(dú)熱碼相比二進(jìn)制碼和格雷碼,方便電路設(shè)計(jì)判斷、狀態(tài)轉(zhuǎn)移,且邏輯更簡(jiǎn)單

parameter IDLE = 5'b00001;

parameter S1 = 5'b00010;

parameter S2 = 5'b00100;

parameter S3 = 5'b01000;

parameter S4 = 5'b10000;

//定義兩個(gè)寄存器表示狀態(tài)機(jī)的目前狀態(tài)和下一狀態(tài)

reg [4:0] curr_state;

reg [4:0] next_state;

//第一段使用時(shí)序邏輯描述狀態(tài)轉(zhuǎn)移

always@(posedge clk or negedge rst_n) begin

if(!rst_n) begin

curr_state <= IDLE;

end

else begin

curr_state <= next_state;

end

end

//第二段使用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件

always@(*) begin

if(!rst_n) begin

next_state <= IDLE;

end

else begin

case(curr_state)

IDLE :next_state = seq_in?S1:IDLE;

S1 :next_state = seq_in?S1:S2;

S2 :next_state = seq_in?S1:S3;

S3 :next_state = seq_in?S4:IDLE;

S4 :next_state = seq_in?S1:S2;

default:next_state = IDLE;//養(yǎng)成良好代碼風(fēng)格,不能遺漏,防生成latch,也可以通過賦初值避免

endcase

end

end

//第三段描述狀態(tài)輸出(可以使用組合邏輯,也可以用時(shí)序邏輯)

//此處采用組合邏輯,同時(shí)也提供時(shí)序邏輯代碼示例

assign mismatch = (curr_state ==S4) ? 1'b0 : 1'b1;//組合邏輯描述輸出

/*

//時(shí)序邏輯描述輸出

always@(posedge clk or negedge rst_n) begin

if(!rst_n) begin

mismatch <= 1'b1;

end

else if(next_state == S4) begin

mismatch <= 1'b0;

end

else begin

mismatch <= 1'b1;

end

end

*/

endmodule

2.13 testbench`timescale 1ns/1ps//仿真時(shí)間單位1ns 仿真時(shí)間精度1ps

module sequence_detect01_tb();

//信號(hào)申明

reg clk;

reg rst_n;

reg seq_in;

wire mismatch;

//生成復(fù)位信號(hào)

//為時(shí)鐘信號(hào)和復(fù)位信號(hào)賦初值

initial begin

clk = 0;

rst_n = 1;

seq_in = 1;

#5 rst_n = 0;

#10 rst_n = 1;

end

always #6 seq_in = $random;//生成隨機(jī)數(shù)作為信號(hào)輸入

always #5 clk = ~clk;//生成時(shí)鐘信號(hào)

//模塊實(shí)例化(將申明的信號(hào)連接起來即可)

sequence_detect01 u_sequence_detect01

(.clk (clk),

.rst_n (rst_n),

.seq_in (seq_in),

.mismatch (mismatch)

);

endmodule

2.14仿真結(jié)果

)

Testbench中采用隨機(jī)數(shù)來驗(yàn)證序列檢測(cè)器的準(zhǔn)確性,當(dāng)時(shí)間來到705ns,隨機(jī)數(shù)連續(xù)輸出1001,mismatch在接收四位數(shù)字進(jìn)行信號(hào)翻轉(zhuǎn)。

2.2移位寄存器法2.21 使用移位寄存器法檢測(cè)1001

題目:設(shè)計(jì)一個(gè)序列檢測(cè)器,用來檢測(cè)序列 1001,用_移位寄存器_完成電路設(shè)計(jì)。

移位寄存器方法比較簡(jiǎn)單。設(shè)置一個(gè)和序列等長(zhǎng)的寄存器,在數(shù)據(jù)輸入后將輸入移入寄存器的最低位,并判斷寄存器中的值是否與序列相同。因?yàn)橐莆患拇嫫鞯?a href="http://www.brongaenegriffin.com/v/tag/773/" target="_blank">工作原理,設(shè)計(jì)出來的序列檢測(cè)器可以重疊檢測(cè)序列。

2.22 verilog代碼//使用移位寄存器設(shè)計(jì)檢測(cè)“1001”的序列檢測(cè)器

//可重疊檢測(cè)序列“1001”

module sequence_detect02(

input clk,

input rst_n,

input seq_in,

output regmismatch//時(shí)序邏輯中需要定義為reg型

);

reg [3:0] seq_in_r;//定義一個(gè)寄存器緩存數(shù)據(jù)

//使用時(shí)序邏輯完成復(fù)位和移位寄存器移位過程

always@(posedge clk or negedge rst_n) begin

if (!rst_n) begin

seq_in_r <= 4'b0;//中間寄存器復(fù)位

end

else begin

seq_in_r <= {seq_in_r[2:0],seq_in};//輸入數(shù)據(jù)置于數(shù)組右端,移位寄存器左移位

end

end

//使用時(shí)序邏輯完成復(fù)位與輸出

always@(posedge clk or negedge rst_n) begin

if (!rst_n) begin

mismatch <= 1'b1;

end

else if (seq_in_r == 4'b1001) begin//若檢測(cè)到1001則將mismatch置1,表明檢測(cè)到序列1001

mismatch <= 1'b0;

end

else begin

mismatch <= 1'b1;//養(yǎng)成良好代碼風(fēng)格,不能遺漏,防生成latch,可通過賦初值避免

end

end

endmodule

2.23 testbench`timescale 1ns/1ps//仿真時(shí)間單位1ns 仿真時(shí)間精度1ps

module sequence_detect02_tb;

//信號(hào)申明

regclk;

reg rst_n;

regseq_in;

wire mismatch;

//復(fù)位信號(hào)生成

//時(shí)鐘信號(hào)與復(fù)位信號(hào)賦初值

initial begin

clk = 0;

rst_n = 1;

seq_in = 1;

#5 rst_n = 0;

#10 rst_n = 1;

end

always #6 seq_in = $random;//生成隨機(jī)數(shù)作為信號(hào)輸入

always #5 clk = ~clk;//生成時(shí)鐘信號(hào)

//模塊實(shí)例化(將申明的信號(hào)連接起來即可)

sequence_detect01 u_sequence_detect01

(.clk (clk),

.rst_n (rst_n),

.seq_in (seq_in),

.mismatch (mismatch)

);

endmodule

2.24仿真結(jié)果

Testbench中采用隨機(jī)數(shù)來驗(yàn)證序列檢測(cè)器的準(zhǔn)確性,當(dāng)時(shí)間來到705ns,隨機(jī)數(shù)連續(xù)輸出1001,mismatch在接收四位數(shù)字且在時(shí)鐘上升沿進(jìn)行信號(hào)翻轉(zhuǎn)。

三、重疊檢測(cè)與非重疊檢測(cè)(檢測(cè)序列1001)

數(shù)字IC序列檢測(cè)中的重疊檢測(cè)和非重疊檢測(cè)是兩種不同的檢測(cè)方式。

重疊檢測(cè)是指在一個(gè)序列中,子序列之間會(huì)有部分重疊的情況,而重疊區(qū)域也需要進(jìn)行檢測(cè),并被判定為單獨(dú)的子序列。

非重疊檢測(cè)則是指在一個(gè)序列中,每個(gè)子序列之間沒有重疊部分,因此只需要檢測(cè)每個(gè)子序列本身是否滿足特定的條件即可。

3.1重疊檢測(cè)3.11 重疊檢測(cè)方法

題目:設(shè)計(jì)一個(gè)序列檢測(cè)器,用來檢測(cè)序列 1001,用_狀態(tài)機(jī)完成電路,可重復(fù)檢測(cè)_序列1001

第一步,分析狀態(tài)機(jī)狀態(tài)轉(zhuǎn)移,分析如下:

IDLE: 初始狀態(tài),代表目前沒有接收到滿足要求的數(shù)據(jù)。

seq_in = 1時(shí),等于1001中的第一個(gè)數(shù),進(jìn)入S1狀態(tài);

seq_in = 0時(shí),保持狀態(tài)。

S1:代表目前已經(jīng)有了1個(gè)匹配的數(shù)據(jù)。

seq_in = 0時(shí),當(dāng)前序列為10,等于1001中的前兩個(gè)數(shù),進(jìn)入S2狀態(tài);

seq_in = 1時(shí),當(dāng)前序列為11,不是1001的前兩個(gè)數(shù),但1是1001的第一個(gè)數(shù),所以保持S1狀態(tài)。

S2:代表目前已經(jīng)有了2個(gè)匹配的數(shù)據(jù)。

seq_in = 0時(shí),當(dāng)前序列為100,等于1001中的前三個(gè)數(shù),進(jìn)入S3狀態(tài);

seq_in = 1時(shí),當(dāng)前序列為101,不是1001的前三個(gè)數(shù),但1是1001的第一個(gè)數(shù),所以進(jìn)入S1狀態(tài)。

S3:代表目前已經(jīng)有了3個(gè)匹配的數(shù)據(jù)。

seq_in = 1時(shí),當(dāng)前序列為1001,與要求序列匹配,進(jìn)入S4狀態(tài);

seq_in = 0時(shí),當(dāng)前序列為1000,與要求序列不配,0與初始狀態(tài)匹配,所以進(jìn)入IDLE狀態(tài)。

S4:最終狀態(tài),代表目前已經(jīng)得到了匹配的序列,輸出信號(hào)翻轉(zhuǎn)。

seq_in = 1時(shí),當(dāng)前序列為10011,1與要求序列的第一個(gè)數(shù)匹配,所以進(jìn)入S1狀態(tài);

seq_in = 0時(shí),當(dāng)前序列為10010,10與要求的前兩個(gè)數(shù)匹配,所以進(jìn)入S2狀態(tài)。

第二步:根據(jù)流程轉(zhuǎn)換分析畫出狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)移圖,如下圖所示:

第三步:根據(jù)狀態(tài)機(jī)轉(zhuǎn)移圖用經(jīng)典三段式(或者二段式)寫出verilog代碼

3.12verilog代碼//使用狀態(tài)機(jī)設(shè)計(jì)檢測(cè)“1001”的序列檢測(cè)器

//可重疊檢測(cè)序列“1001”

module sequence_detect03(

inputclk ,

inputrst_n,

inputseq_in,

output reg mismatch//檢驗(yàn)序列是否匹配,匹配輸出0,不匹配輸出0

);

//采用獨(dú)熱碼編譯五個(gè)狀態(tài),初始IDLE狀態(tài)為待機(jī)狀態(tài)

//獨(dú)熱碼相比二進(jìn)制碼和格雷碼,方便電路設(shè)計(jì)判斷、狀態(tài)轉(zhuǎn)移,且邏輯更簡(jiǎn)單

parameterIDLE = 5'b00001;

parameter S1 = 5'b00010;

parameter S2 = 5'b00100;

parameter S3 = 5'b01000;

parameter S4 = 5'b10000;

//定義兩個(gè)寄存器表示狀態(tài)機(jī)的目前狀態(tài)和下一狀態(tài)

reg [4:0] curr_state;

reg [4:0] next_state;

//第一段使用時(shí)序邏輯描述狀態(tài)轉(zhuǎn)移

always@(posedge clk or negedge rst_n) begin

if(!rst_n) begin

curr_state <= IDLE;

end

else begin

curr_state <= next_state;

end

end

//第二段使用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件

always@(*) begin

if(!rst_n) begin

next_state <= IDLE;

end

else begin

case(curr_state)

IDLE :next_state = seq_in?S1:IDLE;

S1 :next_state = seq_in?S1:S2;

S2 :next_state = seq_in?S1:S3;

S3 :next_state = seq_in?S4:IDLE;

S4 :next_state = seq_in?S1:S2;

default:next_state = IDLE;//養(yǎng)成良好代碼風(fēng)格,不能遺漏,防生成latch,也可以通過賦初值避免

endcase

end

end

//第三段描述狀態(tài)輸出(可以使用組合邏輯,也可以用時(shí)序邏輯)

//此處采用時(shí)序邏輯,同時(shí)也提供組合邏輯代碼示例

always@(posedge clk or negedge rst_n) begin//時(shí)序邏輯描述輸出

if(!rst_n) begin

mismatch <= 1'b1;

end

else if(next_state == S4) begin

mismatch <= 1'b0;

end

else begin

mismatch <= 1'b1;

end

end

//assign mismatch = (curr_state ==S4) ? 1'b0 : 1'b1;//組合邏輯描述輸出

endmodule

3.13Testbench`timescale 1ns/1ps//仿真時(shí)間單位1ns 仿真時(shí)間精度1ps

module sequence_detect03_tb();

//信號(hào)申明

regclk;

regrst_n;

regseq_in;

wiremismatch;

//復(fù)位信號(hào)生成

//輸入信號(hào)生成,輸入信號(hào)為“1001001001001”

//時(shí)鐘信號(hào)與復(fù)位信號(hào)賦初值

initial begin

clk = 0;

rst_n = 1;

#5 rst_n = 0;

#10 rst_n = 1;

seq_in = 1;#10;

seq_in = 0;#10;

seq_in = 0;#10;

seq_in = 1;#10;

seq_in = 0;#10;

seq_in = 0;#10;

seq_in = 1;#10;

seq_in = 0;#10;

seq_in = 0;#10;

seq_in = 1;#10;

seq_in = 0;#10;

seq_in = 0;#10;

seq_in = 1;#10;

end

//時(shí)鐘信號(hào)生成

always #5 clk = ~clk;

//模塊實(shí)例化(將申明的信號(hào)連接起來即可)

sequence_detect03 u_sequence_detect03(

.clk(clk),

.rst_n(rst_n),

.seq_in(seq_in),

.mismatch(mismatch)

);

endmodule

3.14仿真結(jié)果

輸入序列1001001001001,根據(jù)可重復(fù)檢測(cè)理論上可檢測(cè)四次信號(hào)翻轉(zhuǎn),從仿真結(jié)果可以看到mismatch發(fā)生四次翻轉(zhuǎn),且第二次翻轉(zhuǎn)的1001中的第一個(gè)1來自第一組1001中最后一個(gè)1,即發(fā)生重疊亦可檢測(cè)。

3.2非重疊檢測(cè)3.21 非重疊檢測(cè)方法

題目:設(shè)計(jì)一個(gè)序列檢測(cè)器,用來檢測(cè)序列 1001,用狀態(tài)機(jī)完成電路,可重復(fù)檢測(cè)序列1001

第一步,分析狀態(tài)機(jī)狀態(tài)轉(zhuǎn)移,分析如下:

IDLE: 初始狀態(tài),代表目前沒有接收到滿足要求的數(shù)據(jù)。

seq_in = 1時(shí),等于1001中的第一個(gè)數(shù),進(jìn)入S1狀態(tài);

seq_in = 0時(shí),保持狀態(tài)。

S1:代表目前已經(jīng)有了1個(gè)匹配的數(shù)據(jù)。

seq_in = 0時(shí),當(dāng)前序列為10,等于1001中的前兩個(gè)數(shù),進(jìn)入S2狀態(tài);

seq_in = 1時(shí),當(dāng)前序列為11,不是1001的前兩個(gè)數(shù),但1是1001的第一個(gè)數(shù),所以保持S1狀態(tài)。

S2:代表目前已經(jīng)有了2個(gè)匹配的數(shù)據(jù)。

seq_in = 0時(shí),當(dāng)前序列為100,等于1001中的前三個(gè)數(shù),進(jìn)入S3狀態(tài);

seq_in = 1時(shí),當(dāng)前序列為101,不是1001的前三個(gè)數(shù),但1是1001的第一個(gè)數(shù),所以進(jìn)入S1狀態(tài)。

S3:代表目前已經(jīng)有了3個(gè)匹配的數(shù)據(jù)。

seq_in = 1時(shí),當(dāng)前序列為1001,與要求序列匹配,進(jìn)入S4狀態(tài);

seq_in = 0時(shí),當(dāng)前序列為1000,與要求序列不配,0與初始狀態(tài)匹配,所以進(jìn)入IDLE狀態(tài)。

S4:最終狀態(tài),代表目前已經(jīng)得到了匹配的序列,輸出信號(hào)翻轉(zhuǎn)。

seq_in = 1時(shí),當(dāng)前序列為10011,1與要求序列的第一個(gè)數(shù)匹配,所以進(jìn)入S1狀態(tài);

seq_in = 0時(shí),當(dāng)前序列為10010,10與要求的前兩個(gè)數(shù)匹配,但是要求非重疊檢測(cè),所以進(jìn)入IDLE狀態(tài)。

第二步:根據(jù)流程轉(zhuǎn)換分析畫出狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)移圖,如下圖所示

第三步:根據(jù)狀態(tài)機(jī)轉(zhuǎn)移圖用經(jīng)典三段式(或者二段式)寫出verilog代碼

3.22verilog代碼//使用狀態(tài)機(jī)設(shè)計(jì)檢測(cè)“1001”的序列檢測(cè)器

//非重疊檢測(cè)序列“1001”

module sequence_detect04(

inputclk ,

inputrst_n,

inputseq_in,

output reg mismatch//檢驗(yàn)序列是否匹配,匹配輸出0,不匹配輸出0

);

//采用獨(dú)熱碼編譯五個(gè)狀態(tài),初始IDLE狀態(tài)為待機(jī)狀態(tài)

//獨(dú)熱碼相比二進(jìn)制碼和格雷碼,方便電路設(shè)計(jì)判斷、狀態(tài)轉(zhuǎn)移,且邏輯更簡(jiǎn)單

parameter IDLE = 5'b00001;

parameter S1 = 5'b00010;

parameter S2 = 5'b00100;

parameter S3 = 5'b01000;

parameter S4 = 5'b10000;

//定義兩個(gè)寄存器表示狀態(tài)機(jī)的目前狀態(tài)和下一狀態(tài)

reg [4:0] curr_state;

reg [4:0] next_state;

//第一段使用時(shí)序邏輯描述狀態(tài)轉(zhuǎn)移

always@(posedge clk or negedge rst_n) begin

if(!rst_n) begin

curr_state <= IDLE;

end

else begin

curr_state <= next_state;

end

end

//第二段使用組合邏輯判斷狀態(tài)轉(zhuǎn)移條件

always@(*) begin

if(!rst_n) begin

next_state <= IDLE;

end

else begin

case(curr_state)

IDLE :next_state = seq_in?S1:IDLE;

S1 :next_state = seq_in?S1:S2;

S2 :next_state = seq_in?S1:S3;

S3 :next_state = seq_in?S4:IDLE;

S4 :next_state = seq_in?S1:IDLE;

default:next_state = IDLE;//養(yǎng)成良好代碼風(fēng)格,不能遺漏,防生成latch,也可以通過賦初值避免

endcase

end

end

//第三段描述狀態(tài)輸出(可以使用組合邏輯,也可以用時(shí)序邏輯)

//此處采用時(shí)序邏輯,同時(shí)也提供組合邏輯代碼示例

always@(posedge clk or negedge rst_n) begin//時(shí)序邏輯描述輸出

if(!rst_n) begin

mismatch <= 1'b1;

end

else if(next_state == S4) begin

mismatch <= 1'b0;

end

else begin

mismatch <= 1'b1;

end

end

//assign mismatch = (curr_state ==S4) ? 1'b0 : 1'b1;//組合邏輯描述輸出

endmodule

3.23Testbench`timescale 1ns/1ps//仿真時(shí)間單位1ns 仿真時(shí)間精度1ps

module sequence_detect04_tb();

//信號(hào)申明

regclk;

regrst_n;

regseq_in;

wiremismatch;

//復(fù)位信號(hào)生成

//輸入信號(hào)生成,輸入信號(hào)為“1001001001001”

//時(shí)鐘信號(hào)與復(fù)位信號(hào)賦初值

initial begin

clk = 0;

rst_n = 1;

#5 rst_n = 0;

#10 rst_n = 1;

seq_in = 1;#10;

seq_in = 0;#10;

seq_in = 0;#10;

seq_in = 1;#10;

seq_in = 0;#10;

seq_in = 0;#10;

seq_in = 1;#10;

seq_in = 0;#10;

seq_in = 0;#10;

seq_in = 1;#10;

seq_in = 0;#10;

seq_in = 0;#10;

seq_in = 1;#10;

end

//時(shí)鐘信號(hào)生成

always #5 clk = ~clk;

//模塊實(shí)例化(將申明的信號(hào)連接起來即可)

sequence_detect04 u_sequence_detect04(

.clk(clk),

.rst_n(rst_n),

.seq_in(seq_in),

.mismatch(mismatch)

);

endmodule

3.24仿真結(jié)果

輸入序列1001001001001,根據(jù)可不重疊檢測(cè)理論上可檢測(cè)兩次信號(hào)翻轉(zhuǎn),從仿真結(jié)果可以看到mismatch發(fā)生兩次翻轉(zhuǎn),且第二組的1001中的第一個(gè)1來自第一組1001中最后一個(gè)1,即發(fā)生重疊不可檢測(cè),所以相比于重疊檢測(cè)少了第二次翻轉(zhuǎn)(同理第四次翻轉(zhuǎn)同樣不可發(fā)生)。

四、總結(jié)

狀態(tài)機(jī)法序列檢測(cè)器:一句話概括就是設(shè)計(jì)復(fù)雜、不易擴(kuò)展但是檢測(cè)模式靈活。相比使用移位寄存器來說的話,狀態(tài)機(jī)稍稍復(fù)雜些,主要體現(xiàn)在不易擴(kuò)展(重新檢測(cè)不同序列需重新設(shè)計(jì)狀態(tài)轉(zhuǎn)移)和狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)移判斷上;但是這樣也給狀態(tài)機(jī)帶來了優(yōu)點(diǎn) ,就是靈活性好,可以靈活處理輸入和輸出,因?yàn)闋顟B(tài)機(jī)具有可編程性。同時(shí)可以處理較為復(fù)雜的序列檢測(cè)任務(wù),因?yàn)闋顟B(tài)機(jī)可以支持多個(gè)狀態(tài)和轉(zhuǎn)換。

移位寄存器法:一句話概括就是設(shè)計(jì)簡(jiǎn)單、易于擴(kuò)展但是檢測(cè)模式呆板。相比于使用狀態(tài)機(jī)來說的話,只能處理簡(jiǎn)單的序列檢測(cè)任務(wù),因?yàn)樗鼪]有狀態(tài)機(jī)的多狀態(tài)和轉(zhuǎn)換功能。且輸入和輸出的靈活性差,因?yàn)榧拇嫫餍蛄幸莆患拇嫫魇枪潭ǖ?,檢測(cè)模式固定。但是優(yōu)勢(shì)很明顯,就是設(shè)計(jì)和開發(fā)相對(duì)簡(jiǎn)單,只需要幾個(gè)寄存器和邏輯門。且易于擴(kuò)展,如果要檢測(cè)另一個(gè)序列,只需要修改輸入數(shù)據(jù)。

模式選擇:前言部分提到了檢測(cè)模式包括重疊模式、連續(xù)模式、間隔模式等等。本文著重分析重疊與非重疊檢測(cè)模式,結(jié)論是重疊檢測(cè)模式可以用狀態(tài)機(jī)和移位寄存器設(shè)計(jì),非重疊檢測(cè)模式可以用靈活的狀態(tài)機(jī)設(shè)計(jì);本文都是基于默認(rèn)的連續(xù)檢測(cè)模式設(shè)計(jì),如果采用間隔檢測(cè)模式,處理方法是添加指示信號(hào)使能端,可以用狀態(tài)機(jī)和移位寄存器設(shè)計(jì)。因?yàn)樵O(shè)計(jì)邏輯簡(jiǎn)單,所以這部分省略,可自行參照第二部分代碼設(shè)計(jì)。

綜上所述,狀態(tài)機(jī)序列檢測(cè)器適用于處理較為復(fù)雜的序列檢測(cè)任務(wù),而寄存器序列移位寄存器適用于處理簡(jiǎn)單的序列檢測(cè)任務(wù)。在實(shí)際應(yīng)用中,應(yīng)根據(jù)具體的需求來選擇合適的序列檢測(cè)方法。

有你想看的精彩 至芯科技FPGA就業(yè)培訓(xùn)班——助你步入成功之路、8月12號(hào)西安中心開課、歡迎咨詢! FPGA學(xué)習(xí):阻塞賦值和非阻塞賦值的可綜合性 FPGA學(xué)習(xí):條件語句的可綜合性

掃碼加微信邀請(qǐng)您加入FPGA學(xué)習(xí)交流群

歡迎加入至芯科技FPGA微信學(xué)習(xí)交流群,這里有一群優(yōu)秀的FPGA工程師、學(xué)生、老師、這里FPGA技術(shù)交流學(xué)習(xí)氛圍濃厚、相互分享、相互幫助、叫上小伙伴一起加入吧!

點(diǎn)個(gè)在看你最好看


原文標(biāo)題:FPGA學(xué)習(xí)-序列檢測(cè)器

文章出處:【微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1645

    文章

    22050

    瀏覽量

    618535

原文標(biāo)題:FPGA學(xué)習(xí)-序列檢測(cè)器

文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    帶功率檢測(cè)器的 5 GHz 前端模塊 skyworksinc

    電子發(fā)燒友網(wǎng)為你提供()帶功率檢測(cè)器的 5 GHz 前端模塊相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有帶功率檢測(cè)器的 5 GHz 前端模塊的引腳圖、接線圖、封裝手冊(cè)、中文資料、英文資料,帶功率檢測(cè)器的 5 GHz 前端模塊真值表,帶功率
    發(fā)表于 06-19 18:35
    帶功率<b class='flag-5'>檢測(cè)器</b>的 5 GHz 前端模塊 skyworksinc

    汽車行業(yè)專用雙張檢測(cè)器防雙張檢測(cè)-阿童木金屬雙張檢測(cè)器# 汽車#雙料

    檢測(cè)器
    阿童木(廣州)智能科技有限公司
    發(fā)布于 :2025年03月12日 14:12:32

    小家電部件沖壓疊料檢測(cè)應(yīng)用案例-阿童木金屬雙張檢測(cè)器# 家電# 沖壓# 傳感# 金屬雙張檢測(cè)器

    檢測(cè)器
    阿童木(廣州)智能科技有限公司
    發(fā)布于 :2025年02月17日 15:28:29

    壓力檢測(cè)器有哪些優(yōu)勢(shì)

    在現(xiàn)代工業(yè)與基礎(chǔ)設(shè)施管理中,壓力檢測(cè)器作為監(jiān)測(cè)與控制系統(tǒng)的關(guān)鍵組件,扮演著重要的角色。壓力檢測(cè)器集高精度、高穩(wěn)定性與便捷操作于一體,在供水、排水、消防水系統(tǒng)、輸油管道、輸氣管道等多個(gè)領(lǐng)域,為設(shè)備的穩(wěn)定運(yùn)行與工業(yè)安全提供有力保障。
    的頭像 發(fā)表于 01-07 17:09 ?729次閱讀

    小單探頭金屬單雙張檢測(cè)器

    檢測(cè)器
    阿童木(廣州)智能科技有限公司
    發(fā)布于 :2024年12月24日 15:03:14

    金屬雙張檢測(cè)器+光纖傳感檢測(cè)瓶子瓶蓋內(nèi)墊片數(shù)量

    檢測(cè)器
    阿童木(廣州)智能科技有限公司
    發(fā)布于 :2024年10月22日 16:17:27

    高效液相色譜儀的檢測(cè)器有哪些

    高效液相色譜儀(HPLC)是一種廣泛應(yīng)用于化學(xué)分析、生物醫(yī)藥、環(huán)境監(jiān)測(cè)等領(lǐng)域的分離和檢測(cè)技術(shù)。HPLC的檢測(cè)器是整個(gè)系統(tǒng)的關(guān)鍵部分,它能夠?qū)⑸V柱分離出的組分轉(zhuǎn)化為可測(cè)量的信號(hào),從而實(shí)現(xiàn)對(duì)樣品的定量
    的頭像 發(fā)表于 08-08 10:43 ?3109次閱讀

    熒光檢測(cè)器用的是什么燈光

    熒光檢測(cè)器是一種利用熒光現(xiàn)象進(jìn)行物質(zhì)檢測(cè)的儀器,廣泛應(yīng)用于生物、化學(xué)、醫(yī)學(xué)等領(lǐng)域。熒光檢測(cè)器的核心部件是熒光光源,它為熒光檢測(cè)提供了必要的激發(fā)光。 一、熒光
    的頭像 發(fā)表于 08-08 10:38 ?1713次閱讀

    熒光檢測(cè)器適用范圍有哪些

    、材料科學(xué)等多個(gè)方面。 一、生物分子檢測(cè) 核酸檢測(cè) 熒光檢測(cè)器在核酸檢測(cè)中具有重要應(yīng)用,如DNA測(cè)序、基因表達(dá)分析、基因突變檢測(cè)等。熒光標(biāo)記
    的頭像 發(fā)表于 08-08 10:35 ?2373次閱讀

    熒光檢測(cè)器用來檢測(cè)什么物質(zhì)

    熒光檢測(cè)器是一種利用熒光現(xiàn)象進(jìn)行物質(zhì)檢測(cè)的儀器,廣泛應(yīng)用于化學(xué)、生物學(xué)、醫(yī)學(xué)、環(huán)境科學(xué)等領(lǐng)域。 一、熒光檢測(cè)器的工作原理 熒光檢測(cè)器的工作原理基于熒光現(xiàn)象。熒光是一種特殊的光致發(fā)光現(xiàn)象
    的頭像 發(fā)表于 08-08 10:34 ?2002次閱讀

    熒光檢測(cè)器激發(fā)波長(zhǎng)和發(fā)射波長(zhǎng)怎么設(shè)置

    熒光檢測(cè)器是一種常用的生物化學(xué)分析儀器,廣泛應(yīng)用于蛋白質(zhì)、核酸、細(xì)胞等生物分子的定量、定性和定位分析。熒光檢測(cè)器的工作原理是利用熒光物質(zhì)在特定波長(zhǎng)下吸收光能,然后以較長(zhǎng)波長(zhǎng)的形式釋放出來,通過測(cè)量
    的頭像 發(fā)表于 08-08 10:31 ?6674次閱讀

    【「時(shí)間序列與機(jī)器學(xué)習(xí)」閱讀體驗(yàn)】全書概覽與時(shí)間序列概述

    如何通過根因分析技術(shù)獲得導(dǎo)致故障的維度和元素,包括基于時(shí)間序列異常檢測(cè)算法的根因分析、基于熵的根因分析、基于樹模型的根因分析、規(guī)則學(xué)習(xí)等。 ●第7章“智能運(yùn)維的應(yīng)用場(chǎng)景”:介紹智能運(yùn)維領(lǐng)域的應(yīng)用,包括
    發(fā)表于 08-07 23:03

    電路檢測(cè)器檢查電池是否有電怎么判斷

    了解如何使用電路檢測(cè)器檢查電池是否有電是一項(xiàng)重要的技能,尤其是在需要確保設(shè)備正常運(yùn)行的情況下。本文將介紹電路檢測(cè)器的使用方法、電池的工作原理以及如何判斷電池是否有電。 第一部分:電路檢測(cè)器的基本知識(shí)
    的頭像 發(fā)表于 07-19 17:14 ?2696次閱讀

    電流檢測(cè)器有什么和什么組成

    電流檢測(cè)器是一種用于檢測(cè)電流大小的電子設(shè)備,廣泛應(yīng)用于電力系統(tǒng)、工業(yè)自動(dòng)化、家用電器等領(lǐng)域。 一、電流檢測(cè)器的組成 電流檢測(cè)器主要由以下幾個(gè)部分組成: 電流傳感
    的頭像 發(fā)表于 07-19 17:12 ?2016次閱讀

    電路檢測(cè)器和電流檢測(cè)器的區(qū)別

    1. 引言 電路檢測(cè)器和電流檢測(cè)器是電子工程中常用的工具,它們幫助工程師和技術(shù)人員診斷和監(jiān)測(cè)電子設(shè)備的性能。 2. 電路檢測(cè)器 定義和功能 :電路檢測(cè)器是一種用于
    的頭像 發(fā)表于 07-19 16:34 ?2116次閱讀