quartusII与modelsim联合仿真流程与问题(VHDL)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Mr_liu_666/article/details/88873485

原先在学校的学习的EDA设计课程里面使用的是quartusII9.0是自带仿真器的,使用起来十分方便,但是现在自己开发的时候使用了12.1,不含仿真器,需要安装modelsim并和quartusII绑定:

安装quartusII,破解,安装modelsim,破解,注意,不要忘记在Win32文件夹下运行EXE破解破解软件的时候,一定要去掉mgls.dll文件的只读属性,要不就白忙活了。

之后在quartusII的tools 》 options 》 Modelsim-Altera里面选好了modelsim.exe对应的文件,这样就算是绑定完成了。

之后就是使用它进行仿真:

1.我们需要有一个已经编译通过了文件,我写的是一个计数器,由于CSDN不支持VHDL的代码,没有高亮,对付看吧,哈哈:

LIBRARY	IEEE;
USE		IEEE.STD_LOGIC_1164.ALL;
USE		IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY	cnt	IS
PORT(
		CLK,RST,EN	:	IN	STD_LOGIC;
		DOUT			:	OUT	STD_LOGIC_VECTOR(4	DOWNTO	0);--5  places  to  32bit
		COUT			:	OUT STD_LOGIC);
END	cnt;

ARCHITECTURE	behave	OF	cnt IS
	begin
		PROCESS(CLK,RST,EN)	
		VARIABLE	Q	:	std_logic_vector(4	downto	0);
		begin
			IF	(CLK'EVENT	AND	CLK	=	'1')	THEN--what is  ()  for
				IF	RST	=	'0'			THEN	Q	:=	(OTHERS=>'0');	--what is ;  for
					ELSIF	EN = '1'	THEN
						IF	Q<19	THEN	Q:=Q+1;--is  :=  really  right?
						ELSE	Q:=(OTHERS=>'0');
						END IF;
				END IF;
			END IF;			
			IF	Q="10011"	THEN	COUT<='1';
			ELSE	COUT<='0';	
            END IF;
			DOUT<=Q;
		END PROCESS;
END behave;

编译通过之后就进行testbench的编写,两种方法,可以就直接生写或者套模板,也可以使用quartusII自带的模板生成功能:

这样的话就会生成一个.vht 文件在相应的工程文件夹下的:simulation 》modelsim 》XXX.vht里面,那也将会是一个好的模板,我采取的是第一种方法,直接写:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY cnttb IS            --空实体
END cnttb;

ARCHITECTURE arc_cnttb OF cnttb IS        --结构体
  COMPONENT cnt IS        --元件声明
   PORT(
		CLK,RST,EN	:	IN	STD_LOGIC;
		DOUT			:	OUT	STD_LOGIC_VECTOR(4	DOWNTO	0);--5  places  to  32bit
		COUT			:	OUT STD_LOGIC);
  END COMPONENT;

  signal CLK,RST,EN:std_logic;
  signal DOUT			:	STD_LOGIC_VECTOR(4	DOWNTO	0);--5  places  to  32bit
  signal	COUT			:	STD_LOGIC;
  constant clk_period : time :=200 ns;

BEGIN
  CNTT :cnt PORT MAP(clk=>clk,rst=>rst,DOUT=>DOUT,COUT=>COUT,EN=>EN);    --元件例化
  clk_gen:
    PROCESS
      BEGIN
        clk<='1';
        wait for clk_period/2;
        clk<='0';
        wait for clk_period/2;
    END PROCESS;
  
  tb:
    PROCESS
      BEGIN
       rst<='0';
	   EN <='0';
       wait for 100 ns;
       rst<='1';
	   wait for 100 ns;
	   EN <='1';
       wait;
    END PROCESS;

END arc_cnttb;

写好了testbench之后就是开始仿真了,仿真吧:咦?错了!

需要先进行quartusII的配置才可以进行仿真:

点进去之后是这样的:

NEW一个testbench,name就是刚刚咱们写的第二个文件的名字,不用加.vhd,比如文件叫cnttb.vhd,里面的entity叫cbttb,那么这个name就叫cnttb,第三个要选的就是结束时间,比如2ms,文件名就是那个cnttb.vhd。

确定,保存,之后就可以启动rtl时序仿真了:

看起来还不错。

之前在仿真中遇到的最难受的两个问题:

写TESTBENCH的时候,信号声明的时候,不能有INOUT:

另外就是,TESTBENCH在assignment的时候有一个位置,如下图红标的位置,那里填写的是例化的标号:

祝学习顺利,工作愉快!

猜你喜欢

转载自blog.csdn.net/Mr_liu_666/article/details/88873485
今日推荐