打印

安富利GSM给您讲讲使用ModelSim 进行设计仿真

[复制链接]
楼主: GoldSunMonkey
手机看帖
扫描二维码
随时随地手机跟帖
61
GoldSunMonkey|  楼主 | 2011-12-23 22:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
这时候在Workspace窗口中出现了Project选项卡,在其中有DivClkHDL.vhd,其状态栏有一个问号,表示未编
译,我们双击该文件,这时候出现窗口edit-DivClkHDL.vhd的编辑窗口,在其中我们输入我们的设计文件如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity divclk1 is
Port ( clk : in std_logic;
divclk : out std_logic);
end divclk1;
architecture Behavioral of divclk1 is
signal counter : std_logic_vector(4 downto 0):="00000";
signal tempdivclk: std_logic:='0';
begin
process(clk)
begin
if clk'event and clk='1' then
if(counter>="11000") then
counter<="00000";
tempdivclk<=not tempdivclk;
else
counter<=counter+'1';
end if;
end if;
end process;
divclk<=tempdivclk;
end Behavioral;

使用特权

评论回复
62
GoldSunMonkey|  楼主 | 2011-12-23 22:27 | 只看该作者
7、点击File->Save,并退出该窗口(File->Close); 8、在WorkSpace窗口的DivClkHDL.vhd上点击右键,选择Compile->Compile All

使用特权

评论回复
63
GoldSunMonkey|  楼主 | 2011-12-23 22:28 | 只看该作者
本帖最后由 GoldSunMonkey 于 2011-12-23 22:29 编辑

9.  在脚本窗口中将出现一行绿色字体Compile of DivClkHDL.vhd was successful.,说明文件编译成功,在该
文件的状态栏后有一绿色的对号,表示编译成功;
10、下面我们开始仿真,点击菜单Simulate->Simulate,会出现如同所示的界面,我们展开Design选项卡
下的work库,并选中其中的behavioral,这是在Simulate中出现了work.divclk1(behavioral)表示我们所要
仿真的对象,Resolution为仿真的时间精度,这里我们使用默认值,点击OK;

使用特权

评论回复
64
GoldSunMonkey|  楼主 | 2011-12-24 21:55 | 只看该作者
11  为了观察波形窗口,我们点击菜单View->Wave;
12、这时候出现的Wave窗口为空,里面什么都没有,我们要为该窗口添加我们需要观察的
对象,首先在主窗口而不是波形窗口中点击View->Signals打开信号列表窗口如图所示在
改窗口中点击Add->Wave->Signals in Design,这时候在波形窗口中就可以看到这些信
号了;

使用特权

评论回复
65
GoldSunMonkey|  楼主 | 2011-12-24 22:01 | 只看该作者
下面我们就开始仿真了,在主窗口中输入命令对信号进行驱动,首先我们为时钟信号输入驱动:force clk 0 0 ,1
10000 -r 20000其中force为命令,clk表示为clk信号驱动,0 0表示在零时刻该值为0,1 10000表示在10ns处
值为1,-r 20000表示从20ns处开始重复(repeat),可以看出我们这里的输入时钟为50MHz,即周期20ns;

使用特权

评论回复
66
GoldSunMonkey|  楼主 | 2011-12-24 22:03 | 只看该作者
14、以十进制查看counter信号波形,在波形窗口中,右键点击counter信号,点击Radix->Decimal,该信号的
值就以十进制显示了;
15、开始仿真,在主窗口中输入run 3us,表示运行仿真3微秒,这时候如果你的机器配置较低那就要等几分钟时
间了,这时候你可以看看CPU的利用率一直为100%,仿真是比较占资源,并且以后对波形的操作机器反应也
很慢,如果仿真很慢你可以看看状态栏的当前仿真时间是多少;

使用特权

评论回复
67
GoldSunMonkey|  楼主 | 2011-12-24 22:05 | 只看该作者
本帖最后由 GoldSunMonkey 于 2011-12-24 22:09 编辑

16, 这时候点击 (在当前波形窗口中显示所有波形)按钮,点击 可以在波形窗口添加竖线,点击 可以调整选
定竖线在选定信号的变化处,调整完毕,我们可以在波形窗口看到如图所示的窗口,可以看到分频得到
的时钟占空比为1(即一个周期内容为1时间等于波形为0的时间),分频后周期为1us;

使用特权

评论回复
68
GoldSunMonkey|  楼主 | 2011-12-24 22:09 | 只看该作者
17、退出仿真,在主窗口中点击Simulate->End Simulation,会出现对话框,提示我们是否确认退出仿
真,我们点击是退出仿真;
18、仿真结果分析,这里我们的输入时钟为50MHz,周期为20ns,通过分频语句得到频率为1MHz,周期
为1us的时钟,使用时可以调整分频语句if(counter>="11000") then中的值及位宽来调整分频后的时钟频
率。设我们需要从周期为T(ns)的时钟得到周期为X(ns)的脉冲,可以用如下的方法计算出此处应有的
值: ((X/T)/2)-1,例如此处我们要从周期为20ns的时钟得到周期为1000ns(1us)的脉冲,((X/T)/2)-1=
((1000/20)/2-1)=24=(11000)Bin因此可以得到该式中的值。

使用特权

评论回复
69
GoldSunMonkey|  楼主 | 2011-12-24 22:20 | 只看该作者
使用命令行方式对设计进行仿真

在这一小节里我们主要通过在主窗口中输入命令行来进行仿真,并不是所有的操作都是用命令行方式来实现
的。我们所设计的例子是另外一种分频方式,即使用计数器的某一位作为分频得到的时钟。我们可以按照如下步
骤来实现。
1、新建工程DivClk2Proj,打开ModelSim,点击File->New->Project,在工程名中输入DivClk2Proj,在工
程保存路径中输入D:/yuProj/modelsim/DivClk2,点击OK,并在随后出现的对话框中点击确定来确认建立该
目录;

使用特权

评论回复
70
GoldSunMonkey|  楼主 | 2011-12-24 22:21 | 只看该作者
2、在随后出现的Add items to the Project窗口中,点击Creat New File,出现Create Project File窗口,我们
点击Browse找到我们刚刚建立的文件夹,并输入文件名,之后,在File Name框中应为
D:/yuProj/modelsim/DivClk2/DivClk2HDL,选择Add file as type为VHDL,Folder为Top Level,点击OK,
并点击Add items to the Project窗口中的Close来将其关闭;

使用特权

评论回复
71
GoldSunMonkey|  楼主 | 2011-12-24 22:21 | 只看该作者
3 在主窗口中双击Workspace窗口中DivClk2HDL.vhd,出现编辑窗口,在窗口中输入如下代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity divclk1 is
Port ( clk : in std_logic:='0';
divclk : out std_logic);
end divclk1;
architecture Behavioral of divclk1 is
signal counter : std_logic_vector(5 downto 0):="000000";
begin
process(clk)
begin
if clk'event and clk='1' then
if(counter>="110001") then
counter<="000000";
else
counter<=counter+'1';
end if;
end if;
end process;
divclk<=counter(5);

使用特权

评论回复
72
GoldSunMonkey|  楼主 | 2011-12-24 22:22 | 只看该作者
4、保存该文件并编译,方法同上,在该文件上点击右键选择Compile ->Compile All;
5、运行仿真,在主窗口输入命令:vsim work.divclk1,注意此处的divclk1表示设计中的实体名;
6、以下的仿真同上,为时钟信号添加驱动,输入命令:force clk 0 0,1 10000 -r 20000,将仿真时钟设为
50MHz;

使用特权

评论回复
73
GoldSunMonkey|  楼主 | 2011-12-24 22:22 | 只看该作者
7、打开波形窗口,输入命令:view wave,这时会看到空的波形窗口已经打开;
8、为波形窗口添加信号,输入命令:add wave -hex *,这里的*表示添加设计中所有的信号,-hex表示以十六
进制来表示波形窗口中的信号值;
9、开始仿真,输入命令,run 3us,这时候在波形窗口中出现仿真波形,调整窗口大小,并添加鼠标线,得到如
图所示的波形窗口;

使用特权

评论回复
74
GoldSunMonkey|  楼主 | 2011-12-24 22:24 | 只看该作者
10、退出仿真,输入命令:quit –sim。
11、仿真结果分析,这里我们的输入时钟为50MHz,周期为20ns,分频得到的时钟周期为1us,占空比不为1。
使用时可以调整分频语句if(counter>="110001") then中的值及位宽来调整分频后的时钟频率。设我们需要从
周期为T(ns)的时钟得到周期为X(ns)的脉冲,可以用如下的方法计算出此处应有的值: (X/T)-1,例如此
处我们要从周期为20ns的时钟得到周期为1000ns(1us)的脉冲,(X/T)-1=(1000/20)-1)=49=(110001)Bin
因此可以得到该式中的值。

使用特权

评论回复
75
GoldSunMonkey|  楼主 | 2011-12-24 22:26 | 只看该作者
使用Testbench和TEXTIO对设计进行仿真
在上一节中,我们对使用ModelSim进行设计仿真有了一定的认识,这一节我们使用较为高级的仿真方式:
TestBench和TEXTIO来进行设计仿真。TestBench可以理解为一个
平台,该平台包含待仿真的模块,具体一点是TestBench为一个电路板,在该电路板中包含了我们设计的用
HDL语言描述的电路,这块电路板与外界没有任何的接口,其功能仅仅是仿真测试我们设计电路,我们可将设
计的电路中的端口的信号描绘出来,进行仿真分析。也许看到这里你还是不很明白,这不要紧,看完后面一个
例子就很清楚了。TEXTIO是VHDL标准库STD中的一个程序包(Package),它提供了VHDL与磁盘文件直接
访问的桥梁,我们可以利用它来读取或写入仿真数据到磁盘中的文件,TEXTIO的使用是通过TestBench来进
行的,即我们在TestBench中可以调用TEXTIO进行仿真,下面我们就介绍两者的使用。

使用特权

评论回复
76
GoldSunMonkey|  楼主 | 2011-12-24 22:27 | 只看该作者
使用TestBench对设计进行仿真
这里我们先看一个例子,我们的设计同上一节,即设计一个分频模块,其源代码如上节所述。这里我们
为其编写一个TestBench,代码如下:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY divclk1_tb IS
END divclk1_tb;
ARCHITECTURE behavior OF divclk1_tb IS
COMPONENT divclk1
PORT(
clk : IN std_logic;
divclk : OUT std_logic
);
END COMPONENT;
SIGNAL clk : std_logic:='0';
SIGNAL divclk : std_logic;
BEGIN
uut: divclk1 PORT MAP(
clk => clk,
divclk => divclk
);
clk<= not clk after 10 ns;
END;

使用特权

评论回复
77
GoldSunMonkey|  楼主 | 2011-12-24 22:28 | 只看该作者
下面我开始在ModelSim中使用TestBench对设计进行仿真;
1、打开ModelSim,新建工程TestBenchTest;
2、将上节的分频模块设计文件添加到当前工程中,如果你不知道怎么添加,方法
是在Add items to the Project窗口中点击Add Existing Files,找到上面中的文件,拷贝到当前目录即可;

使用特权

评论回复
78
GoldSunMonkey|  楼主 | 2011-12-24 22:28 | 只看该作者
3、新建TestBenchFile文件,并将上述源代码添加进去保存,新建文件的方法是File->New->Source-
>VHDL;
4、编译文件,方法是点击菜单Compile ->Compile All;
5、如果代码与本书一样,且ModelSim的License正确的,应该编译没有问题,下面开始仿真;
6、在命令窗口中输入vsim work.divclk1_tb,注意与8.3.2不同之处在于这里的仿真对象为divclk1_tb,它是
TestBenchFile的实体名;
7、在命令窗口中输入view wave,打开波形文件窗口;
8、在命令窗口中输入add wave -hex *,将信号添加到波形文件中;
9、在命令窗口中输入run 3us,在波形窗口中可以得到波形,添加鼠标线并调整大小

使用特权

评论回复
79
GoldSunMonkey|  楼主 | 2011-12-24 22:29 | 只看该作者
可以得到如图所示的波形;

使用特权

评论回复
80
davines| | 2011-12-25 16:49 | 只看该作者
听同学说这个版块非常热。原来真这样。慢慢学吧。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则