Verilog語法_5(狀態機、modelsim自動化仿真高級部分和後仿真)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章