modelsim的VHDL仿真


前面用过vivado自带的仿真软件,我这个仿真新手发现它不能仿真signal信号,所以改用modelsim进行仿真,虽然经历了一些波折,总归仿出结果了,下面记录下仿真过程作为备忘:

首先新建project ,添加主文件.vhd和testbench.vhd,全部编译,如下图即是编译成功:

 

一定要在如下library里点击仿真,不然可能会出现信号缺失的情况:

然后在work下面找到testbench中的architecture,右击,simulation:

 

这时自动跳到波形界面,此时在instance单元左击testbench就会在objects看到输入输出信号,但是没有内部型号:

 

 左击instance中uut模块就可以看到主文件内的signal信号和定义的各种变量常量:

 

 这时,就可以将需要的信号抓到观测区,选中需要的信号,右击,add wave:

 

 带观测区如下:

 

 这时就是最后一步了,设置仿真时间点击显示,就是点击仿真时间右边的那个run(开始忘记这一步,发现总是看不见波形,恼火!),其实直接在命令行输入run也是可以的。

 

此时就可以看到波形咯!

 最后放下我两个程序吧,一个mystate,一个mystate_tb是状态机学习的程序:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
--------------------------------------------------------
ENTITY mystate IS
    PORT(A,clk,rst: IN STD_LOGIC;
         output_state: OUT STD_LOGIC);
END mystate;
--------------------------------------------------------
ARCHITECTURE rtl OF mystate IS
    CONSTANT s0: STD_LOGIC_VECTOR(1 downto 0):="00";
    CONSTANT s1: STD_LOGIC_VECTOR(1 DOWNTO 0):="01";
    CONSTANT S2: STD_LOGIC_VECTOR(1 DOWNTO 0):="11";
    SIGNAL current_state: STD_LOGIC_VECTOR(1 DOWNTO 0);
    SIGNAL next_state: STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
    PROCESS(clk,rst)
    BEGIN
        IF(rst='1') THEN
            current_state<=s0;
            ELSIF(clk'EVENT AND clk='1') THEN
                current_state<=next_state;
        END IF;
    END PROCESS;
    
    PROCESS(current_state,A)
    BEGIN
        CASE current_state IS
            WHEN s0=>
                IF(A='0') THEN
                    next_state<=s0;
                ELSE
                    next_state<=s1;
                END IF;
            WHEN s1=>
                IF(A='0') THEN
                    next_state<=s2;
                ELSE
                    next_state<=s1;
                END IF;
            WHEN s2=>next_state<=s0;
            WHEN OTHERS=>NULL;
        END CASE;
    END PROCESS;

    PROCESS(current_state,A)
    BEGIN
        CASE current_state IS
            WHEN s0=>
                IF(A='0') THEN
                    output_state<='0';
                ELSE
                    output_state<='1';
                END IF;
            WHEN s1=>
                IF(A='0') THEN
                    output_state<='1';
                ELSE
                    output_state<='0';
                END IF;
            WHEN s2=>
                IF(A='0') THEN
                    output_state<='0';
                ELSE
                    output_state<='1';
                END IF;
            WHEN OTHERS=>NULL;
        END CASE;
    END PROCESS;
    
END rtl;
library IEEE;
use IEEE.Std_logic_1164.all;
use IEEE.Numeric_Std.all;

entity mystate_tb is
end;

architecture bench of mystate_tb is

  component mystate
      PORT(A,clk,rst: IN STD_LOGIC;
           output_state: OUT STD_LOGIC
           );
  end component;

  signal A,clk,rst: STD_LOGIC;
  signal output_state: STD_LOGIC;

  constant clock_period: time := 10 ns;
  signal stop_the_clock: boolean;

begin

  uut: mystate port map ( A            => A,
                          clk          => clk,
                          rst          => rst,
                          output_state => output_state 
                        );

  stimulus: process
  begin
  
   A<='0';
   wait for 20ns;
   A<='1';
   wait for 20ns;
    A<='0';
   wait for 20ns;
    A<='0';
   wait;

    stop_the_clock <= true;
    wait;
  end process;

  clocking: process
  begin
    while not stop_the_clock loop
      clk <= '0', '1' after clock_period / 2;
      wait for clock_period;
    end loop;
    wait;
  end process;
resetmy:PROCESS
   BEGIN
     rst<='1';
     wait for 30 ns;
     rst<='0';
     wait;
   END PROCESS;
end;

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM