在通常的modelsim波形仿真中,狀態(tài)機的顯示為16進制,如 3‘h1。如下圖所示str_cur為狀態(tài)跳變信號。
為了更加直觀的以文本形式顯示狀態(tài)機的跳變,如自己定義的IDLE等,我們可以使用
virtual typevirtual function
狀態(tài)機源文件:
//vending-machine// 2 yuan for a bottle of drink// only 2 coins supported: 5 jiao and 1 yuan// finish the function of selling and changing
module vending_machine ( input clk , input rstn , input [1:0] coin , //01 for 0.5 jiao, 10 for 1 yuan
output [1:0] change , output sell //output the drink );
//machine state decode parameter IDLE = 3‘d0 ; parameter GET05 = 3’d1 ; parameter GET10 = 3‘d2 ; parameter GET15 = 3’d3 ;
//machine variable reg [2:0] st_cur ;
//(1) using one state-variable do describe reg [1:0] change_r ; reg sell_r ; always @(posedge clk or negedge rstn) begin if (!rstn) begin st_cur 《= ‘b0 ; change_r 《= 2’b0 ; sell_r 《= 1‘b0 ; end else begin case(st_cur)
IDLE: begin change_r 《= 2’b0 ; sell_r 《= 1‘b0 ; case (coin) 2’b01: st_cur 《= GET05 ; 2‘b10: st_cur 《= GET10 ; endcase end GET05: begin case (coin) 2’b01: st_cur 《= GET10 ; 2‘b10: st_cur 《= GET15 ; endcase end
GET10: case (coin) 2’b01: begin st_cur 《= GET15 ; end 2‘b10: begin st_cur 《= IDLE ; sell_r 《= 1’b1 ; end endcase
GET15: case (coin) 2‘b01: begin st_cur 《= IDLE ; sell_r 《= 1’b1 ; end 2‘b10: begin st_cur 《= IDLE ; change_r 《= 2’b1 ; sell_r 《= 1‘b1 ; end endcase
default: begin st_cur 《= IDLE ; end
endcase // case (st_cur) end // else: !if(!rstn) end
assign sell = sell_r ; assign change = change_r ;
endmodule
仿真頂層文件:
`timescale 1ns/1ps
module tb_vending_machine;
reg clk; reg rstn ; reg [1:0] coin ; wire [1:0] change ; wire sell ;
//clock generating parameter CYCLE_200MHz = 10 ; // always begin clk = 0 ; #(CYCLE_200MHz/2) ; clk = 1 ; #(CYCLE_200MHz/2) ; end
//motivation generating reg [9:0] buy_oper ; //store state of the buy operation initial begin buy_oper = ’h0 ; coin = 2‘h0 ; rstn = 1’b0 ; #8 rstn = 1‘b1 ; @(negedge clk) ;
//case(1) 0.5 -》 0.5 -》 0.5 -》 0.5 #16 ; buy_oper = 10’b00_0101_0101 ; repeat(5) begin @(negedge clk) ; coin = buy_oper[1:0] ; buy_oper = buy_oper 》》 2 ; end
//case(2) 1 -》 0.5 -》 1, taking change #16 ; buy_oper = 10‘b00_0010_0110 ; repeat(5) begin @(negedge clk) ; coin = buy_oper[1:0] ; buy_oper = buy_oper 》》 2 ; end
//case(3) 0.5 -》 1 -》 0.5 #16 ; buy_oper = 10’b00_0001_1001 ; repeat(5) begin @(negedge clk) ; coin = buy_oper[1:0] ; buy_oper = buy_oper 》》 2 ; end
//case(4) 0.5 -》 0.5 -》 0.5 -》 1, taking change #16 ; buy_oper = 10‘b00_1001_0101 ; repeat(5) begin @(negedge clk) ; coin = buy_oper[1:0] ; buy_oper = buy_oper 》》 2 ; end end
vending_machine u_mealy ( .clk (clk), .rstn (rstn), .coin (coin), .change (change), .sell (sell));
//simulation finish always begin #100; if ($time 》= 10000) $finish ; end
endmodule // test
仿真腳本sim.do文件:
#Build a new libraryvlib work
#Switch to the emulation source file directory
vlog +acc “tb_vending_machine.v”vlog +acc “vending_machine.v”
#Start simulation
vsim -voptargs=+acc work.tb_vending_machine
#Add all the signals on the top layeradd wave *#do wave.do
virtual type { {0x00 IDLE} {0x01 GET05} {0x02 GET10} {0x03 GET15}} FSM_TYPEvirtual function {(FSM_TYPE)/tb_vending_machine/u_mealy/st_cur} state1add wave u_mealy/st_curadd wave -color pink /tb_vending_machine/u_mealy/state1
view structureview signalsrun -all
仿真結果如下
狀態(tài)機二進制被文本所替代。
編輯:jq
-
ModelSim
+關注
關注
5文章
174瀏覽量
47921
原文標題:Modelsim仿真--波形狀態(tài)機名稱顯示
文章出處:【微信號:leezym0317,微信公眾號:FPGA開源工作室】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
有可能在 FX3 GPIF2 中創(chuàng)建兩個獨立的狀態(tài)機嗎?
求助,關于srammaster.cydsn中狀態(tài)機的問題求解
如何用Simulink仿真BLDC反電動勢波形(可下載)
【紫光同創(chuàng)盤古100Pro+開發(fā)板,MES2L676-100HP教程】盤古676系列——Modelsim的使用和do文件編寫
Simulink中的狀態(tài)機建模方法 Simulink數(shù)據(jù)可視化與分析功能
對OPA847仿真,通過暫態(tài)分析對信號分析,只有輸出電壓的波形顯示,請問輸出電流能測試出來嗎?
用Tina仿真時測量波形時,發(fā)現(xiàn)示波器上顯示電壓的數(shù)值與交流分析的值不一樣,為什么?
使用TINA-TI進行仿真,為什么都不顯示波形,只顯示正在收集數(shù)據(jù)?
觸發(fā)器和狀態(tài)機的關系是什么
用THP210做單端轉差分應用,仿真的波形里怎么總有個尖尖?
如何在FPGA中實現(xiàn)狀態(tài)機
如何在ModelSim中添加Xilinx仿真庫
玩轉Spring狀態(tài)機

評論