序列檢測器是時序數位電路中非常常見的設計之一。它的主要功能是將乙個指定的序列從數字碼流中識別出來。這裡給出乙個「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能夠識別出整數,盡量不要直接使用整數來定義狀態值。在狀態轉換邏輯中,不要使用狀態暫存器進行算術運算,例...