用VHDL实现二位二进制乘法(应用4-16译码器)

合集下载

2位2进制计数器vhdl代码

2位2进制计数器vhdl代码

2位2进制计数器VHDL代码1. 介绍2位2进制计数器是一种广泛用于数字电路设计和嵌入式系统开发中的基本电路。

它可以在数字系统中实现对二进制计数的功能,常用于控制信号发生器、时序逻辑和状态机等应用场景。

本文将深入探讨2位2进制计数器的VHDL代码实现,并对其进行全面评估和分析。

2. 基本概念在开始编写VHDL代码之前,我们首先需要了解2位2进制计数器的基本概念。

2位2进制计数器可以实现对二进制数00、01、10、11的循环计数,并在每次计数完成后进行自动重置。

其基本结构包括两个触发器和逻辑门,通过时钟信号和控制信号进行计数和重置操作。

在VHDL代码中,我们需要定义计数器的输入、输出和内部逻辑,并编写时序逻辑实现循环计数和自动重置功能。

3. VHDL代码实现在VHDL代码中,我们首先需要定义2位2进制计数器的输入信号(时钟)和输出信号(计数值),并声明内部变量和逻辑控制信号。

接下来,我们使用时序逻辑描述计数器的计数过程,并在适当的时机对计数值进行重置。

具体的VHDL代码如下:```vhdllibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity binary_counter isPort ( clk : in STD_LOGIC;reset : in STD_LOGIC;count : out STD_LOGIC_VECTOR (1 downto 0)); end binary_counter;architecture Behavioral of binary_counter issignal temp_count : STD_LOGIC_VECTOR (1 downto 0); beginprocess(clk, reset)beginif reset = '1' thentemp_count <= "00";elsif rising_edge(clk) thentemp_count <= temp_count + 1;end if;end process;count <= temp_count;end Behavioral;```在以上的VHDL代码中,我们定义了一个名为binary_counter的实体,包括时钟信号(clk)、复位信号(reset)和计数信号(count)。

EDA用VHDL语言设计一个2-4译码器知识讲解

EDA用VHDL语言设计一个2-4译码器知识讲解

E D A用V H D L语言设计一个2-4译码器2-4译码器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY decoder 2 _4 ISPORT( a:IN STD_LOGIC_VECTOR(1 DOWNTO 0); s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END decoder2_4;ARCHITECTURE Behavioral OF decoder2 _4_t IS BEGINPROCESS(sel)BEGINCASE a ISWHEN "00"=>s<=”0001”;WHEN "01"=>s<=”0010”;WHEN "10"=>s<=”0100”;WHEN "11"=>s<=”1000 “;WHEN OTHERS=>s<=’’0000”END CASE;END PROCESS;END Brhavioral;4选1数据选择器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY sel4 ISPROT(d:IN STD_LOGIC_VECTOR(3DOWNTO 0); a:IN STD_LOGIC_VECTOR(1 DOWNTO 0);s:OUT STD_LOGIC);END sel4:ARCHITECTURE Behavioral OF sel4 ISBEGINROCESS(a,d)BEGINCASE a ISWHEN "00"=>s<=d(0)WHEN "01"=>s<=d(1)WHEN "10"=>s<=d(2)WHEN "11"=>s<=d(3) “;WHEN OTHERS=>s<=’Z’END CASE;END PROCESS;END Brhavioral;100进制加法计数器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY counter ISPORT(clk,en,load,rst:IN STD_LOGICd;IN STD_LOGIC_VECTOR(6 DOWNTO 0);q: OUT STD_LOGIC_VECTOR(6DOWNTO 0):END counter 100;ARCHTECTURE Behavioral OF counter 100 ISsignal qtemp:STD_LOGIC_VECTOR(6 DOWNTO 0);BEGINPROCESS(clk,d,en,load,rst)BEGINIF rst= ’1’ THENqtemp<=”00000000”;ELSIF rising-edge(clk) THEN\IF en=’1’ THENIF load=’1’ THEN qtemp<=d,ELSIF qtemp=”1100011” THEN qtemp<=”00000000”;ELSIF qtemp<=qtemp+’1;END IF;END IF;END IF;END PROCESS;q<=qtemp;END Behavioral;8位从高至低串入串出移位寄存器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY shift.register ISPORT( d,clk:IN STD_LOGIC;q:OUT STD_LOGIC);END d shift.register;ARCHITECTURE Behavioral OF shift.register IS signal qtemp:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGINPROCESS(d,clk)BEGINIF rising-edge(clk) THENq<=dtemp(0);dtemp<=d&dtemp(7 DOWNTO 1);END IF;END PROCESS;END Behavioral;状态机LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY fsm ISPORT(tin,clk:IN STD_LOGIC;yout:OUT STD_LOGIC_VECTOR(1DOWNTO 0)); END fsm;ARCHITECTURE Behavioral OF fsm ISTYPE state-type IS (S0,S1,S2)signal state,next_state:state_type;BEGINSYNC_PROC:PROCESS(clk)BEGINIF rising_edge(clk) THENstate < = next_state;END IF;END PROCESS;OUTPUT_DECODE:PROCESS(state)BEGINCASE state ISWHEN S0=> yout <=”00”;WHEN S1=> yout<=”01”;WHEN S2=> yout<=”10”;WHEN OTHERS =>yout<=”zz”;END LAST;END PROCESS;NEXT_STATE_DECODE:PROCESS(state,tin)BEGINnext_state<=state;CASE state ISWHEN S0=>next_state<=S1;WHEN S1=> next_state<=S2;WHEN S2=>IF tin=’0’ THEN next_state<=S1;ELSIF tin=’1’ THEN next_state<=S0;ELSE NULL;END IF;WHEN OTHERS=>NULL;END CASE;END PROCESS;END Behavioral;。

vhdl 四输入表决器 二位二进制乘法器 一位二进制全减器等源代码及仿真波形

vhdl 四输入表决器 二位二进制乘法器 一位二进制全减器等源代码及仿真波形

将8421BCD转换为余3码源代码:Library ieee;Use ieee.std_logic_1164.all;Entity bcd isPort(a:in std_logic_vector(3 downto 0);y:out std_logic_vector(3 downto 0));End;Architecture rtl of bcd isBeginProcess(a)BeginCase a isWhen"0000"=>y<="0011";When"0001"=>y<="0100";When"0010"=>y<="0101";When"0011"=>y<="0110";When"0100"=>y<="0111";When"0101"=>y<="1000";When"0110"=>y<="1001";When"0111"=>y<="1010";When"1000"=>y<="1011";When"1001"=>y<="1100";When others=>y<="ZZZZ";End case;End process;End;仿真图形:(仿真结果均有延时,大约20ns)四输入表决器源代码:Library ieee;Use ieee.std_logic_1164.all;Entity bjq isPort(i:in std_logic_vector(3 downto 0);f:out std_logic);End;Architecture nm2 of bjq isBeginProcess(i)Begincase i isWhen"0000"=>f<='0';When"0001"=>f<='0';When"0010"=>f<='0';When"0011"=>f<='0';When"0100"=>f<='0';When"0101"=>f<='0';When"0110"=>f<='0';When"0111"=>f<='1';When"1000"=>f<='0';When"1001"=>f<='0';When"1010"=>f<='0';When"1011"=>f<='1';When"1100"=>f<='0';When"1101"=>f<='1';When"1110"=>f<='1';When"1111"=>f<='1';When others=>f<='Z';End case;End process;End;仿真图形:2位二进制相乘电路源代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity multi isport(A,B:in std_logic_vector(1 downto 0);F:out std_logic_vector(3 downto 0));end;architecture bhv of multi isbeginprocess(A,B)beginif(A="01" and B="01" )thenF<="0001";elsif(A="01" and B="10")thenF<="0010";elsif(A="01" and B="11")thenF<="0011";elsif(A="10" and B="01")thenF<="0010";elsif(A="10" and B="10")thenF<="0100";elsif(A="10" and B="11")thenF<="0110";elsif(A="11" and B="01")thenF<="0011";elsif(A="11" and B="10")thenF<="0110";elsif(A="11" and B="11")thenF<="1001";elseF<="0000";end if;end process;end;仿真图形:一位二进制全减器源代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity subtracter isport(A,B,Ci:in std_logic;F,Co:out std_logic);end;architecture bhv of subtracter isbeginprocess(A,B,Ci)beginif(A='0' and B='0' and Ci='0')thenF<='0';Co<='0';elsif(A='0' and B='0' and Ci='1')thenF<='1';Co<='1';elsif(A='0' and B='1' and Ci='0')thenF<='1';Co<='1';elsif(A='0' and B='1' and Ci='1')thenF<='0';Co<='1';elsif(A='1' and B='0' and Ci='0')thenF<='1';Co<='0';elsif(A='1' and B='0' and Ci='1')thenF<='0';Co<='0';elsif(A='1' and B='1' and Ci='0')thenF<='0';Co<='0';elseF<='1';Co<='1';end if;end process;end;仿真图形:开关控制电路源代码:Library ieee;Use ieee.std_logic_1164.all;Entity switch_control isPort(a,b,c:in std_logic;y:out std_logic);End;Architecture nm5 of switch_control isBeginProcess(a,b,c);V ariable comb:std_logic_vector(2 downto 0);BeginComb:=a&b&c;Case comb isWhen"000"=>y<='0';When"001"=>y<='1';When"011"=>y<='0';When"010"=>y<='1';When"110"=>y<='0';When"111"=>y<='1';When"101"=>y<='0';When"100"=>y<='1';When others=>y<='X';End case;End process;End;仿真图形:。

16位vhdl乘法器详解,加仿真图

16位vhdl乘法器详解,加仿真图

控制模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity cont_modu isport(Clk : in std_logic ;Start : in std_logic; //数据输入开始信号en_sig : out std_logic; //控制运算信号,为‘1’运算数据out_sig : out std_logic // 运算完成信号);end entity;architecture rlt_cont_modu of cont_modu issignal cnt :integer range 0 to 15 :=0;//定义从0到15type state is(S_idle,S_work,S_1d,S_2d);//运算状态信号,状态机signal st_ty : state :=S_idle;beginprocess(Clk)beginif rising_edge(Clk) thencase st_ty is 选择语句;S_idle为空闲状态,当输入数据后Start信号为1就开始工作when S_idle => if Start ='1' then 如果为1就跳转到S_work状态,并且使能信号置1st_ty <= S_work;en_sig <='1';else 不然继续在S_idle状态st_ty <= S_idle;en_sig <='0';end if;out_sig <='0';when S_work => if cnt =15 then 在S_work状态下,cnt信号一直加1,加满16个数就跳转到S_1d,然后使能信号en_sig 就为0。

基于VHDL语言的乘法器的设计

基于VHDL语言的乘法器的设计

利用VHDL設計乘法器Implement of Multiplier by Using VHDL許地申Dih-Shen Hsu中華技術學院電機系副教授Associate ProfessorDepartment of Electrical EngineeringChina Institute of Technology摘 要在計算機結構裡加,減,乘,除是常被用到的運算,本文提出以非常高速積體電路硬體描述語言(VHDL)來描述硬體,說明如何將兩個運算元作相乘的運算。

我們首先以無號數整數做乘法運算來說明其原理,設計其電路結構。

其實在VHDL 程式中,我們更可以載入STD_LOGIC_ARITH與STD_LOGIC_UNSIGNED元件盒之後,直接進行乘法運算,既簡單又容易擴充。

最後,我們將以4-bit X 4-bit 的例子來做電路描述、電路合成、電路模擬並以七段顯示器將其結果顯示出來。

關鍵字:非常高速積體電路硬體描述語言、電路描述、電路合成、電路模擬AbstractWe have known operation that perform addition, subtraction, multiplication, and division. In this paper we are presented primarily to describe hardware using by VHDL. We can explain how multiplication may be performed for two operand. Multiplication of unsigned numbers illustrates the main issues involved in the design of multiplier circuit. In fact, after the STD_LOGIC_ARITH and STD_LOGIC_UNSIGNED packages were added to the VHDL program, it became not only simple but also easy to extended. Next, consider a 4 x 4 example to circuit description, circuit synthesis, and circuit simulation by using VHDL. Finally, this approach can also be displayed by 7-segment.Keyword : VHDL , circuit description , circuit synthesis, circuit simulation壹.簡介VHDL是Very High Speed Integrated Circuit Hardware Description Language 的英文縮寫。

用VHDL语言描述和实现乘法累加器设计

用VHDL语言描述和实现乘法累加器设计

设计应完成的功能要求:(1)乘法累加器的结构如下图所示,5位的被乘数X和5位的乘数Y输入后,暂存在寄存器5位的寄存器A和B中,寄存器A和B的输出首先相乘,得到10位乘积,该乘积通过选择信号sel的控制,可以和10位寄存器C的输出相加,相加结果保存在寄存器C 中,实现乘法累加功能;也可以通过sel选择全零和乘积相加,实现乘法功能。

寄存器C 的输出也是系统输出Z。

:用VHDL语言描述和实现乘法累加器设计(2)要求乘法器和加法器都采用电路描述,不采用算法描述。

(3)要求寄存器A,B,C具有异步清零功能,全部寄存器采用相同的时钟和清零信号。

(4)设计的最终输出是设计报告。

设计报告的内容要求:(1)设计报告的格式采用标准的深圳大学设计报告格式(2)设计报告应包括该电路的总体结构图和主要功能模块组成图;(3)设计报告应根据总体结构图,说明VHDL代码编写的设计思路和基本原理;(4)设计报告应完成该电路的VHDL代码设计;(5)设计报告应完成该电路的VHDL仿真分析。

一、实验目的用VHDL语言描述和实现乘法累加器设计二、实验内容及步骤一.总体结构图设计思路及原理:首先,寄存器A、B、C具有异步清零功能,rest在clk之前调用,当复位信号rest为1时,寄存器A、B、C复位,当rest为0时,并且在它们同一时钟clk的上升沿到来时,输出将等于输入,起到了数据锁存功能。

同时,寄存器的输出Z既是整个结果的输出,也可以被内部引用,因此在定义Z的端口时,把端口类型定义为buffer。

5位的被乘数X和5位的乘数Y输入后,暂存在寄存器5位的寄存器A和B中,通过寄存器A、B的寄存,能够让不同时到达的数据X和Y能够在同一时钟的控制下同时参与运算,寄存器A和B的输出分别为x_temp和y_temp,他们首先相乘,得到10位乘积mul,该乘积通过选择信号sel的控制,当sel为1时,acc=z,即乘积mul可以和10位寄存器C的输出相加,相加结果保存在寄存器C中,实现乘法累加功能;当sel为0时,acc为全零,即选择全零和乘积相加,实现乘法功能。

第3章二进制乘法器的VHDL设计

第3章二进制乘法器的VHDL设计

0 00 0 0 00 0
1011
0 01 0 1 10 0
+
1011
0 10 1 1 00 0
r 1 0 0 0 1 11 1 r 1 0 0 0 1 1 1 1
★二进制数相乘可以用移位相加计算
3.5 乘法器及其VHDL表述
3.5.3 移位相加型乘法器的VHDL表述方法--(11)例3-13
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity mult4b is
3.5 乘法器及其VHDL表述
3.5.1 统计位矢中含‘1’个数的电路模块设计⑩【例3-12】
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity cntc is
port(din :in std_logic_vector(7 downto 0);
❖左移,SRA算术右移,ROL逻辑循环左移 ,ROR逻辑循环右移
3.5 乘法器及其VHDL表述
例3-13仿真结果
UNSIGNED
由INTEGER, UNSDGNED,
SIGNED 转换为
STD_LOGIC_VECTOR
❖2、generic参数定义语句
类属GENERIC常用来定义实体端口大小,数据宽度, 元件例化数目等。一般在简单的设计中不常用。
3.5 乘法器及其VHDL表述
❖3、整数数据类型integer
s:integer :=4; SIGNAL C :INTEGER RANGE 1 TO 7; 实际上一个整数是由32位二进制码表示的带符 号数的范围。

用VHDL实现二位二进制乘法(应用4-16译码器)

用VHDL实现二位二进制乘法(应用4-16译码器)

------------------------------------------------------------------------------------ Company:-- Engineer:---- Create Date: 18:25:21 04/15/2013-- Design Name:-- Module Name: FOUR - Behavioral-- Project Name:-- Target Devices:-- Tool versions:-- Description:---- Dependencies:---- Revision:-- Revision 0.01 - File Created-- Additional Comments:------------------------------------------------------------------------------------library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;---- Uncomment the following library declaration if instantiating---- any Xilinx primitives in this code.--library UNISIM;--use UNISIM.VComponents.all;entity FOUR isPort ( a : in STD_LOGIC;b : in STD_LOGIC;c : in STD_LOGIC;d : in STD_LOGIC;DOUT : out std_logic_vector(3 downto 0));end FOUR;architecture Behavioral of FOUR issignal DIN :STD_LOGIC_VECTOR(3 DOWNTO 0);signal y : std_logic_vector(16 downto 0);beginDIN <= A & B & C & D;process (A,B,C,D)begincase DIN iswhen "0000" => y(0) <= '0';when "0001" => y(1) <= '0';when "0010" => y(2) <= '0';when "0011" => y(3) <= '0';when "0100" => y(4) <= '0';when "0101" => y(5) <= '0';when "0110" => y(6) <= '0';when "0111" => y(7) <= '0';when "1000" => y(8) <= '0';when "1001" => y(9) <= '0';when "1010" => y(10) <= '0';when "1011" => y(11) <= '0';when "1100" => y(12) <= '0';when "1101" => y(13) <= '0';when "1110" => y(14) <= '0';when "1111" => y(15) <= '0';when others => y(16) <= '0';end case ;end process;DIN(3)<=not(y(15));DIN(2)<=not(y(10) and y(11) and y(14));DIN(1)<=not(y(6) and y(7) and y(9)and y(11) and y(13) and y(14)); DIN(0)<=not(y(5)and y(7) and y(13) and y(15));end Behavioral;。

vhdl 四位流水线乘法器

vhdl 四位流水线乘法器

实验二四位流水线乘法器一、实验目的1.了解四位并行乘法器的原理。

2.了解四位并行乘法器的设计思想和流水线的实现方法。

3.掌握用VHDL 语言实现基本二进制运算的方法。

二、实验内容与要求通过开关和键盘输入两组4BIT的二进制数据,按照二进制加法器原理进行加和,求出和及进位,并通过LED显示灯输出显示,完成编译、综合、适配、仿真、实验箱上的硬件测试。

三、实验原理流水线结构的并行乘法器的最大有点就是速度快,尤其实在连续输入的乘法器中,可以达到近乎单周期的运算速度。

流水线乘法器是组合逻辑电路实现无符号数乘法的方法上发展而来的。

其关键是在组合逻辑电路的基础上插入寄存器。

假如有被乘数A 和乘数B,首先用A 与B 的最低位相乘得到S1,然后再把A 左移1 位与B 的第2 位相乘得到S2,再将A 左移3 位与B 的第三位相乘得到S3,依此类推,直到把B 的所有位都乘完为止,然后再把乘得的结果S1、S2、S3……相加即得到相乘的结果。

需要注意的是,具体实现乘法器是,并不是真正的去乘,而是利用简单的判断去实现,举个简单的例子。

假如A 左移n 位后与B 的第n 位相乘,如果B 的这位为‘1’,那么相乘的中间结果就是A 左移n 位后的结果,否则如果B 的这位为‘0’,那么就直接让相乘的中间结果为0 即可。

带B 的所有位相乘结束后,把所有的中间结果相加即得到A 与B 相乘的结果。

在此基础上插入寄存器即可实现流水线乘法器。

四、实验平台(1)硬件:计算机、GX-SOC/SOPC-DEV-LABCycloneII EP2C35F672C8核心板(2)软件:Quartus II软件PIN_AF8 DATAOUT[4] LED4PIN_AE7 DATAOUT[5] LED5PIN_AF7 DATAOUT[6] LED6PIN_AA11 DATAOUT[7] LED7PIN_AE21 BCD[0] 数码管DP4BPIN_AB20 BCD[1]PIN_AC20 BCD[2]PIN_AF20 BCD[3]PIN_AE20 BCD[4] 数码管DP5BPIN_AD19 BCD[5]PIN_AC19 BCD[6]PIN_AA17 BCD[7]PIN_AA18 BCD[8] 数码管DP6BPIN_W17 BCD[9]PIN_V17 BCD[10]PIN_AB18 BCD[11]六、仿真截图七、硬件实现八、程序代码1---clkgen.vhdlibrary IEEE;-- 1HZuse IEEE.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity clkgen isport (CLK : in std_logic;CLK1HZ: out std_logic);end entity;architecture clk_arch of clkgen issignal COUNT : integer range 0 to 50000000; --50MHZ -->1hz begin -- 50M/1=50000000 PROCESS(CLK)BEGINif clk'event and clk='1' thenIF COUNT= 50000000 thenCOUNT<=0;ELSE COUNT<=COUNT+1;END IF;END IF;END PROCESS;PROCESS(COUNT)BEGINIF COUNT= 5000000 THEN -- 1HZCLK1HZ<='1';ELSE CLK1HZ<='0';END IF;END PROCESS;end architecture;2—BCD-- 输出控制模块,把乘法器的输出转换成BCD码在数码管上显示、-- SCKZ.VHDlibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity BIN2BCD isport ( DIN: in std_logic_vector(7 downto 0); ---The input 8bit binaryBCDOUT: out std_logic_vector(11 downto 0)--输出显示, 已转换成BCD码);end entity;architecture arch of BIN2BCD issignal data2,data3,data4 :std_logic_vector(9 downto 0);-- 输出数据缓存signal hundred,ten,unit:std_logic_vector(3 downto 0);--signal bcdbuffer:std_logic_vector(11 downto 0);---2'1111_1001_11=999beginBCDOUT<= bcdbuffer;bcdbuffer(11 downto 8)<=hundred;bcdbuffer(7 downto 4)<=ten;bcdbuffer(3 downto 0)<=unit;get_hundred_value:process(data2)beginDA TA2<="00"&DIN;---get hundred valueif data2>=900 thenhundred<="1001";--9data3<=data2-900;elsif data2>=800 thenhundred<="1000";--8data3<=data2-500;elsif data2>=700 thenhundred<="0111";--7data3<=data2-700;elsif data2>=600 thenhundred<="0110";--6data3<=data2-600;elsif data2>=500 thenhundred<="0101";--5data3<=data2-500;elsif data2>=400 thenhundred<="0100";--4data3<=data2-400;elsif data2>=300 thenhundred<="0011";--3data3<=data2-300;elsif data2>=200 thenhundred<="0010";--2data3<=data2-200;elsif data2>=100 thenhundred<="0001";--1data3<=data2-100;else data3<=data2;hundred<="0000";end if;end process; ---get_thousand_valueget_tens_value:process(data3) begin---get tens placeif data3>=90 thenten<="1001";--9data4<=data3-90;elsif data3>=80 thenten<="1000";--8data4<=data3-50;elsif data3>=70 thenten<="0111";--7data4<=data3-70;elsif data3>=60 thenten<="0110";--6data4<=data3-60;elsif data3>=50 thenten<="0101";--5data4<=data3-50;elsif data3>=40 thenten<="0100";--4data4<=data3-40;elsif data3>=30 thenten<="0011";--3data4<=data3-30;elsif data3>=20 thenten<="0010";--2data4<=data3-20;elsif data3>=10 thenten<="0001";--1data4<=data3-10;else data4<=data3;ten<="0000";end if;end process; ---get_ten_valueget_unit_value:process(data4)begin--unit's orderif (data4>0) thenunit<=data4(3 downto 0);else unit<="0000";end if;end process;end arch;3 multi4b --------------------------------------------------------------------------------/ -- DESCRIPTION : Signed mulitplier:-- AIN (A) input width : 4-- BIN (B) input width : 4-- Q (data_out) output width : 8-- 并行流水乘法器--------------------------------------------------------------------------------/--10 × 9 = 90-- 1 0 1 0-- 1 0 0 1 =-- --------------- 1 0 1 0-- 0 0 0 0 --partial products-- 0 0 0 0-- 1 0 1 0-- -------------------- 1 0 1 1 0 1 0--parallel : process all the inputs at the same time--pipeline : use several stages with registers to implement it----关键思想,插入寄存器library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity multi4b isport ( CLK: in STD_LOGIC; ---system clockAIN: in STD_LOGIC_VECTOR (3 downto 0); ---one inputBIN: in STD_LOGIC_VECTOR (3 downto 0);-- the other inputdata_out: out STD_LOGIC_VECTOR (7 downto 0)---the result ---make sure the biggest value ,i,e. 1111x1111=1110_0001 can be held in the register );end multi4b;architecture multi_arch of multi4b issignal A,B :std_logic_vector(3 downto 0); --input register---registers to hold the result of the first processing---registers added to make use of pipeline, the 1st stagesignal A_MULT_B0: STD_LOGIC_VECTOR (3 downto 0);signal A_MULT_B1: STD_LOGIC_VECTOR (3 downto 0);signal A_MULT_B2: STD_LOGIC_VECTOR (3 downto 0);signal A_MULT_B3: STD_LOGIC_VECTOR (3 downto 0);---register to hold the result of the multipliersignal C_TEMP : STD_LOGIC_VECTOR (7 downto 0);beginPROCESS(CLK,AIN,BIN)beginif CLK'EVENT AND CLK='1' THEN-- multiplier operand inputs are registeredA<= AIN;B<= BIN;-----------------Fist stage of the multiplier------------------here we get the axb(0),axb(1),axb(2),axb(3),i.e.partial products---put them into the responding registersA_MULT_B0(0) <= A (0) and B (0);----- multi 1 , get the a(0) and b(0), & put it into the register A_MULT_B0(0)A_MULT_B0(1) <= A (1) and B (0);A_MULT_B0(2) <= A (2) and B (0);A_MULT_B0(3) <= A (3) and B (0);--10 × 9 = 90-- 1 0 1 0-- 1 0 0 1 =-- --------------- 0 0 0 0 1 0 1 0-- 0 0 0 0 0 0 0 0 --partial products-- 0 0 0 0-- 1 0 1 0-- -------------------- 1 0 1 1 0 1 0A_MULT_B1(0) <= A (0) and B (1);A_MULT_B1(1) <= A (1) and B (1);A_MULT_B1(2) <= A (2) and B (1);A_MULT_B1(3) <= A (3) and B (1);A_MULT_B2(0) <= A (0) and B (2);A_MULT_B2(1) <= A (1) and B (2);A_MULT_B2(2) <= A (2) and B (2);A_MULT_B2(3) <= A (3) and B (2);A_MULT_B3(0) <= A (0) and B (3);A_MULT_B3(1) <= A (1) and B (3);A_MULT_B3(2) <= A (2) and B (3);A_MULT_B3(3) <= A (3) and B (3);end if;end process;--------------------Second stage of the multiplier---------------add the all the partial products ,then get the result of the multiplier C_TEMP<=( "0000" & A_MULT_B0 )+( "000"& A_MULT_B1 &'0' )+( "00" & A_MULT_B2 & "00" )+( '0'&A_MULT_B3 & "000" );--build a signal register output---输出寄存,利于实现流水data_out <= C_TEMP; --output registerend multi_arch;九、实验总结。

(完整word版)2对4译码器VHDL实验报告.doc

(完整word版)2对4译码器VHDL实验报告.doc

通信与信息工程学院2012 /2013学年第二学期软件设计实验报告模块名称二对四译码器专业电子信息工程学生班级B100109学生学号学生姓名指导教师梅中辉、王奇、周晓燕、孔凡坤实验目的:本软件设计的目的和任务: 1.使学生全面了解如何应用该硬件描述语言进行高速集成电路设计; 2.通过软件使用、设计与仿真环节使学生熟悉 EDA-VHDL 开发环境; 3. 通过对基本题、综合题的设计实践,使学生掌握硬件系统设计方法(自底向上或自顶向下),熟悉 VHDL 语言三种设计风格,并且培养学生应用 VHDL 语言解决实际问题的能力。

实验设备: 1:微型计算机2:quartus II 开发软件实验课题: 2 对 4 译码器实验描述:设计一个 2 对 4 译码器(输入: A B 输出: Y3 Y2 Y1 Y0 ),真值表如图:A B Y3 Y2 Y1 Y00 0 1 1 1 00 1 1 1 0 11 0 1 0 1 11 1 0 1 1 1一:实验目的1:能了解组合逻辑中译码器电路的设计原理。

2:能利用 CPLD数字发展实验系统设计一个二对四译码器。

3:能自行验证所设计电路的正确性。

二:实验内容及要求设计一个 2-4 译码器,并验证输出数值的正确性。

三:实验器材1. 软件: Altera公司的Quartus ||软件。

2. 芯片: Altera公司的EP2C8T144C8。

1)、选择 Block Diagran/Schenatic File,单击 OK 按钮,打开图形2)、进入原理图编辑页面如下:导入逻辑门电路符号、输入/输出符号,用导线连接各逻辑单元如下:工程建立与编译建立工程:在 D 盘建立 test 文件夹,进入 quartusII7.2 主界面,新建编辑代码页面,选择 VHDL file ,点击 OK代码输完后存盘,文件名必需为 test8(文件名必须与实体名一致),目录为,按 project 菜单下 set as top-level entity 命令。

用VerilogHDL设计2位16进制计数器

用VerilogHDL设计2位16进制计数器

基于FPGA的系统设计与应用实验二计数器设计实验一、实验目的:学习计数器的设计、仿真和硬件测试方法。

二、实验内容及步骤:1.用Verilog HDL设计2位16进制计数器,由DE2的KEY0输入计数值,在HEX1,HEX0上显示计数值。

2.使用嵌入式逻辑分析仪进行仿真;3.将实验程序下载到DE2运行。

实验注意事项:去抖动三、程序代码module lib22(out1,out2,clk,rst,key);output [6:0] out1,out2;input clk,rst;input key;reg [19:0]count;reg [7:0]in;reg [6:0]out1,out2;reg C,K;reg [9:0] r1;always@(posedge clk)if(count==20'd5000)beginC=~C;count<=1'b0;endelsecount=count+1'b1;always @ (posedge C)beginif(r1<10'd1000)beginK<=1'b0;r1<=r1+1'b1;endelsebeginK<=1'b1;r1<=1'b0;endendalways @ (posedge C,negedge rst) if(!rst)in<=1'b0;else if(!K)beginin=in+8'b1;endalways @ (in[3:0])case(in[3:0])4'b0000:out1=7'b1000000;4'b0001:out1=7'b1111001;4'b0010:out1=7'b0100100;4'b0011:out1=7'b0110000;4'b0100:out1=7'b0011001;4'b0101:out1=7'b0010010;4'b0110:out1=7'b0000010;4'b0111:out1=7'b1011000;4'b1000:out1=7'b0000000;4'b1001:out1=7'b0010000;4'b1010:out1=7'b0001000;4'b1011:out1=7'b0000011;4'b1100:out1=7'b1000110;4'b1101:out1=7'b1100001;4'b1110:out1=7'b0000110;4'b1111:out1=7'b0001110;default:out1=7'b1111111; endcasealways @ (in[7:4])case(in[7:4])4'b0000:out2=7'b1000000;4'b0001:out2=7'b1111001;4'b0010:out2=7'b0100100;4'b0011:out2=7'b0110000;4'b0100:out2=7'b0011001;4'b0101:out2=7'b0010010;4'b0110:out2=7'b0000010;4'b0111:out2=7'b1011000;4'b1000:out2=7'b0000000;4'b1001:out2=7'b0010000;4'b1010:out2=7'b0001000;4'b1011:out2=7'b0000011;4'b1100:out2=7'b1000110;4'b1101:out2=7'b1100001;4'b1110:out2=7'b0000110;4'b1111:out2=7'b0001110;default:out2=7'b1111111; endcaseendmodule四、实验原理图:DE2按键电路图五、实验总结与分析:1.不加去斗时,出现的结果不稳定,不同的DE2板子结果不一样,在加上去斗时,实验结果很稳定;2.去斗可以是检测抖动阶段也可以是不抖动阶段;3.实验二包含了实验一的一些内容,例如数码管的显示,但是加了去抖动程序,使结果更加的稳定。

《VHDL应用教程》课后习题参考答案

《VHDL应用教程》课后习题参考答案

第1章绪论1.1电子设计自动化1.2EDA技术,是以大规模可编程逻辑器件为设计载体,以硬件描述语言为系统逻辑描述的主要表达方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件的方式设计的电子系统到硬件系统的逻辑编译、逻辑化简、逻辑分割、逻辑综合及优化、逻辑布局布线、逻辑仿真,直至完成对于特定目标芯片的适配编译、逻辑映射、编程下载等工作,最终形成集成电子系统或专用集成芯片的一门新技术。

1.31、用软件的方式设计硬件。

2、用软件方式设计的系统到硬件系统的转换是由有关的开发软件自动完成的。

3、设计过程中可用有关软件进行各种仿真。

4、系统可现场编程,在线升级。

5、整个系统可集成在一个芯片上,体积小、功耗低、可靠性高。

因此,EDA技术是现代电子设计的发展趋势。

1.4可编程逻辑器件(Programmable Logic Device,PLD)是一种由用户编程以实现某种逻辑功能的新型逻辑器件。

FPGA和CPLD分别是现场可编程门阵列和复杂可编程逻辑器件的简称。

1.51、自顶向下设计方法是一种模块化设计方法。

它对设计的描述从上到下,逐步由粗略到详细,符合常规的逻辑思维习惯。

由于高层设计与器件无关,设计易于在各种集成电路工艺或可编程器件之间移植。

2、适合多个设计者同时进行设计。

随着技术的不断进步,许多设计由一个设计者已无法完成,而必须经过多个设计者分工协作来完成。

在这种情况下,应用自顶向下的设计方法便于多个设计者同时进行设计,对设计任务进行合理分配,并用系统工程的方法对设计进行管理。

第2章可编程逻辑器件2.1按结构的复杂程度分类、按互连结构分类、按可编程特性分类、按可编程器件的编程元件分类2.2主动串行配置式、主动并行配置模式、外设配置模式、从动串行配置模式、菊花链配置模式2.31、编程单元。

查找表型FPGA的编程单元为SRAM结构,可以无限次编程,但它属于易失性元件,掉电后芯片内的信息会丢失;而CPLD则采用EEPROM编程单元,不仅可无限次编程,且掉电后片内的信息不会丢失。

VHDL-16

VHDL-16

组合运算电路的结构设计: 组合运算电路的结构设计:基本单元 从基本逻辑运算考虑, 从基本逻辑运算考虑,运算电路的基本逻辑 单元为半加器和全加器; 单元为半加器和全加器;这些逻辑单元可以 用简单赋值语句实现. 用简单赋值语句实现. 半加器: 半加器:s <= a xor b; c0 <= a and b; 全加器: 全加器:s <= a xor b xor ci; c0 <= (a and b) or (a and ci) or (b and ci);
组合运算模块的VHDL设计 组合运算模块的VHDL设计 VHDL
在硬件逻辑电路中, 在硬件逻辑电路中,实际面对的数据对象总 是逻辑量,能够直接形成的运算是逻辑运算. 是逻辑量,能够直接形成的运算是逻辑运算.
算术运算可以看作是一种抽象的行为描述. 算术运算可以看作是一种抽象的行为描述. 组合运算电路主要包括加法器(adder) 组合运算电路主要包括加法器(adder)和 乘法器(multipliers). 乘法器(multipliers).
组合运算模块的行为设计
entity fir4 is port (x0,x1,x2,x3: in integer; h0,h1,h2,h3: in integer; y: out integer); end fir4; architecture beh of fir4 is begin y<=x3*h0+x2*h1+x1*h2+x0*h3; end beh; 综合结果:需要使用 综合结果:需要使用15800个LUT ! 个
组合运算模块的行为设计
直接利用VHDL中的加法运算和乘法运算可以 直接利用VHDL中的加法运算和乘法运算可以 VHDL integer类型的数据进行运算 类型的数据进行运算. 对integer类型的数据进行运算. 一个4抽头的FIR滤波器的直接实现. FIR滤波器的直接实现 例:一个4抽头的FIR滤波器的直接实现.

利用VHDL设计乘法器

利用VHDL设计乘法器

在计算机结构里加,减,乘,除是常被用到的运算,本文提出以非常高速积体电路硬体描述语言(VHDL)来描述硬体,说明如何将两个运算元作相乘的运算。

我们首先以无号数整数做乘法运算来说明其原理,设计其电路结构。

其实在VHDL 程式中,我们更可以载入STD_LOGIC_ARITH与STD_LOGIC_UNSIGNED元件盒之后,直接进行乘法运算,既简单又容易扩充。

最后,我们将以4-bit X 4-bit的例子来做电路描述、电路合成、电路模拟并以七段显示器将其结果显示出来。

关键字:非常高速积体电路硬体描述语言、电路描述、电路合成、电路模拟Abstract We have known operation that perform addition, subtraction, multiplication, and division. In this paper we are presented primarily to describe hardware using by VHDL. We can explain how multiplication may be performed for two operand. Multiplication of unsigned numbers illustrates the main issues involved in the design of multiplier circuit. In fact, after the STD_LOGIC_ARITH and STD_LOGIC_UNSIGNED packages were added to the VHDL program, it became not only simple but also easy to extended. Next, consider a 4 x 4 example to circuit description, circuit synthesis, and circuit simulation by using VHDL. Finally, this approach can also be displayed by 7-segment.Keyword : VHDL , circuit description , circuit synthesis, circuit simulation利用VHDL 设计乘法器一.简介VHDL是V ery High Speed Integrated Circuit Hardware Description Language 的英文缩写。

VHDL语言与数字系统设计--西电

VHDL语言与数字系统设计--西电

科目:VHDL语言与数字系统EDA设计专业:微电子与固体电子学学生姓名:陈庆宇提交日期: 2011年5月26号目录实验一 (1)实验二 (5)实验三 (9)实验四 (11)实验五 (17)作业 (27)实验一1. 实验内容1. 用IF 语句设计一个四-十六译码器;2. 用CASE 语句设计一个四-十六译码器;3. 用GENERATE 语句构造一个串行的十六进制计数器。

2. 实验目的会用VHDL 语言实现一些简单的组合逻辑和时序逻辑,学会使用相关EDA 软件进行VHDL 代码的输入、仿真。

3. 实验方案本实验有三个小实验组成,先分别将方案分别列出:a :用IF 语句设计一个四-十六译码器接口信号的定义如图--1:g1,g2a ,g2b 为片选信号,sel 为输入 编码,y 为译码输出b :用CASE 语句设计一个四-十六译码器 接口定义同样的如图-1:g1,g2a ,g2b 为片选信号,sel 为输入编码,y 为译码输出c :用GENERATE 语句构造一个串行的十六进制计数器先用行为描述设计一个D 触发器,然后用结构描述的方法将四个D 触发器用特定的接法连接起来。

其中clk 、clr 为时钟和清零输入,q 为计数输出。

4.仿真结果(仿真软件:Quartus II 7.2 )a:用IF语句实现的四-十六译码器的仿真结果上图为:片选信号无效的时候的仿真波形,输出为高电平。

上图为:片选信号有效的时候的仿真波形。

b:用CASE语句实现的一个四-十六译码器的仿真结果(直接让片选有效)c:用GENERATE语句构造的串行的十六进制计数器的仿真波形注:当clr为0时对计数结果清零,时钟上升沿计数器加1.5.关键部分代码a:用IF语句设计一个四-十六译码器PROCESS(G1,g2a,g2b,sel)beginif(g1='1'and g2a='0'and g2b='0')thenif(sel="0000")then y<="1111111111111110";elsif(sel="0001")then y<="1111111111111101";elsif(sel="0010")then y<="1111111111111011";elsif(sel="0011")then y<="1111111111110111";elsif(sel="0100")then y<="1111111111101111";elsif(sel="0101")then y<="1111111111011111";elsif(sel="0110")then y<="1111111110111111";elsif(sel="0111")then y<="1111111101111111";elsif(sel="1000")then y<="1111111011111111";elsif(sel="1001")then y<="1111110111111111";elsif(sel="1010")then y<="1111101111111111";elsif(sel="1011")then y<="1111011111111111";elsif(sel="1100")then y<="1110111111111111";elsif(sel="1101")then y<="1101111111111111";elsif(sel="1110")then y<="1011111111111111";elsif(sel="1111")then y<="0111111111111111";else y<="XXXXXXXXXXXXXXXX";end if;else Y<="1111111111111111";end if;end process;b:用CASE语句设计一个四-十六译码器case sel iswhen "0000"=>y<="1111111111111110";when "0001"=>y<="1111111111111101";when "0010"=>y<="1111111111111011";when "0011"=>y<="1111111111110111";when "0100"=>y<="1111111111101111";when "0101"=>y<="1111111111011111";when "0110"=>y<="1111111110111111";when "0111"=>y<="1111111101111111";when "1000"=>y<="1111111011111111";when "1001"=>y<="1111110111111111";when "1010"=>y<="1111101111111111";when "1011"=>y<="1111011111111111";when "1100"=>y<="1110111111111111";when "1101"=>y<="1101111111111111";when "1110"=>y<="1011111111111111";when "1111"=>y<="0111111111111111";when others =>y<="XXXXXXXXXXXXXXXX";end case;c:用GENERATE语句构造一个串行的十六进制计数器architecture count16er of count16 iscomponent dfip isport(d:in std_logic;clr:in std_logic;ck:in std_logic;q:out std_logic;qb:out std_logic);end component;signal clk_in:std_logic_vector(4 downto 0);beginclk_in(0)<=clk;G1:for i in 0 to 3 generateU0:dfip port map(d=>clk_in(i+1),ck=>clk_in(i),clr=>clr,q=>q(i),qb=>clk_in(i+1));end generate;end count16er;实验二1. 实验内容1. 设计一个两位二进制的加法器2. 设计一个两位的BCD 计数器2. 实验目的会用VHDL 语言的多种描述方式实现典型的组合逻辑和时序逻辑,学会使用相关EDA 软件进行VHDL 代码的输入、仿真。

vhdl实验报告_16乘16点阵_字选

vhdl实验报告_16乘16点阵_字选

综合实践总结报告综合实践名称: EDA技术与实践综合实践地点、时间题目功能分析和设计实验的要求有如下三点:1.用16*16点阵的发光二极管显示字符;2.可显示字符为0~9的数字字符与A~F英文字母的大写;3.输入为四位二进制矢量;按照要求可知,LED点阵模块,共由16×16=256个LED发光二极管组成,如何在该点阵模块上显示数字和字母是本实验的关键。

先将要显示的每一幅图像画在一个16×16共256个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,无笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形框上的分布以数字8为例,点阵分布为:0000000000000000000000000000000000011111111110000001111111111000000110000001100000011000000110000001100000011000000111111111100000011111111110000001100000011000000110000001100000011000000110000001111111111000000111111111100000000000000000000000000000000000考虑到实际物理实验平台上点阵发光二极管的原理,以下为16×16点阵LED外观图,只要其对应的X、Y轴顺向偏压,即可使LED 发亮。

例如如果想使左上角LED点亮,则Y0=1,X0=0即可。

所以我采用行列扫描的方法,用四位二进制数做列选信号(总共16列),如选中第一列,则扫描第一列之中哪些行是高电平(1),哪些行是低电平(0);为高电平的则点亮,为低电平的不亮。

(列信号都接地)。

如此,列选信号由“0000”变到“1111”时,16列扫描完毕,一个字也就出来了,列选信号重新由“0000”开始扫描。

注意扫描频率必须要足够快,才能保证显示一个数字或字母时所有灯在肉眼看来是同时在闪烁的。

EDA用VHDL语言设计一个2-4译码器

EDA用VHDL语言设计一个2-4译码器

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY decoder2_to_4_t ISPORT(sel:IN STD_LOGIC_VECTOR(1 DOWNTO 0);sel00,sel01,sel10,sel11:OUT STD_LOGIC);END ENTITY decoder2_to_4_t;ARCHITECTURE dec OF decoder2_to_4_t ISBEGINPROCESS(sel)BEGINCASE sel ISWHEN "00"=>sel00<='1';sel01<='0';sel10<='0';sel11<='0'; WHEN "01"=>sel00<='0';sel01<='1';sel10<='0';sel11<='0'; WHEN "10"=>sel00<='0';sel01<='0';sel10<='1';sel11<='0'; WHEN "11"=>sel00<='0';sel01<='0';sel10<='0';sel11<='1'; WHEN OTHERS=>NULL;END CASE;END PROCESS;END ARCHITECTURE dec;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DECL7S ISPORT (A :IN STD_LOGIC_VECTOR (3 DOWNTO 0);LED7S:OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );END;ARCHITECTURE one OF DECL7S ISBEGINPROCESS (A)BEGINCASE A ISWHEN "0000"=> LED7S<="00111111";WHEN "0001"=> LED7S<="00000110";WHEN "0010"=> LED7S<="01011011";WHEN "0011"=> LED7S<="01001111";WHEN "0100"=> LED7S<="01100110";WHEN "0101"=> LED7S<="01101101";WHEN "0110"=> LED7S<="01111101";WHEN "0111"=> LED7S<="00000111";WHEN "1000"=> LED7S<="01111111";WHEN "1001"=> LED7S<="01101111";WHEN "1010"=> LED7S<="01110111";WHEN "1011"=> LED7S<="01111100";WHEN "1100"=> LED7S<="00111001";WHEN "1101"=> LED7S<="01011110";WHEN "1110"=> LED7S<="01111001"; WHEN "1111"=> LED7S<="01110001"; WHEN OTHERS=> NULL;END CASE;END PROCESS;END;。

EDA实验报告(两位十六进制计数器)

EDA实验报告(两位十六进制计数器)

EDA实验报告(两位十六进制计数器)计算机09-3班郑秀枫 09081311实验二两位十六进制计数器一、实验目的1、继续熟悉Quartus环境2、熟练掌握VHDL语言设计流程3、了解Verilog语言的基本使用4、熟悉DE2开发板上的时钟信号就LED显示器的使用二、实验任务1、完成第三章最后的实例,用7段数码管显示两位16进制数,clk输入用FPGA上的50M信号2、用Verilog HDL实现SW输入4位二进制数,用7段数码管按十进制显示输出同时用LED灯显示三、实验步骤1、用VHDL实现两位16进制计数器(1)新建VHDL源文件,命名为cn4e.vhd,设计实现一位16进制计数器,其代码如图2-1所示。

计算机09-3班郑秀枫 09081311图2-1 图2-2(2)新建VHDL源文件,命名为vhdl2s,设计实现七段数码管译码器,其代码如图2-2所示(3)新建VHDL源文件,命名为fenpin,设计实现分频电路,将输入的50MHz的时钟信号变为1Hz的时钟信号,其代码如图2-3所示图2-3 图2-4(4)新建VHDL源文件,命名为my_pkg,将上三步实现的原件例化到my_pkg程序包中,方便以后使用,其代码如图2-4所示。

(5)新建VHDL源文件,命名为counter16,利用已经例化的三个原件实现两位16进制计数器及输出到七段数码管显示的电路(如图2-5),保存后将其设置为顶层文件,编译查看是否有错误。

图2-5(6)新建波形文件,赋予每个输入端口某种输入信号,保存波形文件,进行功能仿真,观察输出端波形与输入信号关系是否正确。

若不正确,查找问题所在并解决问题;若正确,则进行管脚分配,分配完毕后再编译一次使分配生效,连接DE2开发板到电脑,将文件下载到开发板计算机09-3班郑秀枫 09081311进行验证。

2、用Verilog实现十进制数显示(1)新建Verilog源文件,实现SW输入4位二进制数,用7段数码管按十进制显示输出同时用LED灯显示,代码如图2-6所示图2-6(2)编译成功后,新建波形文件,赋予每个输入端口某种输入信号,保存波形文件,进行功能仿真,观察输出端波形与输入信号关系是否正确。

16位双译码器的VHDL实现

16位双译码器的VHDL实现

16位双译码器的VHDL实现软件:Quartus ii 8.1设计思路:先设计一个2-4译码器,在2-4译码器的基础上设计一个8-256双译码器,然后在8-256双译码器的基础上设计出16-65536双译码器。

双译码器需要与门阵列,而且与门阵列的设计才是此次设计的难点。

为简化设计,与门阵列单独设计,本文先设计了4*4的与门阵列,然后将4*4的与门阵列扩展成4*16的与门阵列,然后又将4*16的与门阵列扩展成16*16的与门阵列,然后又将16*16的与门阵列扩展成了16*256的与门阵列,最后又将16*256的与门阵列扩展成了256*256的与门阵列。

首先,先设计一个2-4译码器,代码如下:library ieee;use ieee.std_logic_1164.all;entity decoder2to4 isport(en:in std_logic;x:in std_logic_vector(1 downto 0);y:out std_logic_vector(3 downto 0));end decoder2to4;architecture rtl of decoder2to4 isbeginprocess(en,x)beginif(en='1')thencase x iswhen "00" => y<="0001";when "01" => y<="0010";when "10" => y<="0100";when "11" => y<="1000";when others => y<="0000";end case;elsey<="0000";end if;end process;end rtl;由2-4译码器扩展得到4-16双译码器需要用到4*4的与门阵列,所以需要设计一个4*4的与门阵列,代码如下:library ieee;use ieee.std_logic_1164.all;entity and4mul4 isport(x:in std_logic_vector(3 downto 0);y:in std_logic_vector(3 downto 0);z:out std_logic_vector(15 downto 0));end and4mul4;architecture structure of and4mul4 is component and2to1port(a,b: in std_logic;y: out std_logic);end component;beging1:for i in 3 downto 0 generateu1:and2to1 port map (x(0),y(i),z(i));end generate;g2:for i in 3 downto 0 generateu2:and2to1 port map (x(1),y(i),z(4+i));end generate;g3:for i in 3 downto 0 generateu3:and2to1 port map (x(2),y(i),z(8+i));end generate;g4:for i in 3 downto 0 generateu4:and2to1 port map (x(3),y(i),z(12+i));end generate;end structure;其中,与门and2to1的代码如下:library ieee;use ieee.std_logic_1164.all;entity and2to1 isport(a,b: in std_logic;y: out std_logic);end and2to1;architecture rtl of and2to1 isbeginprocess(a,b)variable comb : std_logic_vector(1 downto 0);begincomb := a & b;case comb iswhen "00" => y <= '0';when "01" => y <= '0';when "10" => y <= '0';when "11" => y <= '1';when others => y <= 'X';end case;end process;end rtl;由2-4译码器及4*4的与门阵列,扩展成4-16双译码器,代码如下:library ieee;use ieee.std_logic_1164.all;entity dec4to16 isport(en:in std_logic;x:in std_logic_vector(1 downto 0);y:in std_logic_vector(1 downto 0);z:out std_logic_vector(15 downto 0));end dec4to16;architecture structure of dec4to16 iscomponent decoder2to4port(en:in std_logic;x:in std_logic_vector(1 downto 0);y:out std_logic_vector(3 downto 0));end component;component and4mul4port(x:in std_logic_vector(3 downto 0);y:in std_logic_vector(3 downto 0);z:out std_logic_vector(15 downto 0));end component;signal c1:std_logic_vector(3 downto 0);signal c2:std_logic_vector(3 downto 0);beginu1:decoder2to4 port map(en,x,c1);u2:decoder2to4 port map(en,y,c2);u3:and4mul4 port map(c1,c2,z);end structure;然后,为了将4-16双译码器扩展成8-256双译码器,需要16*16的与门阵列。

用VerilogHDL设计2位16进制计数器

用VerilogHDL设计2位16进制计数器

基于FPGA的系统设计与应用实验二计数器设计实验、实验目的:学习计数器的设计、仿真和硬件测试方法。

二、实验内容及步骤:1. 用Verilog HDL设计2位16进制计数器,由DE2的KEYo输入计数值,在HEXI,HEX0上显示计数值。

2. 使用嵌入式逻辑分析仪进行仿真;3. 将实验程序下载到DE2运行。

实验注意事项:去抖动三、程序代码module Iib22(out1,out2,clk,rst,key);OutPut [6:0] out1,out2;input clk,rst;input key;reg [19:0]count;reg [7:0]in;reg [6:0]out1,out2;reg C,K;reg [9:0] r1;always@(POSedge clk)if(count==20'd5000)beginC=〜C;COuntV=1'b0;endelseCOUnt=Count+1'b1;always @ (POSedge C)beginif(r1<10'd1000)beginK<=1'bO;r1<=r1+1'b1;endelsebeginK<=1'b1;r1<=1'b0;endendalways @ (POSedge C,negedge rst)if(!rst)in<=1'bθ;else if(!K)beginin=in+8'b1;endalways @ (in[3:0])case(in[3:0])4'b0000:out1=7'b1000000;4'b0001:Out 仁7'b1111001;4'b0010:out1=7'b0100100;4'b0011:out 仁7'b0110000;4'b0100:out1=7'b0011001;4'b0101:out 仁7'b0010010;4'b0110:out1=7'b0000010;4'b0111:out 仁7'b1011000;4'b1000:out 仁7'b0000000;4'b1001:out 仁7'b0010000;4'b1010:out1=7'b0001000;4'b1011:out1=7'b0000011;4'b1100:out 仁7'b1000110;4'b1101:out1=7'b1100001;4'b1110:out1=7'b0000110;4'b1111:out1=7'b0001110;default:out1=7'b1111111;endcasealways @ (in[7:4])case(in[7:4])4'b0000:out2=7'b1000000;4'b0001:out2=7'b1111001;4'b0010:out2=7'b0100100;4'b0011:out2=7'b0110000;4'b0100:out2=7'b0011001;4'b0101:out2=7'b0010010;4'b0110:out2=7'b0000010;4'b0111:out2=7'b1011000;4'b1000:out2=7'b0000000;4'b1001:out2=7'b0010000;4'b1010:out2=7'b0001000;4'b1011:out2=7'b0000011;4'b1100:out2=7'b1000110;4'b1101:out2=7'b1100001;4'b1110:out2=7'b0000110;4'b1111:out2=7'b0001110;default:out2=7'b1111111;endcaseendmodule四、实验原理图:DE2按键电路图五、实验总结与分析:1. 不加去斗时,出现的结果不稳定,不同的DE2板子结果不一样,在加上去斗时,实验结果很稳定;2. 去斗可以是检测抖动阶段也可以是不抖动阶段;3. 实验二包含了实验一的一些内容,例如数码管的显示, 但是加了去抖动程序,使结果更加的稳定。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 18:25:21 04/15/2013
-- Design Name:
-- Module Name: FOUR - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity FOUR is
Port ( a : in STD_LOGIC;
b : in STD_LOGIC;
c : in STD_LOGIC;
d : in STD_LOGIC;
DOUT : out std_logic_vector(3 downto 0));
end FOUR;
architecture Behavioral of FOUR is
signal DIN :STD_LOGIC_VECTOR(3 DOWNTO 0);
signal y : std_logic_vector(16 downto 0);
begin
DIN <= A & B & C & D;
process (A,B,C,D)
begin
case DIN is
when "0000" => y(0) <= '0';
when "0001" => y(1) <= '0';
when "0010" => y(2) <= '0';
when "0011" => y(3) <= '0';
when "0100" => y(4) <= '0';
when "0101" => y(5) <= '0';
when "0110" => y(6) <= '0';
when "0111" => y(7) <= '0';
when "1000" => y(8) <= '0';
when "1001" => y(9) <= '0';
when "1010" => y(10) <= '0';
when "1011" => y(11) <= '0';
when "1100" => y(12) <= '0';
when "1101" => y(13) <= '0';
when "1110" => y(14) <= '0';
when "1111" => y(15) <= '0';
when others => y(16) <= '0';
end case ;
end process;
DIN(3)<=not(y(15));
DIN(2)<=not(y(10) and y(11) and y(14));
DIN(1)<=not(y(6) and y(7) and y(9)and y(11) and y(13) and y(14)); DIN(0)<=not(y(5)and y(7) and y(13) and y(15));
end Behavioral;。

相关文档
最新文档