前面用过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;