September 23, 2016
作者:dengshuai_super
出處:http://blog.csdn.net/dengshuai_super/article/details/52639392
聲明:轉載請註明作者及出處。
檢測11101序列,如果檢測到了這個序列輸出高脈衝
狀態遷移圖如圖所示:
//mealy.v
//檢測11101序列,如果檢測到了這個序列輸出高脈衝
module mealy(
input wire clk,
input wire rst_n,
input wire A,
output reg k
);
parameter S1=6'b00_0001;//二進制編碼,推薦用獨熱碼編碼
parameter S2=6'b00_0010;
parameter S3=6'b00_0100;
parameter S4=6'b00_1000;
parameter S5=6'b01_0000;
parameter S6=6'b10_0000;
reg [5:0] Curr_st;
//reg [5:0] Next_st;
//always @*
// Curr_st = Next_st;
always @(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
Curr_st<=S1;
else
case(Curr_st)
S1:if(A == 1'b1)
Curr_st <=S2;
else
Curr_st <=S1;
S2:if(A == 1'b1)
Curr_st <=S3;
else
Curr_st <=S1;
S3:if(A == 1'b1)
Curr_st <=S4;
else
Curr_st <=S1;
S4:if(A == 1'b0)
Curr_st <=S5;
S5:if(A == 1'b1)
Curr_st <=S6;
else
Curr_st <=S1;
S6:Curr_st <= S1;
default:Curr_st <=S1;
endcase
always @(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
k<=1'b0;
else if(Curr_st == S5 && A==1'b1)
k<=1'b1;
else
k<=1'b0;
endmodule
//tb_mealy.v
`timescale 1ns/1ns
module tb_mealy;
reg sclk,rst_n;
reg a_in;//隨機的信號
wire k_out;
initial begin
sclk = 0;
rst_n =0;
#100;
rst_n =1;
end
initial begin
#200;
rand_bit();
end
always #10 sclk <= ~sclk;
mealy mealy_inst(
.clk (sclk),
.rst_n (rst_n),
.A (a_in),
.k (k_out)
);
task rand_bit();
integer i;
begin
for(i=0;i<255;i=i+1)
begin
@(posedge sclk);
// a_in <= $random % 10;//產生 -10...9
// a_in <={$random}% 10;//產生 0...9
a_in <={$random}% 2;//產生 0..1
end
end
endtask
endmodule
#run.do
quit -sim
.main clear
vlib ./lib/
vlib ./lib/work_a/
vlib ./lib/design/
#邏輯庫映射到物理空間(地址)中去
vmap base_space ./lib/work_a/
vmap design ./lib/design/
#tb_mealy.v編譯到base_space 邏輯庫裏面,“-work”是編譯指令
#design/*.v編譯到design 邏輯庫裏面
vlog -work base_space ./tb_mealy.v
vlog -work design ./../design/*.v
#-t ns 運行仿真的時間精度是ns
#"vop"是啓動一個優化參數
#-L 邏輯庫名 是鏈接邏輯庫
#最後加testbench的頂層
vsim -t ns -voptargs=+acc -L base_space -L design base_space.tb_mealy
#添加波形
add wave -divider {tb_mealy_divider}
add wave tb_mealy/*
add wave -divider {mealy_divider}
#頂層/例化的名字/* 其中*號是通配符
add wave tb_mealy/mealy_inst/*
run 1us
仿真結果:
有紅線是因爲在tb_mealy.v裏面沒有對a_in 進行初始化。
可以在:
initial begin
a_in = 0;//在這裏賦初值後,紅線就會消失
#200;
rand_bit();
end
將run.do增加高級語句後:
quit -sim
.main clear
vlib ./lib/
vlib ./lib/work_a/
vlib ./lib/design/
#邏輯庫映射到物理空間(地址)中去
vmap base_space ./lib/work_a/
vmap design ./lib/design/
#tb_mealy.v編譯到base_space 邏輯庫裏面,“-work”是編譯指令
#design/*.v編譯到design 邏輯庫裏面
vlog -work base_space ./tb_mealy.v
vlog -work design ./../design/*.v
#-t ns 運行仿真的時間精度是ns
#"vop"是啓動一個優化參數
#-L 邏輯庫名 是鏈接邏輯庫
#最後加testbench的頂層
vsim -t ns -voptargs=+acc -L base_space -L design base_space.tb_mealy
#####添加虛擬信號
#####添加虛擬結構體,類似C語言的枚舉,注意每個關鍵字和名字和括號之間都由空格。
virtual type {
{01 S1}
{02 S2}
{04 S3}
{08 S4}
{10 S5}
{20 S6}
} vir_new_signal
#添加波形
add wave -divider {tb_mealy_divider}
add wave tb_mealy/*
add wave -divider {mealy_divider}
#頂層/例化的名字/* 其中*號是通配符
add wave tb_mealy/mealy_inst/*
#####創建一個vir_new_signal類型的信號,new_state是我們新創建的信號(把Curr_st強制轉化成vir_new_signal類型的信號)
virtual function {(vir_new_signal)tb_mealy/mealy_inst/Curr_st} new_state
add wave -color red tb_mealy/mealy_inst/new_state
run 1us
運行後結果爲:
後仿真
來源:至芯科技錄播課
https://ke.qq.com/user/index/index.html#cid=66019&term_id=100056181