原創 Verilog編寫 「1101 序列檢測器

2021-10-24 21:58:59 字數 2977 閱讀 1878

序列檢測器是時序數位電路中非常常見的設計之一。它的主要功能是將乙個指定的序列從數字碼流中識別出來。這裡給出乙個「1101」序列檢測器的verilog實現和testbench**。

★設計目標:「1101」序列檢測器

★eda:quartus 15.0

★**軟體:modelsim 10.1c

本序列檢測器共有4個bit位,每個bit占用乙個狀態,再加上結束狀態,故使用格雷碼定義5個狀態:

// 序列檢測器 狀態編碼(格雷碼)

localparam seq_idle = 3'b000;

localparam seq_state1 = 3'b001;

localparam seq_state2 = 3'b011;

localparam seq_state3 = 3'b010;

localparam seq_stop = 3'b110;

採用一段式狀態機,狀態轉移圖如下:

「1101」序列檢測器完整verilog**如下:

module	seq_detector(

// 輸入埠

input clk100m, // 輸入時鐘:100mhz

input rst_n, // 非同步復位:低電平復位

input data_in, // 輸入序列資料

// 輸出埠

output reg data_out // 輸出標誌

);// 序列檢測器 狀態編碼(格雷碼)

localparam seq_idle = 3'b000;

localparam seq_state1 = 3'b001;

localparam seq_state2 = 3'b011;

localparam seq_state3 = 3'b010;

localparam seq_stop = 3'b110;

reg[2:0] seq_state; // 狀態暫存器

// 序列檢測器 一段式狀態機

always@(posedge clk100m or negedge rst_n)begin

if(!rst_n)begin

data_out <= 1'b0;

seq_state <= seq_idle;

endelse begin

case(seq_state)

// idle 檢測bit1

seq_idle: begin

data_out <= 1'b0;

if(data_in)

seq_state <= seq_state1;

else

seq_state <= seq_idle;

end// 檢測bit2

seq_state1: begin

if(data_in)

seq_state <= seq_state2;

else

seq_state <= seq_idle;

end// 檢測bit3

seq_state2: begin

if(~data_in)

seq_state <= seq_state3;

else

seq_state <= seq_idle;

end// 檢測bit4

seq_state3: begin

if(data_in)begin

seq_state <= seq_stop;

data_out <= 1'b1;

endelse

seq_state <= seq_idle;

end// stop

seq_stop: begin

seq_state <= seq_idle;

data_out <= 1'b0;

endendcase

endendendmodule

testbench**如下:

`timescale 1ns/1ps

module seq_detector_tb;

reg clk100m;

reg rst_n;

reg[15:0] data;

wire data_in;

wire data_out;

// 訊號初始化

initial begin

clk100m = 0;

rst_n = 1;

#10 rst_n = 0;

#10 rst_n = 1;

// 生成序列

data = 15'b1101_0010_1101_1001;

end// 生成100mhz時鐘

always

#5 clk100m = ~clk100m;

// 序列在下降沿移位,在相鄰的上公升沿取樣

always@(negedge clk100m)

data = ;

// 序列輸出

assign data_in = data[15];

// rtl例化

seq_detector seq_detector_inst(

.clk100m(clk100m),

.rst_n(rst_n),

.data_in(data_in),

.data_out(data_out)

);endmodule

testbench中使用16位環形移位暫存器將既定的4組4bit序列從msb開始,依次一位一位地從 data 移出到 data_in 上並迴圈輸出,若檢測到序列 「1101「 則將data_out拉高乙個時鐘週期。

Verilog編寫通用模組

移位暫存器,alu,多路選擇器,二進位制乘法器,模n計數器,詹森計數器,引數化比較器,詹森解碼器 移位暫存器 module unishiftregister clk,reset,leftin,rightin,sel,loaddta,q parameter nbits 4 input clk,rese...

verilog 學習記(如何編寫assert)

我們在編寫c 的時候,一般測試的時候都要用assert進行判斷。那麼怎麼在verilog中進行assert判斷呢?大家知道,system verilog是包含有assert語句的,但是raw verilog沒有。既然verilog 沒有,那麼我們可以自己定義乙個module,一樣可以實現assert...

採用verilog編寫狀態機

如果使用的是system verilog,一定要使用列舉型來描述狀態機。使用引數 parameters 來對狀態機進行分配,因為引數會使得狀態機易讀以及減少編碼過程中的錯誤。儘管quartus ii能夠識別出整數,盡量不要直接使用整數來定義狀態值。在狀態轉換邏輯中,不要使用狀態暫存器進行算術運算,例...