第一篇:modelsim仿真小结(最终版)
Modelsim仿真小结
Modelsim的基本仿真流程大致分以下几个步骤:建库、编译工程、前后仿真、调试等。Modelsim仿真既可以在modelsim界面操作,也可以用do文件实现,这里结合学习的教程、网上看到的资料,和实际遇到的一些问题,分别做一整理小结。
1.建库
建库包括Altera库和Xilinx库,同时都包括Verilog和VHDL。这里只建了Verilog库,VHDL和Verilog步骤相同。
对于Altera库主要包括lpm元件库、Mega_Function库atera_mf、altera原语库altera_primitive和各器件系列模型库。前三种是调用altera模块的必备库,第四种是进行综合后功能仿真和布线后时序仿真需要的库,和器件系列有关,只选对应系列即可。
Altera库创建和编译步骤如下:
a)在Modelsim安装目录下新建文件夹,命名altera_lib,以存放编译后的库文件,可以在altera_lib下新建Verilog和VHDL两个子文件夹,分别存放Verilog和VHDL库。b)打开Modelsim,新建Library,file->new->library..c)如下图,创建lpm库,路径E:modeltech_10.1aaltera_libVeriloglpm
d)添加库文件,并编译,compile-> compile …,出现compile source files窗口,library 指定到lpm下,查找范围,选quartus安装目录下… edasim_lib目录里的仿真原型文件:220model.v,点compile,点done。
到此,lpm库建立完毕。
e)同理,建立altera_mf库添加 altera_mf.v,建立primitive库添加altera_primitive.v 建立各系列的模型库,命名可用系列名加_ver“xxx_ver”,也可随意吧,添加各系列的xxx_atoms.v。
这里,也可以把以上库放在一个文件夹,这样做简单,一次就搞定,分开也就是条理清楚,没人去看,所以没必要。
f)修改modelsim.ini文件,为的是让modelsim能自动map到已经编译的这些库上。先去掉只读属性,在[Library]和[vcom]之间加上:库名=库路径[绝对路径或者相对路径],相对路径是相对于modelsim安装路径,modelsim安装路径用$MODEL_TECH表示。
这里所有库都放在E:modeltech_10.1aaltera_lib下,库名是altera_lib,这里只添加一句: altera_lib = E:modeltech_10.1aaltera_lib
g)保存退出,改回modelsim.ini只读属性,防止乱改。至此altera库建立完毕。
Xlinx库创建和编译步骤如下:
相比altera,xilinx建库很方便。xilinx有批处理命令,直接在console命令窗口,输入compxlib命令,调出编译库的窗口,先改掉modelsim安装目录下modelsim.ini只读属性。设置如下图:
Next,选择语言:
Next,选择需要编译的器件:
Netx-> next,选择输出路径,launch compile process,等待编译完成。完成后改回modelsim.ini只读属性。至此xilinx库建立完毕。
2.编译工程
编译工程主要包括:code、testbench、建立工程、建立工程库、映射、编译等。Code主要有code思想和风格,在Verilog部分涉及。Testbench,下边给出一个公用模板,基于这个方便修改,可以根据自己的习惯建一个temp_tb.v。
Modelsim界面编译工程:
a)新建工程:打开modelsim,file-> new-> project..,指定工程名、路径、工程库。
b)Add existing file
c)Add testbench file ….d)编译,compile –> complie all
e)编译语法查错,直到编译通过。至此编译完毕。
3.功能和时序仿真
仿真是在编译的基础上,进行的功能调试,包括综合前功能仿真、综合后功能仿真和布局布线后时序仿真。
Modelsim界面综合前仿真:
a)指定顶层,开始仿真;simulation-> start simulation …,在work 库中,指定testbench,ok,开始仿真。
b)查看仿真结果,打开wave,信号,加入wave
c)运行,查看波形。Run-> run all ….至此,简单的modelsim界面综合前仿真介绍完毕。
Modelsim界面综合后仿真:
综合后仿真需要quartus综合后的网表文件(以altera为例),a)综合后的网表的生成: quartus工程名右键-> setting –> EDA Tool Setting, 双击Simulation,选择EDA软件modelsim,选择输出网表路径,如图
b)More settings ….将 Generate netlist for functional simulation only 设置为ON
c)保存,全编译。
d)
检查一下„/modelsim/Psyth/source 里面,可以发现,已经生成了一个*.vo 文件。这个就是需要的网表文件。(VHDL 的输出网表是*.vho 后缀名的)
e)将vo文件添加到工程,指定TestBench 文件top_tb.v,同前边一样进行仿真。
e)得到的仿真结果
Modelsim界面布局布线后仿真:
布局布线后仿真需要综合网表文件和添延时文件*.sdo(Verilog)或*_vhd.sdo(VHDL);
a)QuartusII 里面设置重新把Generate netlist for functional simulation only 设置成OFF。
b)指定延时文件
这里,region要为顶层文件在tb里的例化名。c)运行,查看波形,波形带有延时
4.用tcl文件.do 进行modelsim仿真
在modelsim中使用do文件是非常方便的进行仿真的一种方法,的项目比较大,特别是几个人分开做的时候,前后模块的联合仿真比较重要,查看的信号比较多,使用了do文件可以自动仿真,省去很多体力活。
下面是编写do文件的一般步骤:
a).quit-sim : 首先退出原来仿真的工程。
b).cd : 设置工作目录的路径,就是你所要建立的工作目录work要放在哪里。
c).vlib work
: 在工作目录下建立一个work目录,请注意不要用操作系统直接新建一 个work的文件夹,因为用操作系统建立的work文件夹并没有modelsim SE自动生成的_info文件。还有个问题是,当你的软件工程里需要用到软核时,可能会需要一些库,但这些库ISE软件中是没有的,此时就需要我们自己新建库了,并映射到当前目录下。我们只自己新建的库一般放在work库前面建立。
d).vmap work : 将新建的work库映射到当前工作目录下(当前目录就是第一步中的目录了)。其他新建的库也要这样的方法映射。
e).vlog +acc –work work “file_path/*.v” : 编译“file_path”目录下所有.v文件,并将 其添加进工作库(work)中,包括IP生成的V文件也要编译的。或者:vlog-f top_tb.f,top_tb.f是.v的列表文件。编译时可以分开单独编译,但是一定要注意顺序,先编译被调用的文件。在综合后仿真和布局布线后仿真的时候,这里添加综合后网表和tb即可。VHDL 用vcom编译。
对于xilinx工程在仿真的时候还需要用到一个文件,那就是glbl.v这个库文件。它是存放在xilinx安装目录下,我们直接编译它并添加时工作库(work)就可以了。特别需要说明的是,在仿真软核的时候,在XPS软件里点击simulation-> generate simulation hdl files会在工程目录中生成一个simulaton文件夹,这个文件夹里的东西就是软核仿真时所需要的仿真文件了。所以我们需把simulaton里所以的v文件都编译一次,这样才能仿真软核。
f).vsim-L altera_lib-novopt work.top_tb : 这是没有调用IP Core时的仿真命令,注意后面的参数top_tb必须为Testbench中的模块名。布局布线后仿真是这里要指定延时文件,vsim-L altera_lib-novopt-sdfmax /top_tb/top=top_v.sdo work.top_tb g).do vawe.do 运行添加wave tcl,这里可以给信号分组,添加颜色,设置波形属性等。h).run –all 设定运行时间,run 1000ms等。
i).在do里可以用file copy/file delete 来对临时文件进行操作。
至此,modelsim仿真总结完毕。这里仅为了简单记录仿真方法和流程,旨在简单明了,对更深入的和更详细的有待进一步补充。
附件 一、testbench 模板
//////////////////////////////////////////////////////////////////////////////// // Company:
// Revision: //
`timescale 1ns / 1ps module top_tb;
//*************************Parameter Declarations****************************** parameter
CLK_PERIOD = 20;//clk = 50Mhz
//************************Internal Declarations*********************** //************************** Register Declarations ****************************
reg
clk;reg
reset;
//********************************Wire Declarations************************** //******************************Main Body of Code*************************** //--initial reg data--initial begin
end //----------Generate Reference Clock input to tb----------------
initial
begin
clk = 1'b1;end
always
#(CLK_PERIOD/2)clk =!clk;
//--Resets--
initial
begin
rst_n = 1'b1;
#(10*CLK_PERIOD)rst_n = 1'b0;
#(100*CLK_PERIOD)rst_n = 1'b1;
end
//-----------------------------Data Transfer--
initial begin
#(10*CLK_PERIOD);@(negedge data)
begin
end end
//-----------------------------simulation end--
initial begin #(10*CLK_PERIOD);if()
//end sign
begin
$display(“-------TEST PASSED-------”);
end else begin
$display(“
ERROR: TEST FAILED!
”);end $stop;end
//------------------------Instantiate TOP module------------------------
top #(.parameter1
(1),//.parameter2
(0)
//)top_inst(.a(a),);
Endmodule ////////////////////////////////////////////////////////////////////////////////
附件二、do 模板
//////////////////////////////////////////////////////////////////////////////// #!/bin/bash #this bash shell document is used to verilog project simulation #author:iyoyoo
echo “***************** end pre-project ********************************” quit-sim
echo “***************** go to work dir ********************************” #cd / #cd D:/quartus/EP4CE15F/lcd/simulation
echo “***************** start to setup work lib************************” vlib work echo “***************** start to compile ******************************” vlog-f top_tb.f
echo “***************** set up reference library ***********************” vmap altera_lib E:/modeltech_10.1a/altera_lib
echo “***************** delet pre-temp files *************************” #file delete../simulation/pika_ani.mif #file delete../simulation/modelsim/top_v.sdo
echo “***************** copy temp file *********************************” #file copy../source/pika_ani.mif../simulation/ #file copy../simulation/modelsim/top_v.sdo../simulation/
echo “***************** start to simulation **************************” #-pli novas.dll
---for debussy #-sdfmax /top_tb/top=top_v.sdo
-----for post synthesis sim
vsim-L altera_lib-novopt work.top_tb
echo “***************** add signal to vawe **************************” do vawe.do
echo “***************** start to run
******************************” run-all
echo “***************** delete temp files ***************************” #file delete../simulation/pika_ani.mif #file delete../simulation/modelsim/top_v.sdo ////////////////////////////////////////////////////////////////////////////////
附件三、file.f模板
//////////////////////////////////////////////////////////////////////////////// +licq_all+ +access+r
//../simulation/modelsim/top.vo
-for post synthesis simulation
../source/top.v
../simulation/top_tb.v
+libext+vmd+.v-y $QUARTUS_ROOTDIR/eda/sim_lib ////////////////////////////////////////////////////////////////////////////////
附件三、file.f模板
////////////////////////////////////////////////////////////////////////////////
view signals stucture wave onerror {resume} quietly WaveActivateNextPane {} 0
#-color Green for all signal is green #-color Green Blue Yellow Pink Orchid Red Salmon Orange
# top_tb group add wave-itemcolor Blue-noupdate-expand-group top_tb-format Logic-radix hexadecimal /top_tb/*
# sub group add wave-itemcolor Green-noupdate-expand-group sub-format Logic-radix hexadecimal /top_tb/sub/*
TreeUpdate [SetDefaultTree] WaveRestoreCursors {{Cursor 1} {10000 ns} 0} configure wave-namecolwidth 364 configure wave-valuecolwidth 100 configure wave-justifyvalue left configure wave-signalnamewidth 0 configure wave-snapdistance 10 configure wave-datasetprefix 0 configure wave-rowmargin 4 configure wave-childrowmargin 2 configure wave-gridoffset 0 configure wave-gridperiod 1 configure wave-griddelta 40 configure wave-timeline 0 configure wave-timelineunits ps update WaveRestoreZoom {10000 ns} {10000 ns}
////////////////////////////////////////////////////////////////////////////////
第二篇:Modelsim 仿真方法总结
Modelsim 仿真方法总结
Modeling 仿真工具是Model公司开发的。它支持Verilog、VHDL以及他们的混合仿真。Modelsim各版本的使用方法大体一致,Modelsim仿真主要分为前仿真和后仿真。下面来具体介绍modelsim的仿真方法,涉及quartus-modelsim联合(使用)仿真的差异会特别提示。
前仿真与后仿真说明 1.1 前仿真
前仿真也称为功能仿真、行为仿真。旨在验证电路的功能是否符合设计要求,其特点是不考虑延迟(包括门延迟与线延迟),主要验证电路与理想情况是否一致。前仿真需要用到RTL级代码(由源代码经过综合后产生)与Testbench。
1.2)后仿真
后仿真也称为时序仿真或者布局布线仿真。是指在电路已经映射到特定的工艺环境以后,综合考虑门延迟与线延迟的影响,验证电路在一定的时序条件下是否存在时序违规以及能否满足设计构想的过程。需要用到的文件是——从布局布线结果中抽象出来的门级网表、testbench和后缀名为sdo或者sdf的标准时延文件。
注:扩展名为sdo和sdf的标准时延文件包含门延迟与实际布线延迟,能较好的反应芯片的实际工作情况。
二)modelsim仿真主要有以下几个步骤:
(1)建立库并映射库到物理目录;(2)编译源代码(包括Testbench);(3)执行仿真; 解释: ①库:modelsim中有两类仿真库。一种是工作库,默认名为work;另一种是资源库。Work库中存放当前工程下所有已经编译过的文件,所以编译前一定要建立一个work库。资源库存放work库中已经编译文件所要调用的资源,这样的资源可能有很多,它们被存放在不同的资源库内。(例如要想对综合在cyclone芯片中的设计做后仿真,就需要有一个名为cyclone_ver的资源库。)
映射库用于将已经预编译好的文件所在目录映射为一个modelsim可识别的库。(此即是为仿真库建立一个逻辑映像的行为过程,后面会提到,在modelsim中新建库时,create a new library and a logical mapping to it或a map to an existing libraryd的提示)
上述三个步骤是大的框架,前仿真和后仿真均是按照这个框架进行的,建立modelsim工程对前后仿真来说都不是必须的。下面分别介绍每一步的操作。
2.1)建立库
在执行一个仿真前先建立一个单独的文件夹,将操作对象文件放在该文件夹下面。然后启动modelsim软件将modelsim当前路径改动到此文件下。修改方法是File>Change Directory。
注意:上面说的是独立运行modelsim仿真的情况。当采用quartus联合modelsim仿真时,在quartus里面设置第三方EDA仿真工具后,编译成功会自动在quartus工程目录下面创建一个simulationmodelsim的文件夹,此文件夹等同于独立运行moddelsim仿真时最先建立的文件夹。另quartus联合modelsim仿真,modelsim默认路径即为其自动创建文件夹simulationmodelsim下,不必人为更改。
启动modelsim后,建立仿真库。点击file>new>library,出现对话框,选择a new library and a logical mapping to it(已默认),在library name 中输入要创建库的名称。
总结步骤为:启动modelsim-->点击file-->chang directory(如需更改路径的话);再file-->new-->(project)-->library,进行相关设置。即可。
2.2)编写源代码及testbench;在编写目标测试文件(testbench)之前,我们先写完目标文件(既可在quartus中编写,也可以在modelsim中编写),把它编译进工作库。(当然此步也可以等到和测试文件写完以后一起编译)。源代码的编写就不用介绍了,下面介绍编写testbench的两种方法。
A)可以在modelsim内直接编写测试文件,而且modelsim提供各种testbench模板,我们只需更改其中小部分即可。在modelsim中执行File>New>Source>Library或者直接点新建文件,会出现一个verilog(或VHDL)文本编辑页面,编辑测试文件即可。另modelsim中提供各种测试文件模板,直接拿过来用会减少工作量。在verilog文本编辑页面空白处右键点击Show Language Templates,然后会出现一个加载工程,接着在刚才文本编辑窗口左边出现一个Language Templates窗口,双击Creat Testbench会出现一个创建向导,选择Specify Design Unit工作库下,work工作库中的目标文件(即为目标文件配套testbench),点Next。可以指定Testbench的名称以及要编译到的库等,此处我们使用默认设置直接点Finish。这时在Testbench内会出现对目标文件的各个端口的定义还有调用函数接下来,设计者可以自己往Testbench内添加内容了,我们只需更改其中的少量部分,即可完成testbench,然后保存为.v格式即可。按照前面的方法(点中文件后右键,选中compile即进行该文件的编译,或者点击菜单栏中的compile菜单,然后选中要编译的文件)把Testbench文件也编译到工作库中。
B)在 Quartus内编写并编译 Testbench,之后将Testbench 和目标文件放在同一个文件夹下,按照前面的方法把 Testbench 文件和目标文件都编译到工作库中之后。
另如果在工作库中没有该文件(在Testbench文件没有端口的情况下),则在Simulate——>Start Simulate卡片中去掉优化选项Enable optimization之后再重新编译,即可在工作库中找到该文件。
三)执行仿真(分别说明前仿真和后仿真)3.1)前仿真
前仿真相对来说简单些,在执行到上面一步,把需要的文件编译到作库后,我们只需点simulation>start simulation或快捷按钮。会出现startsimulation对话框,点击Design标签选择work库(工作库)中的测试文件然后点ok既可以。在主界面中会多出来一个Objects窗口,里面显示 Testbench 里定义的所信号引脚,在Workspace里也会多出来一个Sim标签。右键点测试文件,选择Add->Add to Wave,然后将出现Wave窗口,现在就可以仿真了。3.2)后仿真
后仿真与前仿真步骤大体相同,只不过中间需要添加仿真库(和所选器件资源库,例如在原理图文件中用到IP core,我们这里就要把相关的_mf.v库加进来。)网表和延时文件的步骤。
后仿真的前提是quartus已经对要仿真的目标文件进行编译,注意引脚的分派。并生成modelsim仿真所需要的.vo文件(网表文件)和.sdo文件(时延文件)。具体操作过程又有两种方法,一种是通过Quartus调用Modelsim,Quartus在编译之后自动把仿真需要的.vo文件以及需要的仿真库加到modelsim中,操作简单;一种是手动将需要的文件和库加入modelsim进行仿真,这种方法可以增加主观能动性,充分发挥modelsim的强大仿真功能。
A)通过quartus调用modelsim;使用这种方法时首先要对Quartus进行设置。先运行Quartus,打开要仿真的工程,点菜单栏的Assignments,点EDA Tool settings,选中左边Category中的Simulation.,在右边的Tool name中选ModelSim(Verilog),选中下面的Run Gate Level Simulation automatically after complication。
Quartus中的工程准备好之后点击start complication按钮,此时modelsim会自动启动,而quartus处于等待状态(前提是系统环境变量中用户变量中PATH要设置好modelsim安装路径)。而且work库中出现了需要仿真的文件。Modelsim自动将quartus生成的.vo文件编译到work库,并建立相应的资源库。
编写测试台程序,最好放在生成的.vo文件所在的目录,以方便在需要手动仿真时使用。点Compile在出现的对话框中选中刚写好的测试文件,然后点Compile按钮,编译结束后点Done,这时在Work库中会出现测试台文件。
点击simulate->Start Simulation或快捷按钮 会出现start simulate对话框。点击Design标签选择Work库下的测试文件,然后点击Libraries标签在Search Library中点击Add按钮,选择仿真所需要的资源库(如果不知道需要选择哪个库,可以先直接点Compile看出现的错误提示中说需要的库名,然后再重复上述步骤)。
再点start simulate对话框的SDF标签。在出现的对话框的SDF File框内加入.sdo时延文件路径。在Apply To Region框内有一个“/”,在“/”的前面输入测试台文件名,在它的后面输入测试台程序中调用被测试程序时给被测试程序起的名称。(一般为DUT)
B)手动仿真;
手动仿真需要自己添加文件和编译库,但可以充分发挥modelsim强大的仿真功能。操作时也要先对quartus进行设置,设置与前面相同只是不要选中Run Gate Level Simulation automatically after complication。然后启动modelsim,将当前路径改到“工程文件夹simulationmodelsim”下。向该文件夹中手动添加所需要的仿真文件,包括.vo文件、相关芯片资源库(后缀_atoms.v)以及原理图情况下的IP core相关资源(后缀-mf.v)。然后在modelsim中点编译,将这些文件编译到工作库下,点击simulate->Start Simulation或快捷按钮 会出现start simulate对话框。这里和A情况相比只有Libraries标签在Search Library时不一样,其余2项都一样。Libraries标签在Search Library下选中simulationmodelsim下work库。后面观察波形与前面方法一致。
两种方法的区别在于,modelsim仿真所需要的.vo文件以及.sdo文件,和资源库的建立方法不同,手动仿真需要自己添加这些文件到工作库下。建议使用手动添加的方式,有利于我们对软件使用的更好理解。
以上方法可供参考,modelsim软件自带的教程也是一个不错的学习路径,在help>SE PDF Documentation>Tutorial里面有详细的功能讲解,使用时可以看看。
第三篇:verilog图像翻转报告_modelsim仿真
Verilog大作业
系名信息工程系 专业电子科学与技术 6010202036-李贝 6010202043-王玉斌 6010202034-解海洋 6010202035-冷健 指导教师史再峰
2012年 10 月 27 日
BMP(全称Bitmap)是Window操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图 像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。组成
典型的BMP图像文件由四部分组成:
1:位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;
2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。对应的数据结构
1:BMP文件组成
BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。
图像文件头
1)1-2:(这里的数字代表的是“字”,即两个字节,下同)图像文件头。
0x4d42=’BM’,表示是Windows支持的BMP格式。(注意:查ascii表B 0x42,M0x4d,bfType 为两个字节,B为low字节,M为high字节所以bfType=0x4D42,而不
是0x424D,但注意)2)3-6:整个文件大小。4690 0000,为00009046h=36934。
3)7-8:保留,必须设置为0。4)9-10:保留,必须设置为0。
5)11-14:从文件开始到位图数据之间的偏移量(14+40+4*(2^biBitCount))。4600 0000,为00000046h=70,上面的文件头就是35字=70字节。
位图信息头
6)15-18:位图图信息头长度。
7)19-22:位图宽度,以像素为单位。8000 0000,为00000080h=128。
8)23-26:位图高度,以像素为单位。9000 0000,为00000090h=144。
9)27-28:位图的位面数,该值
总是1。0100,为0001h=1。
10)29-30:每个像素的位数。有1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。1000为0010h=16。
11)31-34:压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)。RLE简单地说是采用像素数+像素值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。图中0300 0000为00000003h=3。12)35-38:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于(≥位图宽度的最小的4的倍数)×位图高度×每个像素位数。0090 0000为00009000h=80×90×2h=36864。
13)39-42:用象素/米表示的水平分辨率。A00F 0000为0000 0FA0h=4000。
14)43-46:用象素/米表示的垂直分辨率。A00F 0000为0000 0FA0h=4000。
15)47-50:位图使用的颜色索引数。设为0的话,则说明使用所有调色板项。
16)51-54:对图象显示有重要影响的颜色索引的数目。如果是0,表示都重要。彩色板
17)(55+0)到(50-1+2^biBitCount):彩色板规范。对于调色板中的每个表项,用下述方法
来描述RGB的值: 1字节用于蓝色分量 1字节用于绿色分量 1字节用于红色分量
1字节用于填充符(设置为0)对于24-位真彩色图像就不使用彩色板,因为位图中的RGB值就代表了每个象素的颜色。
如,彩色板为00F8 0000 E007 0000 1F00 0000 0000 0000,其中:
00F8为F800h = 1111 1000 0000 0000(二进制),是蓝色分量的掩码。
E007 为 07E0h = 0000 0111 1110 0000(二进制),是绿色分量的掩码。
1F00为001Fh = 0000 0000 0001 1111(二进制),是红色分量的掩码。
0000 总设置为0。
将掩码跟像素值进行“与”运算再进行移位操作就可以得到各色分量值。看看掩码,就可以明白事实上在每个像素值的两个字节16位中,按从高到低取5、6、5位分别就是r、g、b分量值。取出分量值后把r、g、b值分别乘以8、4、8就可以补齐第个分量为一个字节,再把这三个字节按rgb组合,放入存储器(同样要反序),就可以转换为24位标准BMP格式
了。图像数据阵列
18)55(无调色板)-bfSize:每两个字节表示一个像素。阵列中的第一个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素。
存储算法
BMP文件通常是不压缩的,所以它们通常比同一幅图像的压缩图像文件格式要大很多。例如,一个800×600的24位几乎占据1.4MB空间。因此它们通常不适合在因特网或者其它低速或者有容量限制的媒介上进行传输。根据颜色深度的不同,图像上的一个像素可以用一个或者多个字节表示,它由n/8所确定(n是位深度,1字节包含8个数据位)。图片浏览器等基于字节的ASCII值计算像素的颜色,然后从调色板中读出相应的值。更为详细的信息请参阅下面关于位图文件的部分。n位2n种颜色的位图近似字节数可以用下面的公式计算:BMP文件大小约等于 54+4*2的n次方+(w*h*n)/8,其中高度和宽度都是像素数。需要注意的是上面公式中的54是位图文件的文件头,是彩色调色板的大小。另外需要注意的是这是一个近似值,对于n位的位图图像来说,3 [1] 尽管可能有最多2n中颜色,一个特定的图像可能并不会使用这些所有的颜色。由于彩色调色板仅仅定义了图像所用的颜色,所以实际的彩色调色板将小于。如果想知道这些值是如何得到的,请参考下面文件格式的部分。由于存储算法本身决定的因素,根据几个图像参数的不同计算出的大小与实际的文件大小将会有一些细小的差别。源代码:
`timescale 1ns/100ps module transport;parameter longsize=65554;reg [24:1] meme[longsize:1],b;
integer e,m,n,i,j,w,clk;
always@(*)begin initial fork begin w=$fopen(“lena.bmp”,“rb”);
e=$fread(meme,w);
$fclose(w);end always #50 clk=~clk;
join always begin
m=$fopen(“lena.txt”);
n=0;
always@(posedge clk)
begin repeat(18)begin
n=n+1;b=meme[n];
$fwrite(m,“%h”,b);
end end
always@(posedge clk)
begin
for(j=0;j<=255;j=j+1)for(i=1;i<=256;i=i+1)
begin n=18+256*i-j;b=meme[n];
$fwrite(m,“%h”,b);end end
$fclose(m);
end
end endmodule
仿真后Objects中的数值:
仿真后波型:
转换后在lena.txt中的数值:
使用到的软件:
在winhex中的数值:
原图
经verilog转换后的图:
设计说明书: 首先用$fread系统任务将BMP图片的二进制代码读入存储器meme中;由initial子语句产生clk时钟信号;由于读出的二进制代码的前54个字节是BMP位图的基本代码,因此在对图片进行翻转时前54个字节的位置不变。由于文件格式为256*256*24bit文件,所以后面为256*256个像素,每24位代表一个像素,因为BMP文件的数据是从左到右,从下到上的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个象素,然后是左边第二个象素??接下来是倒数第二行左边第一个象素,左边第二个象素??依次类推,最后得到的是最上面一行的最右一个象素。所以要实现图片的顺时针旋转应该把meme中像素逆时针旋转90
度。
其次,在always子语句中用repeat语句在每一个clk上升沿把meme中的前十八个单元经缓存器b依次读入lena.txt中。然后用for语句在每一个clk信号上升沿来临时把翻转后256*256
个像素经缓存器b依次读入lena.txt中。
最后用WinHex软件把得到的lena.txt文件转换成二进制数据另存为.Bmp文件即可得到翻转
后的图片。李贝大作业工作总结
这次的大作业对我们每一个人都是一个挑战,以前,我们学得知识很死,总不会学以致用,每天都感觉无所事事。通过这次大作业的完成,锻炼了自己的解决问题能力。
刚接触这个大作业的时候,给人一种很高端的感觉,但也意味着一切都待从头开始,首先就是对BMP文件的理解,经过大量的查阅资料,知道了BMP文件的构成,了解了对于256*256*24bit文件,其大小应该为256*256*3+54=196662字节;自此豁然开朗;对于bmp文件和2进制之间转化的问题,经过许多曲折,终于得到了winhex,经过亲手应用,逐渐掌握了这个软件,完成了2进制与bmp文件之间的转化;在编写程序时,同样遇到了很大的阻力,感觉课堂上学的东西完全不够用,通过自己以及团队对verilog语言的进一步学习,知道了其系统函数$fread可以从bmp文件中读取二进制数字,在对时钟信号处理时,对周期的大小也进行了考虑,通过这次大作业,使我更加熟悉了硬件描述语言,对modelsim这款软件的操作也更加熟练啦,懂得了团队合作的重要性!总之,收获很大!
冷健大作业工作总结
终于完成了这次verilog大作业。在完成大作业的过程中,我们小组遇见了不少的难题。遇到很多不会的东西,但是通过我与小组队员的通力合作,通过请教专业的同学,通过上网 7 搜索资料。我们还是完成了。虽然有点不尽如人意。通过这次的大作业,让我们更加深刻的了解了合作的意义。组员之间相互合作,那就无论什么困难都可以解决。这就是团队力量的重要性。还有一点感想就是打铁还需自身硬。自己没有点真功夫是不行的。所以平时一定要多积累,多看书,平时多看书,那么实际生活中就多一条解决途径。就可以少走些弯路,少吃些苦。?还有一点,我们需要仔细和耐性,由于在编写程序的过程中,有一些疏忽和遗漏,总是个别字符出错或者符号出错。回头又得花时间去检查去纠正。所以就必须特别强调细心
和耐心。以上就是我的心得。解海洋大作业工作总结
在这次的大作业,使我懂得了,知识与实践动手能力的不同,虽然经过一段时间的verilog的学习,对语法知识有一定的了解,但真正要自己动手还是有所能力的欠缺。而且还不知道从何入手,还是参考了前辈一些经验,知道了怎么做,按什么顺序做。首先了解BMP位图的格式,还要想到怎么把图读进去等等很多的问题。不过在这次的锻炼中,我对verilog语言有了更深的理解,同时也学到小组合作的精神。
王玉斌大作业工作总结
这次verilog大作业是四个人一起完成的作品,在这次大作业中学到了很多,虽然有些地方和老师的要求,但是在考试的紧张复习中还是完成了大作业。让我学到了很多关于verilog图像相位的知识,对于以后的学习有很大帮助。
在完成作业过程中遇到了很多困难:
首先,我们不知道BMP图片能直接转换为二进制代码,后来跟同学交流了解了可以直接转换为二进制代码,BMP图片输入的时候出现了输入不进去的问题。还有在处理256*256的图片时,我们误认为把一张图片压缩成256*256就可以,后来才发现是剪切,二不是压缩,这样导致后来读出的文件中含有不确定值X。
其次是起初我们仿真不出波形,开始不知道从何下手,通过我们共同努力,从网上,课本,资料查找,发现我们的仿真时间选择过小。导致波形无法显示,最后增大了仿真时间,得到
了波形。
最后,个人觉得有些地方用matlab可以更简便,比如把程序直接导入matlab函数中,方便以后调用。总之,大作业的成功是我们四个人共同努力的成果,让我们学到了很多课堂上没学到的东西,同时也遇到了很多困难,也有很多分歧,但是最终在一起的努力下我们完成大
作业。
第四篇:vissim仿真小结
1,输出仿真过程的每辆车在行程及全程的数据:仿真——配置——输出。2,静态路径决策不要被连接器覆盖,视情况尽量设置在交叉口上游远些。
3,每辆车行程时间可与vissim左边栏所有车辆平均行程时间模块所输出数据作对比。4,设置“优先规则”的地方,车道上的车辆会自动变道。(待解决)5,“车压车”的交叉路段目前想到可行的是设置“冲突区域”。
第五篇:化工仿真实习小结
一、实习内容
本学期的化工仿真实习主要完成了以下六个单元操作的练习。
1、离心泵单元:将来自系统外的物料经过阀门送入带压液体储罐,罐内压力由控制器分程控制调节,液位可由液位控制器调节进料量而维持在50%,物料再由泵送至系统外,出口流量可由控制器控制。
2、换热器单元:将来自系统外的冷物料经阀进入本单元,由泵,再经调节器FIC101控制流量送入换热器壳程并加热,经阀出系统。热物料由阀进入本单元,经泵,由温度调节器分程控制主副线调节阀使冷物料出口温度稳定,过主线调节阀的热物料经换热器管程后与副线来的热物料混合后由阀出本单元。
3、液位控制系统单元:本流程有三个储液容器,除原料缓冲罐V101是带压容器,且只有一股来料外,中间储槽V102和产品储槽V103均有两股来料,且为常压储槽。来自系统外一定压力的原料液,控制流量后进入V101,压力由控制器分程控制冲压阀和泄压阀,液位由液位调节器和流量调节器串级控制。V101中液体由泵抽出,经阀送入V102。V102的另一股来料由系统外经阀门控制,V102中的液体靠液位差从其底部流入V103,V103的另一股来料来自系统外,流量由调节器构成比值控制回路。
4、管式加热炉单元:本流程将某可燃性物料经炉膛通过燃料气和燃料油混合燃烧加热至要求温度后送去其他设备。工艺物料首先进入加热炉加热,流量压力可控,采暖水在控制器控制下与加热的烟气换热,回收余热后回采暖水系统。燃料气经压力调节器进入燃料气分液管,分离液体后其中一路经长明线点火燃烧,另一路在点火成功后,控制流量进入加热炉燃烧。当炉膛温度达200℃后,控制雾化蒸汽流量,将燃料油雾化后送入炉膛火嘴燃烧。为保证加热炉内燃油燃气的正常燃烧,应注意调节烟道挡板和风门的适当开度,维持正常炉膛负压和烟道内氧气含量。
5、精馏塔单元:本单元是一种加压精馏操作,原料液为脱丙烷塔塔釜的混合液,分离后馏出液为高纯度C4产品,残液主要是C5以上组分。首先原料液经流量调节器进料,塔顶蒸汽经全凝器冷凝后进入回流罐,回流罐中液体由泵抽出,一部分作为回流液控制流量回塔,另一部分作为产品。回流罐液位由串级回路控制。塔釜液体一部分经再沸器回塔,另一部分作为产品采出,液位由串级回路控制。再沸器用低压蒸汽加热。
6、吸收解吸单元:本单元选用C6油分离提纯混合富气中的C4组分,流程分吸收解吸两部分。
吸收系统:原料气由吸收塔底部进入,与自上而下的贫油逆向接触,富油从塔釜排出,经换热器预热后进入解吸塔。串级控制回路调节塔釜富油采出量来实现对吸收塔塔釜液位的控制。未被吸收的气体由塔顶排出,经冷凝器冷却后进入尾气分离罐回收冷凝液,被冷凝下来的组分与塔釜富油一起进入解吸塔,不凝气被控制排入放空总管。贫油经泵打入吸收塔,在吸收解吸系统中循环。解吸系统:富油预热后进入解吸塔,解吸分离出的气体出塔顶,冷凝后进入回流罐,由泵抽出,一部分回流至解吸塔顶部,另一部分作为产品采出。解吸塔釜的C6油在控制器控制下,经换热器,冷却器返回储罐循环使用。
由于塔顶C4产品中会含有部分C6油,及其他原因会造成C6油损失,所以随生产进行,要定期向罐内补充新鲜C6油。
二、课后习题
离心泵单元
1、简述离心泵的工作原理和结构
答:离心泵的工作原理是依靠高速旋转的叶轮使叶片间的液体在惯性离心力的作用下自叶轮中心被甩向外周并获得能量,直接表现为静压能的提高。当液体自叶轮中心甩向外周的同时,叶轮中心形成低压区,在储槽液面与叶轮中心总势能差的作用下,致使液体被吸进叶轮中心。依靠叶轮的不断运转,液体便连续的吸入和排出。
离心泵的主要部件包括供能和转能两部分。主要有叶轮(关键部件)、泵壳、导轮、轴封装置等。
2、什么叫汽蚀现象?汽蚀现象有什么破坏作用?
答:当叶轮入口附近压力等于或小于输送温度下液体的饱和蒸汽压时,液体将在此处汽化或者溶解在液体中的气体析出并形成气泡。含气体的液体进入叶轮高压区后,气泡在高压作用下急剧缩小而破灭,气泡的消失产生局部真空,周围的液体以极高的速度冲向原气泡所占据的空间,造成冲击和振动。在巨大冲击力反复作用下,使叶片表面材质疲劳,从开始点蚀到形成裂缝,导致叶轮或泵壳破坏的现象为汽蚀。
汽蚀现象会使泵体产生震动与噪音,泵的性能下降,泵壳及叶轮受到冲蚀。
3、在什么情况下会发生汽蚀现象?如何防止汽蚀现象发生?
答:当离心泵的压头较正常值降低3%以上时,(即安装高度过高或叶轮转速过快时)预示着汽蚀现象可能发生。
防止:改变叶轮的进口几何形状,采用双吸式叶轮;采用较低的叶轮入口速度,加大叶轮入口直径;适当增大叶片入口边宽度,也可以使叶轮入口相对速度减少;采用抗汽蚀材料制造叶轮;提高装置有限汽蚀余量,如增大吸入罐液面上的压力,合理确定几何安装高度;减少吸入管路阻力损失,降低液面的汽化压力。
4、为什么启动前一定要将离心泵灌满被输送液体?
答:如果没有在启动前灌满被输送液体,由于空气密度小,叶轮旋转后产生的离心力小,叶轮中心不足以形成吸入储槽内液体的低压,因而虽启动离心泵也不能输送液体,发生气缚现象。
换热器单元
1、冷态开车是先送冷物料,后送热物料;而停车时又要先关热物料,后关冷物料,为什么?
答:开车的顺序可以使机器不会因为物料过热而加速腐蚀;停车时的顺序是为了防止倒吸发生。
2、为什么停车后管程和壳程都要泄液?这两部分的泄液有顺序吗? 答:不泄液的话留在机器里面会腐蚀仪器的。先泄掉管程再泄掉壳程。如果先泄掉壳程的话,在泄掉管程时又会有液体流到壳程里。
3、传热有哪几种基本方式?各自的特点是什么?
答:①热传导:热从物体的高温部分沿着物体传到低温部分;②热辐射:靠液体或气体的流动实现传递的方式;③热对流:高温物体直接向外发射热
4、影响间壁式换热器传热量的因素有哪些? 答:壁厚、材料、介质、粘度、管径等。液位控制系统单元
1、本仿真培训单元包括串级、比值、分程三种复杂控制系统,说出它们的特点,它们与简单控制系统的差别是什么?
答:串级控制系统 ——如果系统中不止采用一个控制器,而且控制器间相互串联,一个控制器的输出作为另一个控制器的给定值,这样的系统称为串级控制系统。串级控制系统的特点: ①能迅速地克服进入副回路的扰动;②改善主控制器的被控对象特征;③有利于克服副回路内执行机构等的非线性。比值控制系统—— 在工业生产过程中,实现两个或两个以上参数符合一定比例关系的控制系统,称为比值控制系统。比值控制系统可分为:开环比值控制系统,单闭环比值控制系统,双闭环比值控制系统,变比值控制系统,串级和比值控制组合的系统等。
分程控制回路 ——一台控制器的输出可以同时控制两只甚至两只以上的控制阀,控制器的输出信号被分割成若干个信号的范围段,而由每一段信号去控制一只控制阀。
简单控制系统——单回路控制回路又称单回路反馈控制。由于在所有反馈控制中,单回路反馈控制是最基本、结构做简单的一种,因此,它又被称之为简单控制。单回路反馈控制由四个基本环节组成,即被控对象(简称对象)或被控过程(简称过程)、测量变送装置、控制器和控制阀。
管式加热炉单元
1、烟道气出口氧气含量为什么要保持在一定范围?过高或过低意味什么? 答:通过控制烟道气出口氧气含量范围,来保持燃料与空气量的正确比例,从而达到最小的热损失和最大的热效率。
如果氧含量太高,就会相应加热多余的空气,大量的热量随烟气被排出,使能耗增加,燃烧效率降低;反之氧含量太低,则燃料不完全燃烧,热量损失上升。
2、加热过程中风门和烟道挡板的开度大小对炉膛负压和烟道气出口氧气含量有什么影响?
答:风门开度大大量空气入炉使炉膛负压减小,热效率低,烟道气出口氧气含量增加;烟道挡板开度大使炉膛负压增大,造成空气大量漏入炉内,热效率低,烟道气出口氧气含量增加。因而,在实际操作中,加热炉的风门和烟道挡板要密切配合调节,保证一定的抽力,控制一定过剩空气系数,提高热效率,延长加热炉管的使用寿命。
3、本流程中三个电磁阀的作用是什么?在开/停车时应如何操作? 答:三个电磁阀为三个联锁阀S01、S02、S03,为保证安全正常运行。
在开/停车时应先摘除连锁,才能进行操作。
精馏塔单元
1、什么叫蒸馏?蒸馏和精馏有何不同?它们在化工生产中的作用是什么? 答:蒸馏是分离液体混合物最常用,最早实现工业化的典型单元操作。它是通过加热液体混合物造成气液两相体系,利用混合物中各组分挥发度的差异而实现组分的分离与提纯的操作过程。
精馏是利用混合液中组分挥发度的差异,实现组分高纯度分离的多级蒸馏操作,同时进行多次部分汽化和部分冷凝的过程。
蒸馏和精馏的根本区别是精馏具有回流。蒸馏按其操作方式可分为简单蒸馏、平衡蒸馏、精馏和特殊精馏等。简单蒸馏和平衡蒸馏适用于易分离物系或分离要求不高的场合;精馏适用于难分离物系或对分离要求较高的场合;特殊精馏适用于普通精馏难以分离或无法分离的物系。
2、精馏的主要设备有哪些? 答:精馏主要利用板式塔,填料塔。
其中主要设备有精馏塔、塔顶冷凝器、塔底再沸器、原料预热器、回流罐、回流泵等。
3、列出塔顶温度和压力、塔釜液位和温度的影响因素。
答:塔顶温度压力——进料量,进料热状况参数,回流比,塔顶产品采出量 塔釜液位和温度——塔釜产品采出量,加热蒸汽量
4、控制塔顶压力有几种方法?哪种最好?
答:可以通过调节PC101和PC102;可以用调节塔釜加热蒸汽量的方法;调节原料液流量的方法。第一种好。
吸收解吸单元
1、试从操作原理和本单元操作特点分析一下吸收段流程压力比解吸段压力高的原因。答:压力大的时候,溶解度大,有利于吸收。压力小,溶解度小,利于解吸。
2、从全流程能量合理利用角度分析换热器E-103和E-102的顺序和原因。答:应该先从E-102到E-103,应为E-102里面的流体温度较低些,这样走完E-102可以直接去E-103,省的在用新的原来还需额外的加热。
3、若发现富油无法进入解吸塔,会有哪些原因?应如何调整。
答:①可能是应开的阀门没全开,这种情况仔细检查通道阀门,打开需要打开的阀门;②吸收塔压力太低,此时通过调节PIC103,FV103以及V1阀门增大吸收塔的压力;③管道堵塞。此时需及时清除堵塞物即可。
三、心得体会
通过本学期对化工仿真实习这门专业课的学习,深切体会到课本原理内容的学习与实际操作之间的区别与联系。
首先,原理的学习与实际操作到底是不同的。之前在学习化工原理课程时,重要的在于对每个单元操作原理的理解,以及对所涉及到的计算公式,公式中每个量的理解,对设计型和操作型问题的相关计算等;但是在仿真实习中,却更加侧重操作的工艺流程,诸如阀门的开关问题、开度问题、顺序问题、甚至是应急处理等这些更加接近实际操作的方面。
当然,课本原理内容的学习与仿真实习操作之间也有着密不可分的联系。对一个单元的过程控制,既要有之前学过的原理知识做铺垫,也要辅以灵活正确的实际操作。
之前在学习原理部分知识时觉得还不算很难,但我们在实验过程中常会出现手忙脚乱忘记开关阀门,忘记调节阀门开度等问题,最终造成“危险”的结果,所幸只是仿真模拟,但也反映出我们还是不能很好地将所学基础知识与实际操作相联系;遇到“意外”情况不够镇静,不能很快反应与做相应的补救措施;另外可能也是由于经验不足,很多时候调控不到位,完全是靠之后的“补救”措施解决,使得整个系统不能很快地稳定,甚至“大起大落”,这些在未来的实际操作中都将会是严重的问题。
总而言之,对这次的仿真实习还是感到受益匪浅的。