搜档网
当前位置:搜档网 › ModelSim环境基于VHDL语言的testbench书写

ModelSim环境基于VHDL语言的testbench书写

ModelSim环境基于VHDL语言的testbench书写
ModelSim环境基于VHDL语言的testbench书写

testbench顾名思义就是一个测试台,它对外没有接口,所以实体部分为空,但它要对要测试的器件提供激励信号,这其实就是最简单的testbench,以下是具体的操作步骤:

1.首先基于QuartusII建立的一个新的工程,编译通过,这其实就是我们要测试的源文件DUT(design under test)counter.vhd.

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity counter is

port(clk: in std_logic;

reset: in std_logic;

en: in std_logic;

q: out std_logic_vector(3 downto 0));

end counter;

architecture behave of counter is

signal q_n: std_logic_vector(3 downto 0);

begin

process(clk, reset, en, q_n)

begin

if (reset = '1') then

q_n <= (others => '0');--òì2???á?

elsif rising_edge(clk) then

if en = '1' then

q_n <= q_n + 1;

end if;

end if;

end process;

q <= q_n;

end behave;

2.打开ModelSim,指定路径为Quartus工程所在目录;建立新的仿真工程,添加文件(DUT)。

3.编译DUT文件到仿真库中(右键DUT,选择compile).

4.写testbench文件(counter_tb.vhd)。首先选择view-source-show language templates,然后选择file-new-source-vhdl,双击creat testbench,选择Design Unit Name为DUT文件,点击finish,模板创建完成,然后右键取消read only ,自己添加测试信号。

LIBRARY ieee ;

USE ieee.std_logic_unsigned.all ;

USE ieee.std_logic_1164.all ;

ENTITY counter_tb IS

constant ClockPeriod: time := 40 ns;

END ;

ARCHITECTURE counter_tb_arch OF counter_tb IS

component counter is

port(clk: in std_logic;

reset: in std_logic;

en: in std_logic;

q: out std_logic_vector(3 downto 0));

end component counter;

signal clock, rst, en: std_logic;

signal q: std_logic_vector(3 downto 0);

begin

CounterInstance: counter port map(clock, rst, en, q);

simProcess: process

begin

rst <= '1';

wait for 50 ns;

rst <= '0' ;

wait for 1000 ns;

rst <= '0' ;

end process simprocess;

en <= '0' after 0 ns,

'1' after 50 ns,

'0' after 850 ns,

'1' after 900 ns;

ClockProcess: process(clock, rst)

begin

if (rst = '1') then

clock <= '0';

else

clock <= not clock after ClockPeriod;

end if;

end process ClockProcess;

END ;

5.同样把testbench文件编译到仿真库中。

6.点击simulate-start simulation,选中design标签work库下testbench文件,点击ok。

7.workspace窗口出现sim标签,右键testbench文件,选择add to wave ,然后点击开始仿真按钮即可。

实验一 用VHDL语言设计组合逻辑电路

实验一用VHDL语言设计组合逻辑电路 一、实验目的:掌握用VHDL语言设计组合逻辑电路的方法。熟悉QuartusⅡ的 操作。 二、实验仪器:PC机一台 三、实验内容: 1.用VHDL语言设计4选1数据选择器。 2.用文本输入法输入 3.建立工程,编译,改错,直至编译通过 4.仿真,验证所设计电路的正确性 四、操作步骤: 1、在所使用的计算机数据盘里建立自己的文件夹 2、打开QuartusII 3、单击工具栏中的new,在出现的对话框中选择VHDL File,点击OK。 4、输入设计程序。 输入结束后,将程序保存在自己的文件夹中。注意:存盘的文件名应该跟实体名相同。 5、创建工程。创建工程有两种方法:第一种方法是在保存文件后出现的对话框 中点击‘是’,按提 示进行操作;

第二种方法是在出现的对话框点击‘否’。 第一种方法的具体过程: 点击‘是’,出项下面的框 点击‘Next’,出项 不需要任何修改,继续点击‘Next’,出项

继续点击‘Next’,在后面出现的框图中继续点击‘Next’,直到没有‘Next’选项,点击‘Finish’,这样就完成工程的创建。 第二种方法的具体过程:点击‘否’ 此时要创建工程,点击菜单File下的“New Preject Wizard”。出现框图: 点击‘Next’,出项

名,点击打开(或双击要创建工程的文件名),出现 项目名称和文件名称相同。点击‘Next’,出现

点击,在出现的对话框点击文件名,点击‘打开’,出现 点击右边的‘add’,出现

点击‘Next’,在后面出现的框图中继续点击‘Next’,直到没有‘Next’选项,点击‘Finish’,这样就完成工程的创建。 6、观察QUARTUS 界面 点击箭头所指图标,观察箭头上方的变化,点击+号,双击出项的文件

门电路VHDL语言

“非”门 library ieee; use ieee.std_logic_1164.all; entity not1 is port(a:in std_logic; b:out std_logic); end entity not1; architecture behav of not1 is begin b<=not a; end architecture behav; “与”门 library ieee; use ieee.std_logic_1164.all; entity and2 is port(a,b:in std_logic; c:out std_logic); end entity and2; architecture behav of and2 is begin c<=a and b; end architecture behav; “与非”门 library ieee; use ieee.std_logic_1164.all; entity nand2 is port(a,b:in std_logic; c:out std_logic); end entity nand2; architecture behav of nand2 is begin c<=not(a and b); end architecture behav; “或非”门 library ieee; use ieee.std_logic_1164.all; entity nor2 is port(a,b:in std_logic; c:out std_logic); end entity nor2; architecture one of nor2 is begin c<=not(a or b); end architecture one; “异或非”门 library ieee; use ieee.std_logic_1164.all; entity xor2 is port(a,b:in std_logic; c:out std_logic); end entity xor2; architecture one of xor2 is Begin c<=not( ( (not a)and b)or(a and(not b) ) ); end architecture one; D触发器 library ieee; use ieee.std_logic_1164.all; entity dffa is port(D,clk,clr:in std_logic; Q:out std_logic); end entity dffa; architecture behave of dffa is begin process(clk,D,clr) begin if clr='1' then Q<='0'; Elsif clk'event and clk='1' then Q<=D; end if; end process; end architecture behave; T触发器 library ieee; use ieee.std_logic_1164.all; entity tffa is port(T,clk,clr: in std_logic; Q: buffer std_logic); end entity tffa; architecture behave of tffa is begin process(clk,T,clr) begin if clk'event and clk='1'then if clr='1' then Q<='0'; Elsif t='1'then Q<=not Q; else Q<=Q; End if; end if; end process; end architecture behave; JK触发器 library ieee; use ieee.std_logic_1164.all; entity jk is port(J,K,clk, in std_logic; Q: buffer std_logic); end entity tffa; architecture behave of jk is begin process(clk,J,K) begin if clk'event and clk='1'then Q<=( (J and(not Q) )or( (not K)and Q) ); end if; end process; end architecture behave;

vhdl语言编写的门电路

ENTITY AND2A IS PORT (A,B:IN BIT; C:OUT BIT); END ENTITY AND2A; ARCHITECTURE EX1 OF AND2A IS BEGIN C<=A AND B; END ARCHITECTURE EX1; 用VHDL设计一个具有高电平使能端的三态非门LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY trigate IS PORT( A, EN: IN STD_LOGIC; Y: OUT STD_LOGIC ); END trigate; ARCHITECTURE a OF trigate IS BEGIN PROCESS( A, EN) BEGIN IF EN ='0' THEN Y<= 'Z'; ELSE Y<= A; END IF; END PROCESS; END a;

entity nand3a is port (A,B,C:in bit; Y:out bit); end entity nand3a; architecture text2 of nand3a is begin Y<=not (A and B and C ); end architecture text2; 用VHDL设计电路 entity b3 is Port (A, B,Ci: in bit; S,Co:out bit); end entity b3; architecture text2 of b3 is begin S<= A xor B xor Ci ; Co<=( A and B) or (Ci and (A xor B )); end architecture text2;

EDA中VHDL基本逻辑电路设计

第三章基本逻辑电路设计 3.1 组合逻辑电路设计 一、简单门电路设计 例:3输入“与非”门电路 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY nand3 IS PORT(a,b,c:IN STD_LOGIC; y:OUT STD_LOGIC); END nand3; ARCHITECTURE nand3_1 OF nand3 IS BEGIN y<=NOT(a AND b AND c); END nand3_1; LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY nand3 IS PORT(a,b,c:IN STD_LOGIC; y:OUT STD_LOGIC); END nand3; ARCHITECTURE nand3_2 OF nand3 IS BEGIN t4:PROCESS(a,b,c) VARIABLE comb:STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN comb:= a & b & c; CASE comb IS WHEN “000” =>y<=‘1’; WHEN “001” =>y<=‘1’; WHEN “010” =>y<=‘1’; WHEN “011” =>y<=‘1’; WHEN “100” =>y<=‘1’; WHEN “101” =>y<=‘1’; WHEN “110” =>y<=‘1’; WHEN “111” =>y<=‘0’; WHEN OTHERS=>y<=‘X’; END CASE; END PROCESS; END nand3_2; 二、编码器、译码器、选择器 例:地址译码器 假设一个微处理器存储空间为从0000H到FFFFH, 将其分成5部分,它们的地址分配如下: 0000H—DFFFH为动态随机存储器DRAM使用;E000H—E7FFH为I/O设备使用; E800H---EFFFH备用; F000H—F7FFH为第一个只读存储器ROM1使用;F800H—FFFFH为第二个只读存储器ROM2使用;其中选通控制信号DRAM1,IO,ROM1,ROM2均为低电平有效。 例:地址全译码 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY ad_decoder IS PORT( address : IN STD_LOGIC_VECTOR(15 downto 0); DRAM1,IO,ROM1,ROM2 : OUT STD_LOGIC); END ad_decoder ; ARCHITECTURE a OF ad_decoder IS BEGIN PROCESS(address) BEGIN IF address<=x”dfff” THEN DRAM<=‘0’; IO<=‘1’; ROM1<=‘1’; ROM2<=‘1’; ELSIF address>=x”e000” AND address<=x”e7ff” THEN DRAM<=‘1’; IO<=‘0’; ROM1<=‘1’; ROM2<=‘1’; ELSIF address>=x”f000” AND address<=x”f7ff” THEN DRAM<=‘1’; IO<=‘1’; ROM1<=‘0’; ROM2<=‘1’; ELSIF address>=x”f800” THEN DRAM<=‘1’; I/O<=‘1’; ROM1<=‘1’; ROM2<=‘0’; END IF; End PROCESS; END a;

七人表决器-VHDL语言编写代码

------------------------------------- -- Title: 七人表决器-- -- Author:Pan hongtao -- -- Data: 2006-10-1 -- ---------------------------------------- library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; -------------------------------------------------------------------- entity exp12 is port( k1,K2,K3,K4,K5,K6,K7 : in std_logic; --输入:7个人 ledag : out std_logic_vector(6 downto 0); --数码管显示 m_Result : out std_logic --表决结果 ); end exp12; -------------------------------------------------------------------- architecture behave of exp12 is signal K_Num : std_logic_vector(2 downto 0); signal K1_Num,K2_Num: std_logic_vector(2 downto 0); signal K3_Num,K4_Num: std_logic_vector(2 downto 0); signal K5_Num,K6_Num: std_logic_vector(2 downto 0); signal K7_Num : std_logic_vector(2 downto 0); begin process(K1,K2,K3,K4,K5,K6,K7) --计算表决同意人数 begin K1_Num<='0'&'0'&K1; K2_Num<='0'&'0'&K2; K3_Num<='0'&'0'&K3; K4_Num<='0'&'0'&K4; K5_Num<='0'&'0'&K5; K6_Num<='0'&'0'&K6; K7_Num<='0'&'0'&K7; end process; process(K1_Num,K2_Num,K3_Num,K4_Num,K5_Num,K6_Num,K7_Num) begin K_Num<=K1_Num+K2_Num+K3_Num+K4_Num+K5_Num+K6_Num+K7_Num; end process; process(K_Num) --根据人数输出结果 begin

VHDL语言编写规范

VHDL语言编写规范 目录 目录 (1) 1 目的 (2) 2 范围 (2) 3 定义 (2) 4 规范内容:VHDL编码风格 (2) 4.1 标识符(Identifiers)命名习惯 (2) 4.2 数据对象和类型 (4) 4.3 信号和变量 (5) 4.4 实体 (5) 4.5 语句 (7) 4.6 运算符(Operator) (10) 4.7 function (10) 4.8 procedure (11) 4.9 类属( generics) (11) 4.10 package (12) 4.11 FSM(有限状态机) (12) 4.12 Comments (12) 4.13 TAB键间隔 (12) 4.14 语句书写规范规定 (13) 5 程序中的注释 (13) 6 代码模块划分 (14) 7 代码编写中容易出现的问题 (15) 7.1 资源共享问题 (15) 7.2 组合逻辑描述的多种方式 (15) 7.3 考虑综合的执行时间 (16) 7.4 避免使用Latch (16) 7.5 多赋值语句案例:三态总线 (16) 附录一VHDL保留字 (18) 附录二函数书写实例 (19) 附录三参数化元件实例 (20) 附录四程序包书写实例 (21)

1 目的 编写该规范的目的是提高书写VHDL代码的可读性、可修改性、可重用性;优化代码综合和仿真结果,指导设计工程师使用VHDL 规范代码和优化电路,规范化公司的ASIC/FPGA 设计输入,从而做到: a、逻辑功能正确; b、可快速仿真; c、综合结果最优; d、可读性最好。 2 范围 该规范设计VHDL编码风格、规定,编码中应注意的问题,VHDL代码书写范例等,适用于所有的采用VHDL代码进行设计的项目。 3 定义 VHDL:Very high speed IC Hardware Description Language,甚高速集成电路的硬件描述语言。 FSM:Finite Status Machine,有限状态机 Simulate:仿真,通过输入激励在计算机上验证设计是否正确。包括RTL仿真和门级仿真。 模拟:是指对一个物理器件的结构、功能或其他特性如延时特性等用抽象的语言或高级语言(如用C语言进行算法描述)所进行的建模。 4 规范内容:VHDL编码风格 设计必须文档化。要将设计思路,详细实现等写入文档,然后经过严格评审通过后才能进行下一步的工作。这样做乍看起来很花时间,但是从整个项目过程来看,绝对要比一上来就写代码要节约时间,且这种做法可以使项目处于可控、可实现的状态,便于对程序代码的修改、学习。 本文中提到的VHDL编码规则和建议适用于VHDL的任何一级(RTL,behavioral,gate_level),也适用于出于仿真,综合或二者结合的目的而设计的模块。 4.1 标识符(Identifiers)命名习惯 标识符用于定义实体名、结构体名、信号和变量名等,选择有意义的命名对设计是十分重要的。命名包含信号或变量诸如出处、有效状态等基本含义,下面给出一些命名的规则,包括VHDL语言的保留字。 1. 标识符定义命名规定

数字电路设计实验vhdl语言实验报告

实验一秒表计数器的设计 一、实验目的: 本实验通过设计四种频率可选的数字时钟系统,以达到熟悉VHDL 语言编程语法、设计思路和熟练掌握Quartus II 开发软件的目的。 二、实验内容: 该数字时钟的显示格式如下所示:HH:MM:SS,其中HH表示时计数的两位,MM表示分计数的两位,SS表示秒计数的两位。本系统输入信号分别为复位信号rst(高有效)、sel(两位信号,分别可以选择2分频、4分频8分频和16分频)、clk_in(时钟信号)、8位时输出、8位分输出、8位秒输出(其中高4为表示对应的高半字节、低4位表示的低半字节,譬如当时间为08:59:30时,时输出为”0000_1000”,分输出为”0101_1001”,秒输出为”0011_0000”)。该时钟系统可以通过Sel信号时钟运行的快慢。 三、实验流程: 通过对实验内容的分析:可以考虑时钟系统的可由三部分组成:1、分频器: 分频器为时序电路并且通过《数字电路》理论课程的学习可知由计数器来实现,同学可以回想一下实验1中是如何实现计数器电路的设计),该模块主要产生2、4、8、16分频的时钟信号; 2、多路选择器: 在VHDL中多路选择器为组合逻辑,可以有多种实现方法,在这里主要选用了case语句来实现。该模块的作用是从分频器中根据Sel

信号选择适当的时钟信号; 3、时钟控制器: 该模块比较复杂,主要实现功能是实现一个24小时的计时。当时间为00:00:59的时候下一个时钟到来时状态的跳变为00:01:00,计时中多数计数为加1操作,有几个特殊状态需要重点考虑:当时间产生分进数时,譬如上例。当时间产生时进数时,譬如00:01:59时刻的下一个状态为00:02:00;当时间产生时进数时,譬如00:59:59是个的下一个状态为01:00:00。当时间产生天进数时,譬如23:59:59的下一个状态为00:00:00。 四、仿真要求: 本次试验的结果全部采用功能仿真分析: 1、在结果图中能够看到让复位信号rst为有效的情况下,所有的输出为00:00:00; 2、当频率选择输出分别为”00”、”01”、”10”、”11”时秒为的进数分别包含2、4、8、16倍clk_in的时钟周期; 3、可以看到完整的计时周期00:00:00->23:59:59->00:00:00。 五、实验代码: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;

相关主题