搜档网
当前位置:搜档网 › ModelSim入门指导

ModelSim入门指导

ModelSim入门指导
ModelSim入门指导

QUESTA-SIM(QuestaSim)10.2入门指南平台

软件:Questa-Sim 10.2 版本Starter Edition,也适用于高版本的ModelSim软件。内容

一. 设计流程

典型设计流程包括如下所示:

(1)设计输入

设计的行为或结构描述

(2)RTL仿真(ModelSim)

功能仿真

验证逻辑模型(没有使用时间延迟)

可能要求编辑设计

(3)综合

把设计翻译成原始的目标工艺

最优化——合适的面积要求和性能要求

(4)布局和布线

映射设计到目标工艺里指定位置

指定的布线资源应被使用

(5)门级仿真(ModelSim)

时序仿真

验证设计一旦编程或配置将能在目标工艺里工作

可能要求编辑设计

(6)时序分析

(7)验证合乎性能规范

可能要求编辑设计

(8)版图设计

(9)仿真版图设计

(10)在板编程和测试器件

使用QuestaSi/ModelSim仿真的基本流程为:

图1.1 使用QuestaSim仿真的基本流程

2 开始

1.1 新建工程

打开QuestaSim后,其画面如图2.1所示。

图2.1 QuestaSim画面

1. 创建工作目录E:/QuestaSim/, 在其路径下创建子文件夹/ip、/prj、/rtl、/tb, prj是QuestaSim工程主文件夹,ip是仿真模型目录,rtl 是代码目录,tb是testbench目录。

2. 选择File>New>Preject创建一个新工程。打开的Create Project对话框窗口,可以指定工程的名称、路径和缺省库名称。一般情况下,设定Default Library Name为work。指定的名称用于创建一个位于工程文件夹内的工作库子文件夹。该对话框如图2.2所示,此外还

允许通过修改初始化文件QuestaSim.ini文件来映射库设置。

图2.2 创建工程的对话框

2. 设置Project Name为BG0806,Project Location为E:/QuestaSim/prj, 勾选Copy Library Mappings ,点击OK。

3. 出现Add Items to the Project的对话框,如图2.3所示,

图2.3 在工程中,添加新项目

1.2 在工程中添加新项目

在Add Items to the Project对话框中,包括以下选项:

?Create New File——使用源文件编辑器创建一个新的Verilog、VHDL、TCL或文本文件

?Add Existing File——添加一个已存在的文件

?Create Simulation——创建指定源文件和仿真选项的仿真配置

?Create New Folder——创建一个新的组织文件夹

1.2.3 创建新文件

1. 单击Create New File。打开图

2.4所示窗口。

图2.4创建工程文件夹

2. 输入文件名称:bg0806_dp_top,然后选择文件类型为Verilog。

图2.5 输入工程文件信息

3. 单击OK,关闭本对话框。新的工程文件将会在工程窗口显示。单击Close,以关闭Add Items to the Project。

图2.6 RTL设计文件

4. 双击打开datapath_top.v文件(注意:若是Verilog文件已经关联了其他的文本编辑器,则双击后在关联的文本编辑器中打开)。

每一个.v文件录入完成后,单击Save,保存rtl代码。

1.2.4 添加RTL代码

通常情况下,程序员不会在QuestaSim直接录入RTL代码,推荐使用GVIM8.0代码编辑器编辑RTL代码,然后选择Add Existing File 则直接将E:/QuestaSim/rtl/*.v添加到工程,不用特意指定顶层文件,仿真时软件会自动识别顶层文件。

1. 选择Project>Add to Project>Existing File,如图

2.14所示。

图2.7添加文件到工程中

2. 单击打开,在Add file to the project窗口,单击OK。

1.2.5 添加TestBench代码

TB文件保存在E:/QuestaSim/tb/,同样添加到工程目录下,TestBench文件的写法参考相关文献,此处不赘述。

1.3 编译文件

在Project标签下的Status列的问号,表示文件尚未编译进工程,或者在最后编译前,源文件有所改动。欲编译文件,选择

CompileCompile All。

倘若此处没有错误,编译成功的消息,就会在Transcript窗口如图2.8所示,如果有错误,双击出错的地方,修改RTL代码。

图2.8 编译成功

1.4 仿真

1.4.1 仿真环境设置

1. 点击工具栏上的

图2.9 仿真设置1

(1) 点击Optimization Options > Visibility,勾选full debug mode

图2.9 仿真设置2

(2) 点击Libraries,添加仿真库,xilinx仿真库的添加方法参考下文

图2.10 仿真设置2

(3) 添加define库,在Project工程目录空白处右键选择Propereies,在Project Compiler Setting窗口选择verilog & SystemVerilog>other verilog options>Include Directory添加define文件所在的目录,点击OK。

图2.11 仿真设置3

1.4.2 开始仿真

单击图标,选择Design,然后选择TestBench。单击OK,如下图所示。

图2.12 开始仿真

仿真完之后出现多了2个窗口sim和Objects,sim窗口显示了层次目录,Objects窗口显示了sim窗口选择的模块的所有信号列表,可以筛选所需信号。

图2.13 仿真结束后的界面截图

1.4.2 添加波形

右键信号,然后选择Add to> Wave>Select Signals,在Wave窗口出现下图所示,在Run Length列输入仿真时间长度为10ms,

点击图标,运行若干秒后,查看波形。

Debug 常用按键 f : 可查看仿真的完整波形,也可以单击Zoom Out(O)图标。

ctrl + 鼠标左键选择:选定任意波形区间进行放大。

注:修改完RTL代码之后必须重新编译,然后点击重新仿真。

二. 软件设置常见问题

2.1 如何在Questa-Sim软件里添加xilinx的仿真库

QuestaSim一定要安装在不带空格的目录下,即不要安装在―Program Files‖目录下。本人是安装在D:\software\QuestaSim目录下,Xilinx软件也最好安装在不带空格的目录下。

1、找到开始菜单->程序->Xilinx Design Tools 11 -> 64/32-bit tools -> Simulation Library Compilation Wizard.

2、选定QuestaSim的版本,以及指定QuestaSim的安装路径。

3、选择Both VHDL and Verilog。

4、选择支持哪些系列的芯片,看自己需要增减。

5、默认选全上即可。

6、指定编译完后的库存放位置,这里作者在QuestaSim安装目录下新建了xilinx_lib的文件夹,并指定到这里。(注意不要指向带空格的路径)

7、运行Lauch Compile Process,即开始编译库文件,需要几十分钟。编译完成后应该在xilinx_lib目录下多出如下文件夹:

8、右键打开QuestaSim目录下的QuestaSim.ini文件,先将其“只读”属性去掉。然后用记事本打开。在[Library]下面添加如下代码,即之前编译好的Xilinx库的路径。

unimacro = D:/softwares/QuestaSim/xilinx_lib/unimacro

unimacro_ver = D:/softwares/QuestaSim/xilinx_lib/unimacro_ver

unisim = D:/softwares/QuestaSim/xilinx_lib/unisim

unisims_ver = D:/softwares/QuestaSim/xilinx_lib/unisims_ver

secureip = D:/softwares/QuestaSim/xilinx_lib/secureip

xilinxcorelib = D:/softwares/QuestaSim/xilinx_lib/xilinxcorelib

xilinxcorelib_ver = D:/softwares/QuestaSim/xilinx_lib/xilinxcorelib_ver

simprim = D:/softwares/QuestaSim/xilinx_lib/simprim

simprims_ver = D:/softwares/QuestaSim/xilinx_lib/simprims_ver

9、再次打开QuestaSim,即可以看到Xilinx的库已经默认出现在了库列表里。以后仿真Xilinx的IP核时,就不用每次都添加库了。

2.2 如何保存Wave波形文件

在Wave窗口选择File->Save Format,保存为*.do文件。

在代码检视窗口打开*.do,文件的代码如下所示,复制需要的代码脚本行至命令窗口,可以直接添加到Wave窗口。不用每次都拖曳很多的信号至wave窗口,提升效率。

2.3 仿真添加波形时显示vish-4014 错误

在QuestaSim的软件安装目录打开QuestaSim.ini文件,将VoptFlow设置成0,即可解决

2.4 仿真时报错Glbl错误ERROR

软件提示:Unresolved reference to 'glbl' in 'glbl.GSR' 。仿真缺少glbl文件,在仿真工程中添加glbl.v文件(一般在~/ise/verilog/src/glbl.v),把testbench.v和glbl.v同时选中后进行仿真,即脚本命令中添加vsim -t 1ps -L unisims_ver glbl.v testbench.v。

2.5 IP修改后的错误

仿真结果显示:No entity is bound for inst 或CE is not in the entity。(CE是改动后添加的一个管脚),从而仿真无结果。

解决办法:首先选中该IP核的.xco文件点击右键->属性将属性改为"Synthesis/Imp + Simulation."

然后将其对应的.v或.vhd文件的属性也改为"Synthesis/Imp + Simulation."

2.6 如何让状态机显示状态的名字

在使用Verilog编写有限状态机等逻辑的时候,状态机的各个状态通常以参数表示,但当使用ModelSim仿真的时候,状态机变量在wave 窗口中以二进制编码的形式显示,当状态很多时,这种显示形式不是很直观,下文可以使用ModelSim提供的命令将状态机变量以―文本‖形式的参数名显示,从而有利于调试。

1.首先使用ModelSim的virtual type命令定义一个新的枚举类型(FSM_TYPE):

virtual type {?

{0x0 idle} {0x1 write_U9} {0x2 write_U6} {0x4 start_1} {0x8 rdU6_wrU5} {0x10 update_1} {0x20 read_end_1} {0x40 waiting_1}?

{0x80 ARM_com_1} {0x100 start_2} {0x200 rdU5_wrU6} {0x400 update_2} {0x800 read_end_2} {0x1000 waiting_2} {0x2000 ARM_com_2}?

} FSM_TYPE

注意:状态变量之间需要一个空格。

2.然后我们将需要显示的信号(/sram_controller_tb/i1/state,注意信号在wave窗口中的完整名字)进行类型转换,转换成一个新的信号(state_new)

virtual function {(FSM_TYPE)/sram_controller_tb/i1/state} state_new

3.最后我们将新的信号加入到wave窗口中。

add wave -color pink /sram_controller_tb/i1/state_new

4.仿真结果。

2.7 仿真时显示Vopt-7的错误

Error:Failed to open page file " .qpg" in {}; DATABASE ERROR : cannot open auxiliary ......

解决办法:删除SIM目录下的work文件夹,重新跑仿真,即可解决。

三. 通过命令完成工程创建、编译、仿真的工作

QuestaSim提供了丰富的命令使用户可以使用Tcl脚本命令完成从工程创建、编译、仿真的全部工作;创建如下图所示的文件目录和子目录,board文件夹存放FPGA板级相关文件,不同FPGA信号创建不同的目录,本项目的FPGA型号是xilinx的Spartan6。rtl目录存放RTL代码,sim是QuestaSim主仿真目录,tb文件下存放Testbench相关文件。

3.1 创建脚本verify_rtl_only.tcl

注意:vopt行的代码包含了xilinx仿真库,TestBench顶层文件,glbl等内容,+acc表示完全可见,-o *_opt表示优化结果输出新的名字

3.2 QuestaSim常用命令介绍

3.2.1常用仿真命令

(1)vlib work // 建立work仿真库,该命令的作用是在该目录下建立一个work目录,请注意不要用操作系统来新建一个work的文件夹,因为用操作系统建立的work文件夹并没有ModelSim SE自动生成的_info文件。

(2)vmap work wrok // 映射库,该命令的作用是将目前的逻辑工作库work和实际工作库work映射对应。

(3)vlog -cover bcest *.v // 加覆盖率分析的编译,该命令的作用是编译这些文件,要注意的是文件可以单独分开编译,但是一定要先编译被调用的文件。

(4)vsim -coverage -voptargs="+acc" -t ns test //仿真命令, 注意后面的参数必须为camera_tb.v文件中的模块名(5)add wave * // 将所有模块waveform. dump出来

(6)add wave sim:/test/t/M2/Reg_out // 将模块Reg_out中的waveform. dump出来

(7)add wave/camera_tb/ * // 该命令的作用是将testbench文件camera_tb.v中模块camera_tb下所有的信号变量加到波形文件中去,注意在―*‖前要加空格。这时候你也可以看到wave文件被打开。当然也可以单个信号的添加,例如添加时钟:add wave clk 等等。

(8)run 2000 //该命令的作用是运行2000个单位时间的仿真,也可以用run –all命令来一直仿真下去。

(9)delete wave /test/i //删除文件

(10)vopt 优化设计

3.2.2仿真命令参数

(1) +incdir+:如:vlog +incdir+YOUR_SOURCE_PATH foo.v

+incdir+YOUR_SOURCE_PATH 选项是指在verilog文件中出现`include "xxx.v" 时,包含文件的搜索路径。缺省是搜索当前路径,然后是YOUR_SOURCE_PATH 指定的路径。

(2) +define+:

+define+[=] 允许用户在命令行中定义宏定义,等效于编译器指令:

`define

用户可以指定多个宏定义,如下:

vlog +define+one=r1 +two=r2 +three=r3 test.v

命令行的宏定义会覆盖在源文件中用`define定义的相同名字的宏定义

如:vsim -c -l vsim.log -do ./YourDo.do -L ./work work.foo

-c 选项让vsim工作在commandline模式;

-l 选项是输出log文件到vsim.log;

-do 选项是开始仿真后运行tcl脚本文件;

-L 选项是指定工作逻辑库;

work.foo是仿真的top level module。

3.2.2 SVA 断言仿真命令

(1)vlog -sv a.v

(2)vsim -assertdebug test

(3)view assertions

(4)vsim -assertdebug ScaleBlock_tf -L xilinxcorelib_ver -L unisims_ver // 加载xilinxlib库

3.3 QuestaSim的tcl命令行操作过程

1. 打开QuestaSim/ModelSim软件,在命令行窗口输入cd {/仿真路径};

2. source TCL文件;

3. 输入verify_rtl_only testcase_name,开始RTL仿真;

4. 在Wave窗口添加需要查看的波形信号

5. 保存波形,File->Save Format->wave.do,保存波形的好处是下次修改代码,再次仿真之后直接把经常Debug的那些信号线直接全部加载到波形窗口,提高Debug效率。

6. 仿真完,修改其他仿真CASE直接在verify_rtl_only.tcl修改,source完之后,然后直接在命令窗口输入rrun。

7. 修改完RTL代码之后,需要verify_rtl_only testcase_name再次编译代码,然后再跑rrun。

四. ModelSim用户手册

关于ModelSim/QuestaSim的详细使用方法参考Manual。

五. Tcl脚本使用指南

ModelSim使用的一点心得体会

ModelSim使用的一点心得- - 1、至今还没有弄明白为什么要用ModelSim,因为看波形Quartus II自带的工具就可以了啊。 2、我刚刚接触modelsim,我想大多数菜鸟跟我一样,看过如何使用ModelSim的介绍,说句实话,那些介绍写的都太过简单,仿佛大家都不屑写上一些比较“弱智”的步骤,恰恰就是这些看似累赘的步走,难为我好久。 教程上都写道,modelsim的简单使用方法如下:建立库- 影射库到物理目录- 编译代码- 启动仿真。首先建立库就叫我头晕。库的概念用在这儿实在不合适,把我吓坏了,也就没心思看下一步了。在我看来,教程应该这么写: <1> 建立一个目录modelsimStudy。用任何文本编辑器编辑一个简单的例子程序,比如计数器counter.vhd。有clk、ena、reset输入,cnt作为输出。 <2> 打开Modelsim,首先create project,工程名随意取了,比如命名为test,目录设在modelsimStudy下,默认的库work不变(这样就不用管什么建立库之类的东西了)。然后add existing file,把counter.vhd加入当前工程。 <3> 编译这个文件,通过之后,work下面会出现counter这个实体。然后选中它,右键,simulate(左键双击也可)。 <4> ModelSim有很多窗口(新手就怕这个),一开始只要选择view下面的objects 和wave窗口就行了。旧版的signal窗口在6.0的版本改名为Objects(这个我是摸索了好久才发现的,是不是太笨了?)。wave窗口刚打开时是空的,需要在objects窗口的add -> wave -> signals in region。这时,wave上就有clk\ ena \ reset等信号了。 <5> 我们给clk来个输入激励,在object窗口中选中clk,右键选clock,给它定义个时钟。

modelsim完美教程

准备事项 1.ModelSim试用版下载 2.范例程序下载(史丹佛大学一门课的期末专题Implememtation of Viterbi Decoder:constrain length K=3, code rate R=1/2, register-exchange) 整个project共含7个Verilog程序:system.v (top-level) |-- clkgen.v |-- chip_core.v |-- controller.v |-- spu.v |-- acs4.v |-- acs1.v (或是另外一个Verilog的简单例子,可以从C:\ SynaptiCAD\ Examples\ TutorialFiles\ VeriLoggerBasicVerilo gSimulation\ add4.v and add4test.v) (或是另外一个VHDL的简单例子,可以从C:\ Modeltech_5.7e\ examples\ adder.vhd and testadder.vhd) ModelSim PE /LE /SE 差别在哪? 本篇文章内容主要在教导软件使用,以Verilog程序为范例。假设各位读者已经熟悉Verilog,废话不多说,让我们马上来见识一下ModelSim ... 快速上手四部曲:建立Project、引进HDL Files、Compile、模拟(Simulate/Loading and Run) 1.建立一个新的Project 1-1 第一次执行程序时,可以从[开始] \ [程序集] \ ModelSim SE \ ModelSim;或是执行ModelSim在桌面的快捷方式

ModelSim-Altera_6.5仿真入门教程

平台 软件:ModelSim-Altera 6.5e (Quartus II 10.0) Starter Edition 内容 1 设计流程 使用ModelSim仿真的基本流程为: 图1.1 使用ModelSim仿真的基本流程 2 开始 2.1 新建工程 打开ModelSim后,其画面如图2.1所示。

图2.1 ModelSim画面 1. 选择File>New>Preject创建一个新工程。打开的Create Project对话框窗口,可以指定工程的名称、路径和缺省库名称。一般情况下,设定Default Library Name为work。指定的名称用于创建一个位于工程文件夹内的工作库子文件夹。该对话框如图 2.2所示,此外还允许通过选择.ini文件来映射库设置,或者将其直接拷贝至工程中。

图2.2 创建工程的对话框 2. 按照图2.3所示,设置Project Name为LED_FLOW,Project Location为D:/led_flow。 图2.3 输入工程信息 当单击OK按钮后,在主体窗口的下方将出现Project标签,如图2.4所示。 图2.4 Project标签

3. 之后,将出现Add Items to the Project的对话框,如图2.5所示。 图2.5 在工程中,添加新项目 2.2 在工程中,添加新项目 在Add Items to the Project对话框中,包括以下选项: ?Create New File——使用源文件编辑器创建一个新的Verilog、VHDL、TCL或文本文件?Add Existing File——添加一个已存在的文件 ?Create Simulation——创建指定源文件和仿真选项的仿真配置 ?Create New Folder——创建一个新的组织文件夹 1. 单击Create New File。打开图 2.6所示窗口。 图2.6 创建工程文件夹 2. 输入文件名称:LED_FLOW,然后选择文件类型为Verilog。

ModelSim软件仿真步骤教程

使用ModelSim模擬驗證HDL code 1.在模擬前先準備好我們要模擬的電路檔案(Verilog HDL,TestBench,…) 2. 打開ModelSim,新建一個Project,鍵入Project name 按OK。此處我們的library name 為default library name “work”不必更改。 3.然後再加入我們所要模擬的電路檔案(若尚未準備,可開啟新檔案再將code 鍵入)選Add Existing File,將我們已編輯好的檔案加入。 將我們所需要的檔案加入,按Browse選擇我們所需檔案count.v,

count_test.vt),按下OK。 再將先前所開啟的增加檔案的視窗關閉,按close。 4.按下compile all。

Compile成功沒有顯示出錯誤訊息, 則開始模擬波形 5.按下Simulation, 選擇檔案所在的Library (work), 點選TestBench的Module Name t_Gap_finder 按OK 6.承接上步驟將會跳出以下視窗,若要將所有訊號加入波型中觀察則選擇在 testbench的module name: count_tst按滑鼠右鍵選擇→ Add → Add to Wave。

7.在波型畫面按下Run All開始模擬 跑完後會跳出下面視窗選擇否則可觀察模擬波形,若按下是則會將ModelSim關閉。

8.觀察波形圖是否與功能符合,若與設計不符則修改設計並重複執行Step 4到 Step 8 Testbench語法 `timescale 1 ps/ 1 ps 前面的1ps代表程式中最小的時間單位 後面的1ps代表運算的精準度

QUARTUSⅡ10波形仿真(ModelSim)入门教程

QUARTUSⅡ10仿真(ModelSim)入门教程平台 软件:ModelSim-Altera 6.5e (Quartus II 10.0) Starter Edition 内容 1 设计流程 使用ModelSim仿真的基本流程为: 图1.1 使用ModelSim仿真的基本流程 2 开始 2.1 新建工程 打开ModelSim后,其画面如图2.1所示。 图2.1 ModelSim画面

1. 选择File>New>Preject创建一个新工程。打开的Create Project对话框窗口,可以指定工程的名称、路径和缺省库名称。一般情况下,设定Default Library Name为work。指定的名称用于创建一个位于工程文件夹内的工作库子文件夹。该对话框如图 2. 2所示,此外还允许通过选择.ini文件来映射库设置,或者将其直接拷贝至工程中。 图2.2 创建工程的对话框 2. 按照图2.3所示,设置Project Name为LED_FLOW,Project Location为D:/led_flow。 图2.3 输入工程信息 当单击OK按钮后,在主体窗口的下方将出现Create Project标签,如图2.4所示。 图2.4 Project标签 3. 之后,将出现Add Items to the Project的对话框,如图2.5所示。 图2.5 在工程中,添加新项目 2.2 在工程中,添加新项目 在Add Items to the Project对话框中,包括以下选项:

?Create New File——使用源文件编辑器创建一个新的Verilog、VHDL、TCL或文本文件 ?Add Existing File——添加一个已存在的文件 ?Create Simulation——创建指定源文件和仿真选项的仿真配置 ?Create New Folder——创建一个新的组织文件夹 1. 单击Create New File。打开图 2.6所示窗口。 图2.6 创建工程文件夹 2. 输入文件名称:LED_FLOW,然后选择文件类型为Verilog。 图2.7 输入工程文件信息 3. 单击OK,关闭本对话框。新的工程文件将会在工程窗口显示。单击Close,以关闭Add Items to the Project。 图2.8 新的设计文件LED_FLOW.v 4. 双击打开LED_FLOW.v文件(注意:若是Verilog文件已经关联了其他的文本编辑器,则双击后在关联的文本编辑器中打开)。 图2.9 LED_FLOW代码输入窗口 在LED_FLOW.v输入下面的测试平台代码:

modelsim新手入门仿真教程

Modelsim新手入门仿真教程 1.打开modelsim软件,新建一个library。 2.library命名 3.新建一个工程。

3.出现下面界面,点击close。 4.新建一个verilog文件 键入主程序。下面以二分之一分频器为例。

文件代码: module half_clk(reset,clk_in,clk_out); input clk_in,reset; output clk_out; reg clk_out; always@(negedge clk_in) begin if(!reset) clk_out=0; else clk_out=~clk_out; end endmodule 编辑完成后,点击保存。

文件名要与module后面的名称相同。 5.再新建一个测试文件,步骤同上面新建的主程序文件,文件名后缀改为.vt 程序代码如下: `timescale 1ns/100ps `define clk_cycle 50 module top; reg clk,reset; wire clk_out; always #`clk_cycle clk=~clk; initial

begin clk=0; reset=1; #10 reset=0; #110 reset=1; #100000 $stop; end half_clk m0( .reset(reset), .clk_in(clk), .clk_out(clk_out)); Endmodule 6.添加文件,编译文件 先右键点击左边空白处,选择add to project→existing File 选择刚刚新建的两个文件。按ctrl键可以同时选择两个,选择打开,下一步点击ok

ModelSim新手使用手册

ModelSim最基本的操作,初次使用ModelSim的同学,可以看看,相互学习。 无论学哪种语言,我都希望有个IDE来帮助我创建一个工程,管理工程里的文件,能够检查我编写代码的语法错误,能够编译运行出现结果,看看和预期的结果有没有出入,对于Verilog语言,我用过Altera的Quartus II,Xilinx的ISE,还有ModelSim(我用的是Altera 官网的ModelSim_Altera),甚至MAXPlus II,不过感觉这软件太老了,建议还是前三者吧。 学Verilog,找一本好书很重要,参考网友的建议,我也买了一本夏宇闻老师的《Verilog 数字系统设计教程》,用Quartus II来编写代码,个人觉得它的界面比ISE和ModelSim友好,我一般用它编写代码综合后自动生成testbench,然后可以直接调用ModelSim仿真,真的很方便,但学着学着,发现夏老师书里的例子很多都是不可综合的,比如那些系统命令,导致很多现象都发现不了,偶然间我直接打开了ModelSim,打开了软件自带的英文文档,步骤是:Help ->PDF Documentation->Tutorial如下所示: 打开文档的一部分目录: 往下读发现其实ModelSim可以直接创建工程,并仿真的。下面以奇偶校验为例叙述其使用过程(当然前提是你在Altera官网下载了ModelSim并正确安装了)。 1.打开软件,新建一个工程,并保存到自定义的目录中(最好别含中文路径) 2.点击Project,弹出窗口问是否关闭当前工程,点击Yes,接着又弹出如下窗口

我个人的习惯是把Project Name和Default Library Name写成一样,自己定义Project Location。又弹出如下窗口: 3.点击Close(我的版本不能Create New File,其实新建好了工程一样可以新建.v文件),然后点击屏幕下方的Project标签: 如果一开始不是如上图所示的界面,那么可以点击如下图所示红色标记的按键变成上图界面:

modelsim详细使用教程(一看就会)

Modelsim详细使用方法 很多的modelsim教程中都讲得很丰富,但忽视了对整个仿真过程的清晰解读,而且都是拿counter范例举例子,有些小白就不会迁移了。这里我们着眼于能顺利的跑通一个自己写的程序,一步一步的讲解,如果你是一个初学者,这再适合你不过了,虽然貌似字写得比较多,那是因为写得相当的详细,一看就会啦O(∩_∩)O~ 一、建立工程 1、在建立工程(project)前,先建立一个工作库(library),一般将这个library命名为 work。尤其是第一次运行modelsim时,是没有这个“work”的。但我们的project 一般都是在这个work下面工作的,所以有必要先建立这个work。 File→new→library 点击library后会弹出一个对话框,问是否要创建work,点击OK。就能看见work.

2、如果在library中有work,就不必执行上一步骤了,直接新建工程。 File→new→project 会弹出 在Project Name中写入工程的名字,这里我们写一个二分频器,所以命名half_clk,然后点击OK。 会出现

由于我们是要仿一个自己写的程序,所以这里我们选择Create New File。 在File Name中写入文件名(这里的file name和刚刚建立的project name可以一致也可以不一致)。注意Add file as type 要选择成Verilog(默认的是VHDL),然后OK。 发现屏幕中间的那个对话框没有自己消失,我们需要手动关闭它,点close。 并且在project中出现了一个half_clk.V的文件,这个就是我们刚刚新建的那个file。 这样工程就建立完毕了。 二、写代码: 1、写主程序:双击half_clk.v文件会出现程序编辑区,在这个区间里写好自己 的程序,这里我们写一个简单的二分频的代码: module half_clk_dai( clk_in, rst, clk_out ); input clk_in; input rst;

modelsim使用教程6.0

Modelsim 6.0 使用教程 1. Modelsim简介 Modelsim仿真工具是Model公司开发的。它支持Verilog、VHDL以及他们的混合仿真,它可以将整个程序分步执行,使设计者直接看到他的程序下一步要执行的语句,而且在程序执行的任何步骤任何时刻都可以查看任意变量的当前值,可以在Dataflow窗口查看某一单元或模块的输入输出的连续变化等,比quartus自带的仿真器功能强大的多,是目前业界最通用的仿真器之一。 对于初学者,modelsim自带的教程是一个很好的选择,在Help->SE PDF Documentation->Tutorial里面.它从简单到复杂、从低级到高级详细地讲述了modelsim的各项功能的使用,简单易懂。但是它也有缺点,就是它里面所有事例的初期准备工作都已经放在example文件夹里,直接将它们添加到modelsim就可以用,它假设使用者对当前操作的前期准备工作都已经很熟悉,所以初学者往往不知道如何做当前操作的前期准备。 2.安装 同许多其他软件一样,Modelsim SE同样需要合法的License,通常我们用Kengen产生license.dat。 ⑴.解压安装工具包开始安装,安装时选择Full product安装。当出现Install Hardware Security Key Driver时选择否。当出现Add Modelsim To Path选 择是。出现Modelsim License Wizard时选择Close。 ⑵.在C盘根目录新建一个文件夹flexlm,用Keygen产生一个License.dat,然后 复制到该文件夹下。 ⑶.修改系统的环境变量。右键点击桌面我的电脑图标,属性->高级->环境变量-> (系统变量)新建。按下图所示内容填写,变量值内如果已经有别的路径了, 请用“;”将其与要填的路径分开。LM_LICENSE_FILE = c:\flexlm\license.dat

Modelsim的仿真教程

ModelSim的仿真 1.仿真的分类 仿真过程是正确实现设计的关键环节,用来验证设计者的设计思想是否正确,及在设计实现过程中各种分布参数引入后,其设计的功能是否依然正确无误。仿真主要分为功能仿真和时序仿真。功能仿真是在设计输入后进行;时序仿真是在逻辑综合后或布局布线后进行。1). 功能仿真( 前仿真) 功能仿真是指在一个设计中,在设计实现前对所创建的逻辑进行的验证其功能是否正确的过程。布局布线以前的仿真都称作功能仿真,它包括综合前仿真(Pre-Synthesis Simulation )和综合后仿真(Post-Synthesis Simulation )。综合前仿真主要针对基于原理框图的设计; 综合后仿真既适合原理图设计, 也适合基于HDL 语言的设计。 2). 时序仿真(后仿真) 时序仿真使用布局布线后器件给出的模块和连线的延时信息,在最坏的情况下对电路的行为作出实际地估价。时序仿真使用的仿真器和功能仿真使用的仿真器是相同的,所需的流程和激励也是相同的;惟一的差别是为时序仿真加载到仿真器的设计包括基于实际布局布线设计的最坏情况的布局布线延时,并且在仿真结果波形图中,时序仿真后的信号加载了时延,而功能仿真没有。 后仿真也称为时序仿真或者布局布线后仿真,是指电路已经映射到特定的工艺环境以后,综合考虑电路的路径延迟与门延迟的影响,验证电路能否在一定时序条件下满足设计构想的过程,是否存在时序违规。其输入文件为从布局布线结果中抽象出来的门级网表、Testbench 和扩展名为SDO 或SDF 的标准时延文件。SDO 或SDF 的标准时延文件不仅包含门延迟,还包括实际布线延迟,能较好地反映芯片的实际工作情况。一般来说后仿真是必选的,检查设计时序与实际的FPGA 运行情况是否一致,确保设计的可靠性和稳定性。2.仿真的作用 1).设计出能工作的电路:因此功能仿真不是一个孤立的过程,其和综合、时序分析等形成一个反馈工作过程,只有这个过程收敛,各个环节才有意义。而孤立的功能仿真通过是没有意义的,如果在时序分析过程中发现时序不满足需要更改代码,则功能仿真必须从新进行。因此正确的工作流程是:

modelsim使用入门(VHDL_

modelsim使用实例(VHDL) 标签: modelsim仿真testbench FPGA 看了几天的modelsim以及如何在quartusII中调用,浏览了N个网页,尝试了N次,......终于初步完成。下面是入门部分介绍。 modelsim是专业的仿真软件,仿真运行速度比同类的其他仿真软件都要快很多。Quartus 自己都不再做仿真器了,普遍使用modelsim,自有其缘由。 这里用的是modelsim-altera(6.6d)版本,与quartus II 11.0搭配。据说Altera公司推出的Quartus软件不同版本对应不同的modelsim,相互之间不兼容。某些功能齐全的modelsim版本可以进行两种语言的混合编程, modelsim-altera只能支持一种语言进行编程(VHDL或者Verilog选其一)。 1、新建工程 打开modelsim-->file-->new-->project 新建工程,输入工程名,文件存放路径后(不可直接放在某盘下,必须放入文件夹中),进入下一步。 在主体窗口下方出现project标签。见下图。

2、新建文件 --create new file:输入名称div10,选择语言VHDL --关闭对话框 新的工程文件将会在工程窗口出现。 3、写入源程序(VHDL) 双击div10.vhd,打开文本编辑器。 实例代码如下(一个十分频的VHDL源代码):library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity div10 is --实体要与工程名相同 port(clk :in std_logic;

ModelSim 简明操作指南

第一章介绍 本指南是为ModelSim5.5f版本编写的,该版本运行于UNIX和Microsoft Windows 95/98/Me/NT/2000的操作系统环境中。本指南覆盖了VHDL和Verilog 模拟仿真,但是你在学习过程中会发现对于单纯的HDL设计工作而言,它是一个很有用的参考。ModelSim具备强大的模拟仿真功能,在设计、编译、仿真、测试、调试开发过程中,有一整套工具供你使用,而且操作起来极其灵活,可以通过菜单、快捷键和命令行的方式进行工作。ModelSim的窗口管理界面让用户使用起来很方面,它能很好的与操作系统环境协调工作。ModelSim的一个很显著的特点就是它具备命令行的操作方式,类似于一个shell有很多操作指令供你使用,给人的感觉就像是工作在Unix环境下,这种命令行操作方式是基于Tcl/Tk 的,其功能相当强大,这需要在以后的实际应用中慢慢体会。 ModelSim的功能侧重于编译、仿真,不能指定编译的器件,不具有编程下载能力。不象Synplify和MAX+PLUS II可以在编译前选择器件。而且ModelSim 在时序仿真时无法编辑输入波形,不象MAX+PLUS II可以自行设置输入波形,仿真后自动产生输出波形,而是需要在源文件中就确定输入,如编写测试台程序来完成初始化、模块输入的工作,或者通过外部宏文件提供激励。这样才可以看到仿真模块的时序波形图。另外对于Synplify来说,也只具有编译能力,但是比MAX+PLUS II可编译的verilog的内容要多,所以常常可以现在Synplify下编译,生成编译文件再送到MAX+PLUS II中使用。 ModelSim还具有分析代码的能力,可以看出不同的代码段消耗资源的情况,从而可以对代码进行改善,以提高其效率。 第二章ModelSim的主要结构ModelSim的主窗口(Main window)包括菜单栏、工具栏、工作区和命令行操作区。 在工作区可以显示Project Tab、Library Tab、Sim Tab(显示Load Design、Hierarchical Structure);在命令行操作区,可以用命令提示符的方式进行编译、仿真设计,同时打开其他窗口。 在菜单栏View下可以打开,source window、list window、wave window、

modelsim仿真教程

本教程使用软件的下载链接如下: https://www.sodocs.net/doc/109801256.html,/download/quartus_modelsim_setup.zip Molelsim仿真使用教程 ——利用quartus生成网表文件Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件,接下来以一个简单的例子介绍modelsim的基本使用方法。 第一步:建立工程,该过程与quartus使用的教程大部分是一样的,区别如下: 在simluation选项中选择MoselSim-Altera作为仿真工具,fomat中的选项根据编程语言进行选择,本教程以VHDL为例。 第三方的仿真工具 所以在此选择

第二步:新建文件: 新建一个源文件,保存为led.vhd library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity led is port(led_out : out std_logic_vector(7 downto 0); clk : in std_logic; rst_n : in std_logic ); end led; architecture behavior of led is signal light : std_logic_vector (7 downto 0); begin process(clk,rst_n) begin if(rst_n = '0')then light <= "00000010"; elsif(clk'event and clk ='1' )then if(light = "10000000") then light <= "00000001"; else light <= light(6 downto 0)& '0'; end if; end if; end process; led_out <= light; end behavior; 新建一个testbench 文件,保存为testbench.vhd(testbench是电路的激励文件,在后面章节会详细介绍,这里仅仅作为软件的演示不具体介绍testbench的设计过程): library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.numeric_std.all; entity testbench is end testbench; architecture behavior of testbench is

ModelsimSE仿真步骤(优选.)

WILDSC ModelsimSE仿真教程 Verilog & VHDL 孙玉阳 2014/6/3 对于ModelsimSE仿真设置网上很难找到详细教程,在此写一篇基于Verilog 和VHDL的ModelsimSE的仿真设置教程,以期缩短大家ModelsimSE学习时间,由于时间仓促,不足之处还请见谅。

目录 1 ModelsimSE仿真——Verilog HDL (2) 1.1 建立资源库 (2) 1.1.1 建立资源库的目的 (2) 1.1.2 建立资源库前准备 (2) 1.1.3 建立资源库的步骤 (3) 1.2 功能仿真 (11) 1.2.1 建立ModelsimSE工程 (11) 1.2.2 添加Quartus工程文件 (12) 1.2.3 编译 (14) 1.2.4 仿真 (18) 1.3 时序仿真 (21) 2 ModelsimSE仿真——VHDL (25) 2.1 建立资源库 (25) 2.1.1 建立资源库的目的 (25) 2.1.2 建立资源库前准备 (25) 2.1.3 建立资源库的步骤 (26) 2.2 功能仿真 (33) 2.2.1 建立ModelsimSE工程 (33) 2.2.2 添加Quartus工程文件 (34) 2.2.3 编译 (37) 2.2.4 仿真 (40) 2.3 时序仿真 (44)

1ModelsimSE仿真——Verilog HDL 1.1建立资源库 1.1.1建立资源库的目的 Quartus Verilog工程文件里面在使用Primitives、Megafunction、LPM等Quartus自带模块时,会调用Quartus本身自带的一些库文件,但是ModelsimSE在仿真Quartus Verilog工程文件时不会自动去调用Quartus的库文件,同时ModelsimSE也不自带与Primitives、Megafunction、LPM相关的库文件。所以在仿真Primitives、Megafunction、LPM等模块时,必须在ModelsimSE里建立与其对应的资源库,否则无法仿真。 1.1.2建立资源库前准备 (备注:若需要后仿真(时序仿真)则进行这一步骤,若只进行前仿真(功能仿真)则跳过此步骤): 打开待仿真的quartus工程,点击菜单Assignments->Settings,打开如下窗口 将以下红色部分设置好,先点击apply,然后点击OK即可

ModelSim简明使用教程

ModelSim6.1入门教程 因为本人在初学Verilog 编程语言时,觉得很难上手的是使用ModelSim ,所以今天和大家交流一下,好了,闲话不多说了,我们开始吧! 1,打开ModelSim 的画面如下: 标准的windows 界面,最上面是菜单栏,以及菜单栏的一些快捷方式。左边是工作空间,里面显示的是一些库文件。右边是编辑区,最下面是交互区,可以通过命令完成所有的操作。我们在此只讲一些基本的命令输入,以完成仿真。 2 ,建立工程,如图所示: 单击Project 之后,画面如下:菜单快捷栏 工作空间栏编辑栏 仿真交互栏

在图中Project Name中输入AND_2,这也是我们建立的第一个工程,路径选择如下图所示,默认库名我们用默认的work。 这一步完成之后,点击ok,如下图:

单击ok后,如下图: 其实应该没有右边的那个Creat Project File选择框,只有左边的Add items to the Project,呵呵,在此偷懒了。单击Add items to the Project中的Creat New File(如果你已经写好了代码,可以通过点击Add Existing Flie添加),如下图: 在File Name中输入AND_2,在Add file as type选项中选择Verilog,其他的使用默认即可。单击ok。

在工作空间中添加了名为AND_2的文件,如图。状态是“?”,说明没有通过编译。其实咱还没开始写代码呢!好了,现在开始正式写代码了。双击图中AND_2文件那一行的任何地方,就会打开右边的编辑区,和其他IDE工具一样,使用编辑器,输入如下代码:module AND_2(clk,rst,A,B,C); input clk,rst,A,B; output C; reg C; always@(posedge clk or negedge rst) if(!rst) C<=1'b0; else C<=A&B; Endmodule 输入完成后,单击保存。 注意:模块名和工程名一定要一样,否则编译不能通过。 3,编译,如下图: 右键单击图中AND_2文件那一行的任意地方,弹出选项如图所示,选择Compile选项的Compile All,如下图所示:

modelsim 10仿真教程

Modelsim仿真教程 一、前期准备 1、正确安装好modelsim和quartus软件。我用的平台的版本是Modelsim SE10.1 和Quartus II10.1。 2、在ModelSim中加入Quartus提供的仿真库 在ModelSim中进行仿真需要加入Quartus提供的仿真库,原因是下面三个方面: ·Quartus不支持Testbench; ·调用了megafunction或者lpm库之类的Altera的函数; ·时序仿真要在Modelsim下做仿真。 下面以Altera器件为例,介绍如何在ModelSim中加入Altera的仿真库,Quartus II 软件中自带有Altera的仿真库,只要把它拿到ModelSim中去编译一下就可以了,具体步骤如下: (1).设置仿真库路径 打开ModelSim安装目录(我用的是ModelSim SE10.1版本,安装在C:\modeltech_10.1 目录下),新建文件夹altera,我们就在该目录下存放预编译的各种Altera库。 启动ModelSim SE,在主窗口执行【File】/【Change Directory】命令将路径转到altera 文件夹。

(2).新建库 Quartus II中提供的仿真库文件存放的路径是....\altera\10.1sp1\quartus\eda\sim_lib,每个库文件提供了两种形式:.v(Verilog)格式和.vhd(VHDL)格式两种,根据你所用的语言选择使用。用于编译资源库的文件有220model.v,220model.vhd,220pack.vhd,altera_mf.v,altera_mf.vhd,altera_mf_components.vhd,altera_primitives.v,altera_primitives.vhd, altera_primitives_components.vhd文件。网上的很多教程都是把这些文件一起编译,这样适用于Verilog和VHDL混合仿真,但如果只用一种语言,如Verilog则完全没必要全部编译。下面以该目录下的altera_mf.v为例介绍建立预编译库的方法。 注:ModelSim中仿真库可以分为两大类:第一类是工作库(working),默认值为“work”目录,work目录中包含当前工程下所有被编译的设计单元,编译前必须建立一个work库,并且每个编译有且仅有一个work库;第二类是资源库(resource),存储能被当前编译引用的设计单元,在编译期间允许有多个resource库,这节所讲的都是添加altera资源库。 在主窗口中选择【File】/【New】/【Library】命令,新建一个名为altera_mf的库。 (3).编译库 方便起见在altera文件夹下新建目录src,把用于编译资源库的文件复制到src文件夹中。 在主菜单中选【Compile】/【Compile】命令,弹出Compile Source Files对话框,library 中选择你刚才建立的库名altera_mf,查找范围你选择altera_mf.v文件,刚才你已经把它复制到了...\altera\src目录下。执行编译命令。

Modelsim初级使用教程

Modelsim初级使用教程(转) 一、Modelsim简介 Modelsim仿真工具是Model公司开发的。它支持Verilog、VHDL以及他们的混合仿真,它可以将整个程序分步执行,使设计者直接看到他的程序下一步要执行的语句,而且在程序执行的任何步骤任何时刻都可以查看任意变量的当前值,可以在Dataflow窗口查看某一单元或模块的输入输出的连续变化等,比quartus自带的仿真器功能强大的多,是目前业界最通用的仿真器之一。 对于初学者,modelsim自带的教程是一个很好的选择,在Help->SE PDF Documentation->Tutorial里面.它从简单到复杂、从低级到高级详细地讲述了modelsim的各项功能的使用,简单易懂。但是它也有缺点,就是它里面所有事例的初期准备工作都已经放在example文件夹里,直接将它们添加到modelsim就可以用,它假设使用者对当前操作的前期准备工作都已经很熟悉,所以初学者往往不知道如何做当前操作的前期准备。 二、安装 同许多其他软件一样,Modelsim SE 同样需要合法的License,通常我们用Kengen产生license.dat。 1 解压安装工具包开始安装,安装时选择Full product安装。当出现Install Hardware Security Key Driver时选择否。当出现Add Modelsim To Path 选择是。出现Modelsim License Wizard时选择Close。 2 在C盘根目录新建一个文件夹flexlm,用Keygen产生一个License.dat,然后复制到该文件夹下。若License通过,但是打开ModelSim仍出错,则将系统时间调到2008年之前,重新生成License,再将时间调回来即可。 3 修改系统的环境变量。右键点击桌面我的电脑图标,属性->高级->环境变量->(系统变量)新建。按下图所示内容填写,变量值内如果已经有别的路径了,请用";"将其与要填的路径分开。LM_LICENSE_FILE = c:\flexlm\license.dat 4 安装完毕,可以运行。 注意:1、电脑的用户名不能为中文; 2、安装路径不能出现中文和空格,只能有数字、英文字母和下划线"_"组成; 3、若计算机还需要使用ModelSim-Altera 6.4a (Quartus II 9.0),可不需做任何额外的设定,ModelSim SE 6.3g会自动抓到这个系统变量,并使用这个license file;反之亦然。

ModelSim11.0 教程

Quartus11中调用ModelSim-Altera6.5实例指导 编者:Ourfpga https://www.sodocs.net/doc/109801256.html, 备注:参考网络上文档及代码编写此文档,在此对他们表示感谢! 此处默认您已经安装好quartus11.0软件。。。 一.Modelsim_Altera_ase软件安装 睿智FPGA开发板配套光盘内提供了Modelsim_Altera_ase的安装包,ase版本是altera start edition,即入门版,免费使用的;ae是altera edition,,需要破解,支持更多功能吧。 但对于我们,ase版本已经足够了。装上就能使用。就不费破解的事了。 如想安装ae版本,请参考Bingo写过的教程,网页地址如下: https://www.sodocs.net/doc/109801256.html,/crazybingo/archive/2011/02/21/1959893.html 此处安装11.0_Altera_Modelsim_ase_windows.exe,。具体步骤如下: (1)打开安装目录下的setup,一路next,直到选择路径的时候,选择与quartus ii安装目录相同的路径。如下图所示,我的电脑上装在E盘上了,您要根据您的设置来改。 (2)继续next,静默,等待安装完毕…… (3)安装完毕,出现以下界面: (4)OK,Finish! (5)打开Quartus II,打开菜单Tool-Options,在EDA Tool Options中的Modelsim-Altera,选择Moldelsim-Altera应用程序的根目录,配置Modelsim-Altera

应用程序第三方软件路径。如下图所示:在该选项卡中下面的ModelSim-Altera一项指定安装路径为E:/Altera/11.0/modelsim_ae/win32aloem(其中E:/Altera/11.0/modelsim_ae/为我电脑中ModelSim-Altera6.5e的安装路径) 至此,Altera-Modelsim ase版本安装完毕 二.如何在Quartus II11.0中调用ModelSim-Altera 我以一个简单的实例来描述整个过程: 先弄一个工程,打开QuartusII,菜单file---new,新建一个工程

modelsim详细使用教程.pdf

Modelsim 详细使用方法 很多的modelsim教程中都讲得很丰富,但忽视了对整个仿真过程的清晰解读,而且都是拿counter范例举例子,有些小白就不会迁移了。这里我们着眼于能顺利的跑通一个自己写的程序,一步一步的讲解,如果你是一个初学者,这再适合你不过了,虽然貌似字写得比 较多,那是因为写得相当的详细,一看就会啦O(∩_∩)O~ 一、建立工程 1、在建立工程(project)前,先建立一个工作库(library),一般将这个 library 命名为 work。尤其是第一次运行 modelsim 时,是没有这个“work”的。但我们的 project 一般都是在这个work下面工作的,所以有必要先建立这个work。 File → new → library 点击library后会弹出一个对话框,问是否要创建work,点击OK。就能看见work.

2、 如果在 library 中有 work ,就不必执行上一步骤了,直接新建工程。 File →new →project 会弹出 在 Project Name 中写入工程的名字,这里我们写一个二分频器,所以命名 half_clk,然后点击 OK 。 会出现

由于我们是要仿一个自己写的程序,所以这里我们选择Create New File。 在File Name中写入文件名(这里的file name和刚刚建立的project name可以一致也可以不一致)。注意Add file as type要选择成Verilog(默认的是VHDL),然后OK。 发现屏幕中间的那个对话框没有自己消失,我们需要手动关闭它,点close。 并且在project中出现了一个half_clk.V的文件,这个就是我们刚刚新建的那个file。 这样工程就建立完毕了。 二、写代码: 1、写主程序:双击 half_clk.v 文件会出现程序编辑区,在这个区间里写好自己的 程序,这里我们写一个简单的二分频的代码: module half_clk_dai( clk_in, rst, clk_out ); input clk_in; input rst;

相关主题