文档库 最新最全的文档下载
当前位置:文档库 › VHDL的仿真文件testbench的编写

VHDL的仿真文件testbench的编写

VHDL的仿真文件testbench的编写
VHDL的仿真文件testbench的编写

EDA技术与VHDL程序设计基础教程习题答案

EDA技术与VHDL程序设计基础教程习题答案 第1章EDA习题答案 1.8.1填空 1.EDA的英文全称是Electronic Design Automation 2.EDA技术经历了计算机辅助设计CAD阶段、计算机辅助工程设计CAE阶段、现代电子系统设计自动化EDA阶段三个发展阶段 3. EDA技术的应用可概括为PCB设计、ASIC设计、CPLD/FPGA设计三个方向 4.目前比较流行的主流厂家的EDA软件有Quartus II、ISE、ModelSim、ispLEVER 5.常用的设计输入方式有原理图输入、文本输入、状态机输入 6.常用的硬件描述语言有VHDL、V erilog 7.逻辑综合后生成的网表文件为EDIF 8.布局布线主要完成将综合器生成的网表文件转换成所需的下载文件 9.时序仿真较功能仿真多考虑了器件的物理模型参数 10.常用的第三方EDA工具软件有Synplify/Synplify Pro、Leonardo Spectrum 1.8.2选择 1.EDA技术发展历程的正确描述为(A) A CAD->CAE->EDA B EDA->CAD->CAE C EDA->CAE->CAD D CAE->CAD->EDA 2.Altera的第四代EDA集成开发环境为(C) A Modelsim B MUX+Plus II C Quartus II D ISE 3.下列EDA工具中,支持状态图输入方式的是(B) A Quartus II B ISE C ispDesignEXPERT

D Syplify Pro 4.下列几种仿真中考虑了物理模型参数的仿真是(A) A时序仿真 B 功能仿真 C 行为仿真 D 逻辑仿真 5.下列描述EDA工程设计流程正确的是(C) A输入->综合->布线->下载->仿真 B布线->仿真->下载->输入->综合 C输入->综合->布线->仿真->下载 D输入->仿真->综合->布线->下载 6.下列编程语言中不属于硬件描述语言的是(D) A VHDL B V erilog C ABEL D PHP 1.8.3问答 1.结合本章学习的知识,简述什么是EDA技术?谈谈自己对EDA技术的认识? 答:EDA(Electronic Design Automation)工程是现代电子信息工程领域中一门发展迅速的新技术。 2.简要介绍EDA技术的发展历程? 答:现代EDA技术是20世纪90年代初从计算机辅助设计、辅助制造和辅助测试等工程概念发展而来的。它的成熟主要经历了计算机辅助设计(CAD,Computer Aided Design)、计算机辅助工程设计(CAED,Computer Aided Engineering Design)和电子设计自动化(EDA,Electronic System Design Automation)三个阶段。 3.什么是SOC?什么是SOPC? 答:SOC (System on Chip,片上系统) SOPC(System on a Programmable Chip,片上可编程系统) 4.对目标器件为CPLD/FPGA的VHDL设计,主要有几个步骤?每步的作用和结果分别是什

用FPGA实现的七段数码管vhdl代码

Output(7 downto 0)

具体设计: Vhd代码: library IEEE; use Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use sevenled_vhd is Port ( input : in STD_LOGIC_VECTOR (3 downto 0); led : out STD_LOGIC_VECTOR (7 downto 0)); end sevenled_vhd; architecture Behavioral of sevenled_vhd is begin led<= "" when input="0000" else -- 0 "" when input="0001" else -- 1 "" when input="0010" else -- 2 "" when input="0011" else -- 3 "" when input="0100" else -- 4 "" when input="0101" else -- 5 "" when input="0110" else -- 6 "" when input="0111" else -- 7 "" when input="1000" else -- 8 "" when input="1001" else -- 9 "" when input="1010" else -- A "" when input="1011" else -- b "" when input="1100" else -- c "" when input="1101" else -- d "" when input="1110" else -- E ""; -- F end Behavioral; 管脚约束: Net "led<7>" LOC=N19; Net "led<6>" LOC=N15; Net "led<5>" LOC=R20; Net "led<4>" LOC=R18; Net "led<3>" LOC=U20; Net "led<2>" LOC=T18;

VHDL语言设计4选1多路选择器

4选1多路选择器的VHDL描述 要求:THEN语句和CASE语句实现4选1多路选择器,其中选择控制信号s1和s0的数据类型为STD_LOGIC_VECTOR;当s1=?0?,s0=?0?;s1=?0?,s0=?1?;s1=?1?,s0=?0?和s1=?1?,s0=?1?时,分别执行y<=a、y<=b、y<=c、y<=d。 一、解法1:用IF_THEN语句实现4选1多路选择器 (1)程序: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux41 IS PORT (a,b,c,d: IN STD_LOGIC; s0: IN STD_LOGIC; s1: IN STD_LOGIC; y: OUT STD_LOGIC); END ENTITY mux41; ARCHITECTURE if_mux41 OF mux41 IS SIGNAL s0s1 : STD_LOGIC_VECTOR(1 DOWNTO 0);--定义标准逻辑位矢量数据BEGIN s0s1<=s1&s0; --s1相并s0,即s1与s0并置操作 PROCESS(s0s1,a,b,c,d) BEGIN IF s0s1 = "00" THEN y <= a; ELSIF s0s1 = "01" THEN y <= b; ELSIF s0s1 = "10" THEN y <= c; ELSE y <= d; END IF; END PROCESS; END ARCHITECTURE if_mux41; (2)编译的结果如下:

编译报告: 二、解法2:用CASE语句实现4选1多路选择器(1)程序: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux41 IS PORT (a,b,c,d: IN STD_LOGIC;

电子秤VHDL代码

-- 输入电压范围0-5V,显示0-255数位 --------------------库定义、包定义-------------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; --------------------实体定义-------------------- ENTITY balance IS port ( clk : IN STD_LOGIC; -- 全局时钟输入,12Mhz晶振产生 reset : IN STD_LOGIC; -- 复位输入 intr : IN STD_LOGIC; -- AD转换结束产生的中断输入 data_i : IN STD_LOGIC_VECTOR(7 DOWNTO 0); -- ADC转换后的数据输入 data_o : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- 数码管数据输出 l : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); -- 输出数码管位选 cs : OUT STD_LOGIC; -- ADC使能 wr : OUT STD_LOGIC; -- ADC写控制 rd : OUT STD_LOGIC -- ADC读控制 ); END balance; --------------------结构体-------------------- ARCHITECTURE bhv OF balance IS TYPE state IS (start, convert, read1, read2);-- 状态机定义 SIGNAL current_state, next_state : state; -- 状态定义 SIGNAL read_data : STD_LOGIC;-- 读数据寄存器 SIGNAL clock : STD_LOGIC;-- 扫描时钟 SIGNAL p : INTEGER RANGE 0 TO 255;-- 数据寄存器 SIGNAL b0,b1,b2 : INTEGER RANGE 0 TO 9;-- 3位数码管显示数据寄存器 SIGNAL cnt : INTEGER RANGE 0 TO 3 := 0;-- 扫描寄存器 BEGIN --------------------显示进程-------------------- PROCESS(p, clk) BEGIN CASE p IS WHEN 0|10|20|30|40|50|60|70|80|90|100|110|120|130|140|150|160|170|180|190|200|210|220|230|240|250 => b0 <= 0; WHEN 1|11|21|31|41|51|61|71|81|91|101|111|121|131|141|151|161|171|181|191|201|211|221|231|241|251 => b0 <= 1; WHEN 2|12|22|32|42|52|62|72|82|92|102|112|122|132|142|152|162|172|182|192|202|212|222|232|242|252 => b0 <= 2; WHEN 3|13|23|33|43|53|63|73|83|93|103|113|123|133|143|153|163|173|183|193|203|213|223|233|243|253 => b0 <= 3; WHEN 4|14|24|34|44|54|64|74|84|94|104|114|124|134|144|154|164|174|184|194|204|214|224|234|244|254 => b0 <= 4; WHEN 5|15|25|35|45|55|65|75|85|95|105|115|125|135|145|155|165|175|185|195|205|215|225|235|245|255 => b0 <= 5; WHEN 6|16|26|36|46|56|66|76|86|96|106|116|126|136|146|156|166|176|186|196|206|216|226|236|246 => b0 <= 6; WHEN 7|17|27|37|47|57|67|77|87|97|107|117|127|137|147|157|167|177|187|197|207|217|227|237|247 => b0 <= 7; WHEN 8|18|28|38|48|58|68|78|88|98|108|118|128|138|148|158|168|178|188|198|208|218|228|238|248 => b0 <= 8; WHEN 9|19|29|39|49|59|69|79|89|99|109|119|129|139|149|159|169|179|189|199|209|219|229|239|249 => b0 <= 9; WHEN OTHERS => NULL; END CASE; CASE p IS WHEN 0|1|2|3|4|5|6|7|8|9|100|101|102|103|104|105|106|107|108|109|200|201|202|203|204|205|206|207|208|209 => b1 <= 0; WHEN 10|11|12|13|14|15|16|17|18|19|110|111|112|113|114|115|116|117|118|119|210|211|212|213|214|215|216|217|218|219 => b1 <= 1; WHEN 20|21|22|23|24|25|26|27|28|29|120|121|122|123|124|125|126|127|128|129|220|221|222|223|224|225|226|227|228|229 => b1 <= 2; WHEN 30|31|32|33|34|35|36|37|38|39|130|131|132|133|134|135|136|137|138|139|230|231|232|233|234|235|236|237|238|239 => b1 <= 3; WHEN 40|41|42|43|44|45|46|47|48|49|140|141|142|143|144|145|146|147|148|149|240|241|242|243|244|245|246|247|248|249 => b1 <= 4; WHEN 50|51|52|53|54|55|56|57|58|59|150|151|152|153|154|155|156|157|158|159|250|251|252|253|254|255 => b1 <= 5; WHEN 60|61|62|63|64|65|66|67|68|69|160|161|162|163|164|165|166|167|168|169 => b1 <= 6; WHEN 70|71|72|73|74|75|76|77|78|79|170|171|172|173|174|175|176|177|178|179 => b1 <= 7; WHEN 80|81|82|83|84|85|86|87|88|89|180|181|182|183|184|185|186|187|188|189 => b1 <= 8; WHEN 90|91|92|93|94|95|96|97|98|99|190|191|192|193|194|195|196|197|198|199 => b1 <= 9; WHEN OTHERS => NULL; END CASE; IF (p < 100) THEN b2 <= 0; ELSIF (p >= 100 and p < 200) THEN b2 <= 1; ELSIF (p >= 200) THEN b2 <= 2; END IF; END PROCESS; --------------------分频进程-------------------- PROCESS(clk) VARIABLE cnt1 : INTEGER RANGE 0 TO 100; VARIABLE cnt2 : INTEGER RANGE 0 TO 20; BEGIN IF (clk'EVENT AND clk = '1') THEN IF (cnt1 = 100) THEN cnt1 := 0; IF (cnt2 = 20) THEN cnt2 := 0; clock <= NOT clock; IF (cnt = 3) THEN cnt <= 0; ELSE cnt <= cnt + 1; END IF; ELSE cnt2 := cnt2 + 1; END IF; ELSE cnt1 := cnt1 + 1; END IF; END IF;

EDA-常见实例源程序代码vhdl

第4章用VHDL程序实现常用逻辑电路4.1 组合逻辑电路设计 4.1.1 基本逻辑门 library ieee; use iee.std_logic_1164.all; entity jbm is port(a,b: in bit; f1,f2,f3,f4,f5,f: out bit); end jbm; architecture a of jbm is begin f1<=a and b; --构成与门 f2<=a or b; --构成或门 f<=not a; --构成非门 f3<=a nand b; --构成与非门 f4<=a nor b; --构成异或门 f5<=not(a xor b); --构成异或非门即同门 end; 4.1.2 三态门 library ieee; use ieee.std_logic_1164.all; entity tri_s is port(enable: in std_logic; datain: in std_logic_vector(7 downto 0); dataout: out std_logic_vector(7 downto0)); end tri_s; architecture bhv of tri_s is begin process(enable,datain) begin if enable='1' then dataout<=datain; else dataout<="ZZZZZZZZ"; end if; end process; end bhv; 4.1.3 3-8译码器 library ieee; use ieee.std_logic_1164.all; entity decoder3_8 is port(a,b,c,g1,g2a,g2b: in std_logic; y: out std_logic_vector(7 downto 0)); end decoder3_8; architecture a of decoder3_8 is signal dz:std_logic_vector(2 downto 0); begin dz<=c&b&a; process (dz,g1,g2a,g2b) begin if(g1='1'and g2a='0'and g2b='0')then case dz is when "000"=> y<="11111110"; when "001"=> y<="11111101"; when "010"=> y<="11111011"; when "011"=> y<="11110111"; when "100"=> y<="11101111"; when "101"=> y<="11011111"; when "110"=> y<="10111111"; when "111"=> y<="01111111"; when others=>y<="XXXXXXXX"; end case; else y<="11111111"; end if; end process; 4.1.4 优先编码器

第6章 VHDL程序设计

第六章:VHDL程序设计 §6.1 VHDL描述风格 ·描述风格:VHDL的构造体用于描述整个设计实体的逻辑功能。对于相同的电路功能行为,可以用不同的描述方式来表达;对于相同的逻辑行为,可以用不同的语句来描述。 ·类型:行为描述; 寄存器传递(数据流)描述; 结构描述。 1.行为描述方式 ·含义:是对系统数学模型的描述。 ·特点:①只表示输入与输出间转换的行为,而不包含任何结构信息; ②主要使用函数、过程和进程语句,以算法形式描述数据的变换和传送; ③比寄存器传递和结构描述具有更高的抽象性; ④行为描述是VHDL编程的核心,可以说,没有行为描述就没有VHDL。 ⑤通常不能直接进行逻辑综合,需要转化成RTL描述或结构描述。 ·用途:主要用于系统数学模型的仿真或系统工作原理的仿真。 [例6-1]用行为描述方式描述“二选一”电路功能。 LIBRARY IEEE; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY mux2 IS i1 PROT( i0, i1, sel : IN STD_LOGIC; q: OUT STD_LOGIC ); sel END mux2; ARCHITECTURE behav OF mux2 IS BEGIN CASE sel IS WHEN 0 =>q<=i0 AFTER 10ns; WHEN 1 =>q<=i1 AFTER 10ns; WHEN OTHERS=>q<=‘X‘ AFTER 10ns; END CASE END behav; 2.寄存器传递描述(RTL)方式 ·含义:是一种明确规定寄存器描述的方法。 ·分类:①采用寄存器之间的功能描述(类似行为描述);

vhdl各种实验程序代码

1.三与门 library ieee; use ieee.std_logic_1164.all; entity yumen is port(a,b,c : in std_logic; f : out std_logic); end yumen; architecture and3_1 of yumen is begin f<=a and b and c; end architecture and3_1; 2.三八译码器 library ieee; use ieee.std_logic_1164.all; entity jg is port(a,b,c,g1,g2a,g2b:in std_logic; y:out std_logic_vector(7 downto 0)); end entity jg; architecture rt1 of jg is signal indata:std_logic_vector(2 downto 0); begin indata<=c&b&a; process(indata,g1,g2a,g2b)is begin if(g1='1' and g2a='0' and g2b='0')then case indata is when"000"=>y<="11111110"; when"001"=>y<="11111101"; when"010"=>y<="11111011"; when"011"=>y<="11110111"; when"100"=>y<="11101111"; when"101"=>y<="11011111"; when"110"=>y<="10111111"; when"111"=>y<="01111111"; when others=>y<="xxxxxxxx"; end case; else y<="11111111"; end if; end process; end rt1; 3.同步复位/置位、下降沿触发的d触发器ibrary ieee; use ieee.std_logic_1164.all; entity adff is port(clk,d,r,s:in std_logic; q:out std_logic); end adff; architecture rtl of adff is signal q_temp,qb_temp:std_logic; begin process(clk,r,s) begin if(clk'event and clk='0')then if(r='0' and s='1')then q_temp<='1'; if(r='1' and s='0')then q_temp<='0'; else q_temp<=d; end if; end if; end if; end process; q<=q_temp; end rtl; 4.异步复位/置位、上升沿触发的d发器ibrary ieee; use ieee.std_logic_1164.all; entity adff is port(clk,d,r,s:in std_logic; q:out std_logic); end adff; architecture rtl of adff is signal q_temp,qb_temp:std_logic; begin process(clk,r,s) begin if(r='0' and s='1')then q_temp<='1'; elsif(r='1' and s='0')then q_temp<='0'; elsif(clk'event and clk='1')then q_temp<=d; end if; end process; q<=q_temp; end rtl;

VHDL代码书写规范

VHDL代码书写规范 (定稿) 文件编号: 编制: 审核: 可靠性审核: 标准化: 批准:

文件会签页 文件历史记录 文件编号 现行版本V1.0 文件标题VHDL代码书写规范 文件履历 版次编制日期更改内容(条款) V1.0 V1.0

目录 1.目的 (1) 2.范围 (1) 3.术语说明 (1) 4.书写规范 (1) 4.1命名规范 (1) R1.一个文件只包含一个模块,文件命名和实体命名必须相同。文件名大写,其后缀小写。 (1) R2.顶层文件命名方式使用工程名、器件型号与_TOP结合。顶层文件的元件实例化,后缀使用_module;第二层文件的元件实例化,后缀使用_block;第三层之后不做定义(若遇到常见的基本逻辑电路或子模块,如:SRAM、FIFO等,那么优先使用具有代表性的名称) (1) R3.代码编写之前,以文档的方式,根据功能分类,分别对FPGA的外部端口进行命名约定。 (2) R4.命名要有实际意义。 (2) R5.命名标识符的首字符必须是字母,包含多个单词的标志符单词之间使用下划线分开。信号、变量等的命名最后字符也一定要求是字母,中间的可以是数字或者其他合法符号。 (2) R6.模块、信号、变量等的命名不大于64个字符 (2) R7.实体、结构名、端口信号、常量用大写标识 (2) R8.行为级、结构级和数据流级结构命名分别以“BEH_实体名”、“STR_实体名”和“RTL_实体名”区分。 如果是混合使用,或者是分不清使用了那一种结构,那么就是用“ARC_实体名”命名。 (3) R9.单口RAM模块命名以SPRAM作后缀;双口RAM模块命名以DPRAM作后缀;ROM模块命名以ROM作后缀; FIFO模块命名以FIFO_作后缀;数字时钟管理模块命名以DCM作后缀;锁相环模块命名以PLL作后缀;乘法模块命名以MULT作后缀;除法模块命名以DIV作后缀;加法模块命名以ADD作后缀;减法模块命名以SUB作后缀。 (3) R10.模块实例化时,采用‘Un_xx_元件名’标识,cell实例化时使用‘Mn_xx_元件名’标识。 (3) R11.模块内部定义的信号、变量采用首字母大写命名。首字母符合说明的要求。 (3) R12.非顶层模块端口信号命名方式采用I_portname、O_portname和IO_portname分别对应输入、输出和双向端口信号。 (3) R13.时钟信号必须用后缀“_clk”进行命名。 (3) R14.对于微处理器接口的寄存器,必须包含reg标志。用下划线分开该寄存器功能特征。 (4) R15.对于输入管脚时钟采样同步的信号命名要求后缀加“_buf”表示。多次采样加数字区分。 (4) R16.一些常用的基本信号按说明统一后缀命名。 (4) R17.多比特信号,应该使用相同的比特顺序,都采用downto描述。 (5) R18.VHDL的保留字用小写。 (5) R19.调用IEEE 标准库时,“IEEE”用大写,其它用小写。 (5) 4.2注释规范 (5) R20.每个VHDL源文件应该在文件头注释文件的基本信息。 (5) R21.每个信号、变量、常量和端口的定义都要有注释。 (5) R22.每个进程使用“--------”隔开。如果一个功能模块由几个进程组成,使用”--*****”隔开。 (5) R23.对于内部表,注释说明表的组成、表的内容及作用。 (6) 4.3其它书写规范 (6) R24.用缩进方式使得代码有层次感,缩进不要使用TAB键,缩进为4个空格。 (6) R25.每行字符数,最大不能超过120。 (6)

用VHDL语言设计延时电路

用VHDL语言设计延时电路 用VHDL语言设计延时电路时一般用计数器或计数器的级联来实现。 下面以一个实例来说明如何实现任意时间量的延时。 在5 MHz时钟CLK控制下对同步信号SYNC进行N延时(SYNC脉冲宽度为2 μs,脉冲重复频率为1 kHz;0μs≤N≤998 μs)。要求每次在同步脉冲上升沿到来时开始延时,并在延时结束后产生宽度为10 μs的选通信号。 需要产生的延时时序如图2所示(延时量N=4.2μs)。 这里采用3个计数器和1个或门产生上述延时信号,如图3所示,模N计数器计延时量;模50计数器计选通信号的宽度;模N+50计数器用于产生使能信号。用VHDL硬件描述语言进行硬件电路设计时,同一个进程中不能用2个时钟来触发,而时序图中又要求在同步脉冲SYNC的上升沿开始延时,为了解决这一问题,采用了模N+50计数器和1个或门。 当同步脉冲为高电平时,模N计数器和模N+50计数器开始计数,并置dly_en为高电平。模N计数器满,置dly_enl为高电平同时产生选通信号。当模N+50计数器计满即选通信号产生完之后置dly_en为低电平。当下一个同步脉冲到来时重复以上过程。这种设计电路的好处是当同步脉冲的宽度改变时对时序控制并无影响,因为在计数过程中只用了SYNC的上升沿,从延时开始到选通信号结束,在或门的作用下SYNC对计数器不起控制作用。

上述电路的VHDL程序如下:

该程序选择N=20,即延时量是4.2 μs,由于要使用时钟来判断SYNC的上升沿情况,因此,如果令N=0,产生的delay信号仍然会有1个时钟的固有延时,在计算延时量时应充分考虑到这一点,延时量=(N+1)×时钟周期。

VHDL源代码-计数器

十五计数器 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ENTITY fiveteencout IS PORT(clk,reset,enable : IN std_logic; count : OUT std_logic_vector(3 downto 0)); END fiveteencout; ARCHITECTURE counter OF fiveteencout IS SIGNAL count_int:std_logic_vector(0 to 3); BEGIN PROCESS(clk,reset) BEGIN WAIT UNTIL rising_edge(clk); IF reset = '1' THEN count_int <= (OTHERS => '0'); ELSIF enable = '1' THEN IF(count_int="1110") THEN count_int<="0000"; ELSE count_int <= count_int 1; --ELSE -- NULL ; --IF (count_int="1001") THEN --count_int<="0000"; END IF; END IF; END PROCESS; count <= count_int; -- IF (reset='0') then --q<="0000"; ---ELSIF(clk'event and clk='1') THEN --q<=q 1; --IF (q<="1001") then --q<="0000"; ---END IF;

VHDL程序设计题

VHDL 程序设计题 四、 编程题(共50分) 1、请补全以下二选一VHDL 程序(本题10分) Entity mux is port(d0,d1,sel:in bit; q:out BIT ); (2) end mux; architecture connect of MUX is (4) signal tmp1, TMP2 ,tmp3:bit; (6) begin cale: block begin tmp1<=d0 and sel; tmp2<=d1 and (not sel) tmp3<= tmp1 and tmp2; q <= tmp3; (8) end block cale; end CONNECT ; (10) 2、编写一个2输入与门的VHDL 程序,请写出库、程序包、实体、构造体相关语句,将端口定义为标准逻辑型数据结构(本题10分) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; (2) ENTITY nand2 IS PORT (a ,b:IN STD_LOGIC; (4) & a b y

y:OUT STD_LOGIC); (6) END nand2; ARCHITECTURE nand2_1 OF nand2 IS (8) BEGIN y <= a NAND b; --与y <=NOT( a AND b);等价(10)END nand2_1; 3、根据下表填写完成一个3-8线译码器的VHDL程序(16分)。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY decoder_3_to_8 IS PORT (a,b,c,g1,g2a,g2b:IN STD_LOGIC; y:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); (2)END decoder_3_to_8; ARCHITECTURE rtl OF decoder_3_to_8 IS SIGNAL indata:STD_LOGIC_VECTOR (2 DOWNTO 0); (4)BEGIN indata <= c & b & a; (6)PROCESS (indata,g1,g2a,g2b) BEGIN IF (g1 = '1' AND g2a = '0' AND g2b = '0' ) THEN (8)CASE indata IS WHEN "000"=> y <= ""; WHEN "001" => y <= ""; WHEN "010" => y <= ""; (10) WHEN "011" => y <= ""; WHEN "100" => y <= ""; WHEN "101" => y <= ""; WHEN "110" => y <= ""; (12) WHEN "111" => y <= ""; WHEN OTHERS=> y <= "XXXXXXXX"; END CASE; ELSE

EDA 常见实例源程序代码vhdl

第4章用VHDL程序实现常用逻辑电路 4.1 组合逻辑电路设计 4.1.1 基本逻辑门 library ieee; use iee.std_logic_1164.all; entity jbm is port(a,b: in bit; f1,f2,f3,f4,f5,f: out bit); end jbm; architecture a of jbm is begin f1<=a and b; --构成与门 f2<=a or b; --构成或门 f<=not a; --构成非门 f3<=a nand b; --构成与非门 f4<=a nor b; --构成异或门 f5<=not(a xor b); --构成异或非门即同门 end; 4.1.2 三态门 library ieee; use ieee.std_logic_1164.all; entity tri_s is port(enable: in std_logic; datain: in std_logic_vector(7 downto 0); dataout: out std_logic_vector(7 downto0)); end tri_s; architecture bhv of tri_s is begin process(enable,datain) begin if enable='1' then dataout<=datain; else dataout<="ZZZZZZZZ"; end if; end process; end bhv; 4.1.3 3-8译码器 library ieee; use ieee.std_logic_1164.all; entity decoder3_8 is port(a,b,c,g1,g2a,g2b: in std_logic; y: out std_logic_vector(7 downto 0)); end decoder3_8;

VHDL+Verilog良好的代码编写风格

VHDL+Verilog良好的代码编写风格(二十五条) 田Sir 发表于: 2010-4-28 13:56 来源: 湖北师范学院电工电子实验教学示范中心良好代码编写风格可以满足信、达、雅的要求。在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。良好代码编写风格的通则概括如下:(1)对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写; (2)使用有意义的信号名、端口名、函数名和参数名; (3)信号名长度不要太长; (4)对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk 作为时钟信号的前缀;(5)对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字; (6)对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。注意在同一个设计中要使用同一个小写字母表示低电平有效; (7)对于复位信号使用rst 作为信号名,如果复位信号是低电平有效,建议使用rst_n; (8)当描述多比特总线时,使用一致的定义顺序,对于verilog 建议采用bus_signal[x:0]的表示; (9)尽量遵循业界已经习惯的一些约定。如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等; (10)在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等;(11)使用适当的注释来解释所有的always 进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂; (12)每一行语句独立成行。尽管VHDL 和Verilog 都允许一行可以写多个语句,当时每个语句独立成行可以增加可读性和可维护性。同时保持每行小于或等于72 个字符,这样做都是为了提高代码得可读性;(13)建议采用缩进提高续行和嵌套语句得可读性。缩进一般采用两个空格,如西安交通大学SOC 设计中心2 如果空格太多则在深层嵌套时限制行长。同时缩进避免使用TAB 键,这样可以避免不同机器TAB 键得设置不同限制代码得可移植能力; (14)在RTL 源码的设计中任何元素包括端口、信号、变量、函数、任务、模块等的命名都不能取Verilog 和VHDL 语言的关键字; (15)在进行模块的端口申明时,每行只申明一个端口,并建议采用以下顺序:输入信号的clk、rst、enables other control signals、data and address signals。然后再申明输出信号的clk、rst、enalbes other control signals、data signals; (16)在例化模块时,使用名字相关的显式映射而不要采用位置相关的映射,这样可以提高代码的可读性和方便debug 连线错误; (17)如果同一段代码需要重复多次,尽可能使用函数,如果有可能,可以将函数通用化,以使得它可以复用。注意,内部函数的定义一般要添加注释,这样可以提高代码的可读性; (18)尽可能使用循环语句和寄存器组来提高源代码的可读性,这样可以有效地减少代码行数; (19)对一些重要的always 语句块定义一个有意义的标号,这样有助于调试。注意标号名不要与信号名、变量名重复; (20)代码编写时的数据类型只使用IEEE 定义的标准类型,在VHDL 语言中,设计者可以定义新的类型和子类型,但是所有这些都必须基于IEEE 的标准; (21)在设计中不要直接使用数字,作为例外,可以使用0 和1。建议采用参数定义代替直接的数字。同

数据选择器的VHDL设计

实验名称:数据选择器的VHDL设计 一、用WHEN_ELSE语句编写具有低电平使能端的4选1数据选择器 1.实体框图 2.程序设计 ①编译前的程序 Library ieee; Use ieee.std_logic_1164.all; Entity Mux41A is port(D0,D1,D2,D3,EN:in std_logic; A0,A1:in std_logic; Y:out std_logic); End Mux41A; Architecture one of Mux41A is signal B:std_logic Begin B<=EN & A1 & A0; Y<=D0 when B="000" else D1 when B="001" else D2 when B="010" else D3 when B="011" else 'Z'; End architecture one; ②程序编译错误情况 错误1: Error (10500): VHDL syntax error at Mux41A.vhd(10) near text "Begin"; expecting ";", or ":=", or "bus", or "register" ③正确的程序 Library ieee;

Use ieee.std_logic_1164.all; Entity Mux41A is port(D0,D1,D2,D3,EN:in std_logic; A0,A1:in std_logic; Y:out std_logic); End Mux41A; Architecture one of Mux41A is signal B:std_logic_vector(2 downto 0); Begin B<=EN & A1 & A0; Y<=D0 when B="000" else D1 when B="001" else D2 when B="010" else D3 when B="011" else 'Z'; End architecture one; 3.仿真波形图 4.仿真波形分析 EN为低电平有效的使能端,A1、A0为控制端,D0、D1、D2、D3为选通端,Y为输出端当EN=‘1’时,输出为高阻状态; 当EN=‘0’时,低电平有效 A1A0=“00”时,选择D0输出 A1A0=“01”时,选择D1输出 A1A0=“10”时,选择D2输出 A1A0=“11”时,选择D3输出

相关文档