当前位置:文档之家› VHDL实验报告

VHDL实验报告

VHDL实验报告
VHDL实验报告

年月日

VHDL实验报告

学院

专业

学号

姓名

实验1 译码器设计

一、实验原理

1、译码器是数字系统中常用的组合逻辑电路,常用于地址译码。74LS138是最常用的一种小规模集成电路,它有3

个二进制输入端和8个译码输出端。表1.1是它的真值表。

表1.1 3-8 译码器真值表

2、普通的LED数码管由7段和一个点组成,使用它进行显示,需要译码驱动。本实验实现一个七段LED显示译码电

路。为了实验方便,在译码之前加入一个4位二进制加法计数器,当低频率的脉冲信号输入计数器后,由7段译码器将计数值译为对应的十进制码,并由数码管显示出来。图1.1为此电路的原理图。

图1.1 7段LED译码显示电路

二、实验内容

1、设计一个4-16译码器。

2、设计轮流显示表1.2所示字符的程序。

表1.2 字母显示真值表

4、下载、验证设计的正确性。

三、源程序

1、4-16译码器。

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY decode IS

PORT( d0, d1, d2,d3, s1 ,s2 ,s3:IN STD_LOGIC;

Y : OUT STD_LOGIC_VECTOR ( 15 DOWNTO 0 ) );

END decode;

ARCHITECTURE rtl OF decode IS

SIGNAL indata : STD_LOGIC_VECTOR ( 3 DOWNTO 0 );

BEGIN

Indata <= d3 & d2 & d1 & d0 ;

PROCESS ( indata, s1, s2, s3 )

BEGIN

IF (s1 ='1' AND s2='0' AND s3 = '0' ) THEN

CASE indata IS

WHEN "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=> NULL;

END CASE;

ELSE

Y <= "1111111111111111" ;

END IF;

END PROCESS;

END rtl;

2、轮流显示表1.2所示字符的程序。

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY decled IS

END DECLED;

ARCHITECTURE behav OF decled IS

TYPE states IS(st0,st1,st2,st3,st4,st5,st6,st7,st8);

SIGNAL current_state,next_state:states;

BEGIN

PROCESS(clk)

BEGIN

IF clk'EVENT AND clk = '1' THEN

current_state<=next_state;

END IF;

END PROCESS;

PROCESS(current_state)

BEGIN

CASE current_state IS

WHEN st0 => next_state<=st1;DOUT <= "1110111"; -- 显示A

WHEN st1 => next_state<=st2;DOUT <= "0011111"; -- 显示B

WHEN st2 => next_state<=st3;DOUT <= "1001110"; -- 显示C

WHEN st3 => next_state<=st4;DOUT <= "0111101"; -- 显示D

WHEN st4 => next_state<=st5;DOUT <= "1001111"; -- 显示E

WHEN st5 => next_state<=st6;DOUT <= "1000111"; -- 显示F

WHEN st6 => next_state<=st7;DOUT <= "0110111"; -- 显示H

WHEN st7 => next_state<=st8;DOUT <= "1100111"; -- 显示P

WHEN st8 => next_state<=st0;DOUT <= "0001110"; -- 显示L

WHEN OTHERS => DOUT <=NULL;

END CASE;

END PROCESS;

END behav;

四、仿真分析和结论

1、4-16译码器。

2、轮流显示表1.2所示字符的程序。

分析和结论:将仿真波形与表1.2对应观察可看出,随着clk的上升沿的到来,输出端循环依次输出表1.2中的七段码。

实验2 加法器设计

一、实验原理

加法器是数字系统中的基本逻辑器件,多位加法器的构成有两种方式:并行进位和串行进位方式。并行进位加法器设有并行进位产生逻辑,运算速度较快;串行进位方式是将全加器级联构成多位加法器。并行进位加法器通常比串行级联加法器占用更多的资源,随着位数的增加,相同位数的并行加法器与串行加法器的资源占用差距快速增大。因此,在工程中使用加法器时,要在速度和容量之间寻找平衡。

表1.4是一位全加器的真值表,通过串行级联的方法可以构成多位全加器。

表1.4 一位全加法器的真值表

布尔表达式为:

S= A⊕B⊕CI (⊕:代表异或运算)

CO = AB+ACI+BCI (+:代表或运算)

二实验内容

1、设计一位全加器。

2、利用一位全加器和结构描述方法设计如图1.3所示的四位全加器。

3、利用两个4位全加器级联构成一个8位全加器。

图1.3 四位全加器电路原理图三、源程序及仿真波形

----------定义1位全加器--------------

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY adder1b IS

PORT ( a, b,ci: IN STD_LOGIC;

s, co: OUT STD_LOGIC );

END adder1b ;

ARCHITECTURE behav of adder1b IS

BEGIN

s<= a XOR b XOR ci ;

co <= (a AND b) OR ( a AND ci ) OR ( b AND ci ) ;

END behav ;

-----------定义4位全加器------------

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY adder4b IS

PORT ( an, bn : IN STD_LOGIC_VECTOR (3 DOWNTO 0 );

cin : IN STD_LOGIC;

con: OUT STD_LOGIC;

sn: OUT STD_LOGIC_VECTOR (3 DOWNTO 0 )); END adder4b ;

ARCHITECTURE full1 of adder4b IS

COMPONENT adder1b IS

PORT ( a, b ,ci: IN STD_LOGIC ;

s, co: OUT STD_LOGIC) ;

END COMPONENT ;

SIGNAL u0_co, u1_co, u2_co,u3_co : STD_LOGIC;

BEGIN

U0 : adder1b PORT MAP (an(0), bn(0), cin, sn(0), u0_co );

U1 : adder1b PORT MAP (an(1), bn(1), u0_co,sn(1), u1_co );

U2 : adder1b PORT MAP (an(2), bn(2), u1_co,sn(2), u2_co );

U3 : adder1b PORT MAP (an(3), bn(3), u2_co,sn(3), con ); END full1 ;

四、仿真分析和结论

分析和结论:从仿真波形中可看出

ain (被加数)+bin (加数)+ciin (来自低位的进位)=son (和)+coon (向高位的进位)

0 + 0 + 0 = 0 + 0 1 + 1 + 0 = 1 + 0 0 + 0 + 1 = 1 + 0 1 + 1 + 1 = 3 + 0

128 + 128 + 0 = 0 + 1 192 + 192 + 0 = 128 + 1 128 + 128 + 1 = 1 + 1 192 + 192 + 1 = 129 + 1

即实现了8位全加器的功能。

实验3 乘法器设计

一、实验原理

的和相加;若为0,左移后以全零相加,直至被乘数的最高位。其算法如图1.4所示,其中M4M3M2M1为被乘数(M), N4N3N2N1为乘数(N)。可以看出被乘数M 的每一位都要与乘数N 相乘,获得不同的积,如M1×N 、M2×N …,位积之间以及位积与部分乘法之和相加时需要按照高低位对齐,并行相加才可以得到正确的结果。

这种算法可以采用纯组合逻辑来实现,其特点是:设计思路简单直观、电路运算速度快,缺点是使用逻辑资源较多。

另一种方法是由8

位加法器构成的以时序逻辑方式设计的8位乘法器,其原理如图1.5所示。

在图1.5中,ARICTL 是乘法运算控制电路,它的START 信号的上跳沿与高电平有两个功能,即16位寄存器清

零和被乘数A[7…0]向移位寄存器SREG8B 加载;它的低电平则作为乘法使能信号。乘法时钟信号从ARICTL 的CLK 输入。当被乘数被加载于8位右移寄存器SREG8B 后,随着每一时钟节拍,最低位在前,由低位至高位逐位移出。当为1时,与门ANDARITH 打开,8位乘数B[7…0]在同一节拍进入8位加法器ADDER8B ,与上一次锁存在16位锁存器REG16B 中的高8位进行相加,其和在下一时钟节拍的上升沿被锁进此锁存器。而当被乘数的移出位为0时,与门全零输出。如此往复,直至8个时钟脉冲后,由ARICTL 的控制,乘法运算过程自动中止,ARIEND 输出高电平,以此可点亮一发光管,以示乘法结束。此时REG16B 的输出值即为最后乘积。

此乘法器的优点是节省芯片资源,它的核心元件只是一个8位加法器,其运算速度取决于输入的时钟频率。若时钟频率为100MHz ,则每一运算周期仅需80ns 。而若利用12 MHz 晶振的MCS-51单片机的乘法指令,进行8位乘法运算,仅单指令的运算周期长达4μs 。因此可以利用此乘法器,或相同原理构成的更高位乘法器完成一些数字信号处理方面的运算。

二 实验内容

1、 利用图1.5的工作原理设计一个8×8的乘法器。

2、 仿真、下载验证设计的正确性。 三、源程序及仿真波形

图1.4 并行乘法原理

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY ADDER4B IS --4位加法器

PORT (

CIN : IN STD_LOGIC;

A : IN STD_LOGIC_VECTOR(3 DOWNTO 0);

B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);

S : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

COUT : OUT STD_LOGIC

);

END ADDER4B;

ARCHITECTURE behav OF ADDER4B IS

SIGNAL SINT : STD_LOGIC_VECTOR(4 DOWNTO 0);

SIGNAL AA,BB : STD_LOGIC_VECTOR(4 DOWNTO 0);

BEGIN

AA<='0'&A;

BB<='0'&B;

SINT <= AA + BB + CIN;

S <= SINT(3 DOWNTO 0);

COUT <= SINT(4);

END behav;

------模块2------8位加法器

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY ADDER8B IS --8位加法器

PORT ( CIN : IN STD_LOGIC;

A : IN STD_LOGIC_VECTOR(7 DOWNTO 0);

B : IN STD_LOGIC_VECTOR(7 DOWNTO 0);

S : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

COUT : OUT STD_LOGIC );

END ADDER8B;

ARCHITECTURE struc OF ADDER8B IS

COMPONENT ADDER4B

PORT ( CIN : IN STD_LOGIC;

A : IN STD_LOGIC_VECTOR(3 DOWNTO 0);

B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);

S : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

COUT : OUT STD_LOGIC );

END COMPONENT;

SIGNAL CARRY_OUT : STD_LOGIC;

BEGIN

U1 : ADDER4B -- 例化(安装)1个4位二进制加法器U1 PORT MAP ( CIN => CIN, A => A(3 DOWNTO 0),B => B(3 DOWNTO 0),

PORT MAP ( CIN => CARRY_OUT, A => A(7 DOWNTO 4),B => B(7 DOWNTO 4), S => S(7 DOWNTO 4),COUT => COUT );

END struc;

------模块3------选通与门模块ANDARITH

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY ANDARITH IS -- 选通与门模块

PORT ( ABIN : IN STD_LOGIC;

DIN : IN STD_LOGIC_VECTOR(7 DOWNTO 0);

DOUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );

END ANDARITH;

ARCHITECTURE behav OF ANDARITH IS

BEGIN

PROCESS(ABIN, DIN)

BEGIN

FOR I IN 0 TO 7 LOOP -- 循环,完成8位与1位运算 DOUT(I) <= DIN(I) AND ABIN;

END LOOP;

END PROCESS;

END behav;

------模块4------乘法运算控制电路ARICTL

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY ARICTL IS

PORT (

CLK : IN STD_LOGIC;

START : IN STD_LOGIC;

CLKOUT : OUT STD_LOGIC;

RST : OUT STD_LOGIC;

ARIEND : OUT STD_LOGIC

);

END ARICTL;

ARCHITECTURE behav OF ARICTL IS

SIGNAL CNT4B : STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

PROCESS(CLK, START)

BEGIN

RST <= START;

IF START = '1' THEN

CNT4B <= "0000";

ELSIF CLK'EVENT AND CLK = '1' THEN

IF CNT4B < 8 THEN

CNT4B <= CNT4B + 1;

END IF;

PROCESS(CLK, CNT4B, START)

BEGIN

IF START = '0' THEN

IF CNT4B < 8 THEN

CLKOUT <= CLK;

ARIEND <= '0';

ELSE

CLKOUT <= '0';

ARIEND <= '1';

END IF;

ELSE

CLKOUT <= CLK;

ARIEND <= '0';

END IF;

END PROCESS;

END behav;

------模块5------16位锁存器

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY REG16B IS -- 16位锁存器

PORT (

CLK : IN STD_LOGIC;

CLR : IN STD_LOGIC;

D : IN STD_LOGIC_VECTOR(8 DOWNTO 0);

Q : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)

);

END REG16B;

ARCHITECTURE behav OF REG16B IS

SIGNAL R16S : STD_LOGIC_VECTOR(15 DOWNTO 0);

BEGIN

PROCESS(CLK, CLR)

BEGIN

IF CLR = '1' THEN -- 清零信号

R16S <= "0000000000000000";-- 时钟到来时,锁存输入值,并右移低8位 ELSIF CLK'EVENT AND CLK = '1' THEN

R16S(6 DOWNTO 0) <= R16S(7 DOWNTO 1); -- 右移低8位

R16S(15 DOWNTO 7) <= D; -- 将输入锁到高8位 END IF;

END PROCESS;

Q <= R16S;

END behav;

------模块6------8位右移寄存器

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY SREG8B IS -- 8位右移寄存器

QB : OUT STD_LOGIC );

END SREG8B;

ARCHITECTURE behav OF SREG8B IS

SIGNAL REG8 : STD_LOGIC_VECTOR(7 DOWNTO 0);

BEGIN

PROCESS (CLK, LOAD)

BEGIN

IF CLK'EVENT AND CLK = '1' THEN

IF LOAD = '1' THEN -- 装载新数据

REG8 <= DIN;

ELSE -- 数据右移

REG8(6 DOWNTO 0) <= REG8(7 DOWNTO 1);

END IF;

END IF;

END PROCESS;

QB <= REG8(0); -- 输出最低位

END behav;

------------8位乘法器顶层设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY MULTI8X8 IS -- 8位乘法器顶层设计 PORT ( CLKK: IN STD_LOGIC;

START : IN STD_LOGIC;

A : IN STD_LOGIC_VECTOR(7 DOWNTO 0);

B : IN STD_LOGIC_VECTOR(7 DOWNTO 0);

--MMAX : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

ARIEND : OUT STD_LOGIC;

DOUT : OUT STD_LOGIC_VECTOR(15 DOWNTO 0) );

END MULTI8X8;

ARCHITECTURE struc OF MULTI8X8 IS

COMPONENT ARICTL

PORT ( CLK : IN STD_LOGIC; START : IN STD_LOGIC;

CLKOUT : OUT STD_LOGIC; RST : OUT STD_LOGIC;

ARIEND : OUT STD_LOGIC );

END COMPONENT;

COMPONENT ANDARITH

PORT ( ABIN : IN STD_LOGIC;

DIN : IN STD_LOGIC_VECTOR(7 DOWNTO 0);

DOUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );

END COMPONENT;

COMPONENT ADDER8B

PORT ( CIN : IN STD_LOGIC;

A : IN STD_LOGIC_VECTOR(7 DOWNTO 0);

B : IN STD_LOGIC_VECTOR(7 DOWNTO 0);

END COMPONENT;

COMPONENT SREG8B

PORT ( CLK : IN STD_LOGIC; LOAD : IN STD_LOGIC;

DIN : IN STD_LOGIC_VECTOR(7 DOWNTO 0);

QB : OUT STD_LOGIC );

END COMPONENT;

COMPONENT REG16B

PORT ( CLK : IN STD_LOGIC; CLR : IN STD_LOGIC;

D : IN STD_LOGIC_VECTOR(8 DOWNTO 0);

Q : OUT STD_LOGIC_VECTOR(15 DOWNTO 0) );

END COMPONENT;

SIGNAL GNDINT : STD_LOGIC;

SIGNAL INTCLK : STD_LOGIC;

SIGNAL RST : STD_LOGIC;

--SIGNAL NEWSTART : STD_LOGIC;

SIGNAL QB: STD_LOGIC;

SIGNAL ANDSD : STD_LOGIC_VECTOR(7 DOWNTO 0);

--SIGNAL count,maxx : STD_LOGIC_VECTOR(3 DOWNTO 0);

SIGNAL DTBIN : STD_LOGIC_VECTOR(8 DOWNTO 0);

SIGNAL DTBOUT : STD_LOGIC_VECTOR(15 DOWNTO 0);

BEGIN

DOUT <= DTBOUT;

GNDINT <= '0';

U1 : ARICTL PORT MAP(CLK => CLKK, START => START,

CLKOUT => INTCLK, RST => RST, ARIEND => ARIEND );

U2 : SREG8B PORT MAP( CLK => INTCLK, LOAD => RST,

DIN => B, QB => QB );

U3 : ANDARITH PORT MAP(ABIN => QB, DIN => A,DOUT => ANDSD);

U4 : ADDER8B PORT MAP(CIN => GNDINT,

A => DTBOUT(15 DOWNTO 8),

B => ANDSD,

S => DTBIN(7 DOWNTO 0), COUT => DTBIN(8) );

U5 : REG16B PORT MAP(CLK => INTCLK, CLR => RST,

D => DTBIN, Q => DTBOUT );

END struc;

四、仿真分析和结论

分析和结论:从START的高电平出现开始计算乘法,第八个时钟信号(CLKK)的高电平到来时,输出端DOUT 输出积,如图上4×8=32和68×8=544.

因为此电路是通过将乘数逐项移位相加的原理来实现相乘,故在CLKK未到第八个高电平时,DOUT输出512,256,128,64这些32的倍数的数字,最后输出真正的积32。

实验4 “梁祝”音乐演奏电路设计(任选实验)

一、源程序

--------顶层设计--------

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY Songer IS -----top design----

PORT (

CLK12MHz : IN STD_LOGIC;

CLK8HZ : IN STD_LOGIC;

CODE1:OUT INTEGER RANGE 0 TO 15;

HIGH1:OUT STD_LOGIC;

SPKOUT:OUT STD_LOGIC );

END Songer;

ARCHITECTURE behav OF Songer IS

COMPONENT NoteTabs

PORT (clk: IN STD_LOGIC;

ToneIndex:OUT INTEGER RANGE 0 TO 15 );

END COMPONENT;

COMPONENT ToneTaba

PORT (Index: IN INTEGER RANGE 0 TO 15;

CODE:OUT INTEGER RANGE 0 TO 15;

HIGH:OUT STD_LOGIC;

Tone:OUT INTEGER RANGE 0 TO 16#7FF#);

END COMPONENT;

COMPONENT Speakera

PORT (clk: IN STD_LOGIC;

Tone:IN INTEGER RANGE 0 TO 16#7FF#;

SpkS:OUT STD_LOGIC);

END COMPONENT;

SIGNAL Tone:INTEGER RANGE 0 TO 16#7FF#;

SIGNAL ToneIndex: INTEGER RANGE 0 TO 15;

BEGIN

u1:NoteTabs PORT MAP(clk=>CLK8HZ,ToneIndex=>ToneIndex);

u2:ToneTaba PORT MAP(Index=>ToneIndex,Tone=>Tone,CODE=>CODE1,HIGH=>HIGH1);

u3:Speakera PORT MAP(clk=>CLK12MHZ,Tone=>Tone,SpkS=>SPKOUT);

END;

--------乐曲简谱码对应的分频预置数查表电路--------

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

CODE:OUT INTEGER RANGE 0 TO 15;

HIGH:OUT STD_LOGIC;

Tone:OUT INTEGER RANGE 0 TO 16#7FF#);

END;

ARCHITECTURE one OF ToneTaba IS

BEGIN

Search:PROCESS(Index)

BEGIN

CASE Index IS

WHEN 0=>Tone<=2047;CODE<=0;HIGH<='0';

WHEN 1=>Tone<=773;CODE<=1;HIGH<='0';

WHEN 2=>Tone<=2047;CODE<=2;HIGH<='0';

WHEN 3=>Tone<=2047;CODE<=3;HIGH<='0';

WHEN 5=>Tone<=2047;CODE<=5;HIGH<='0';

WHEN 6=>Tone<=2047;CODE<=6;HIGH<='0';

WHEN 7=>Tone<=2047;CODE<=7;HIGH<='0';

WHEN 8=>Tone<=2047;CODE<=1;HIGH<='1';

WHEN 9=>Tone<=2047;CODE<=2;HIGH<='1';

WHEN 10=>Tone<=2047;CODE<=3;HIGH<='1';

WHEN 12=>Tone<=2047;CODE<=5;HIGH<='1';

WHEN 13=>Tone<=2047;CODE<=6;HIGH<='1';

WHEN 15=>Tone<=2047;CODE<=1;HIGH<='1';

WHEN OTHERS=>NULL;

END CASE;

END PROCESS;

END;

--------数控分频与演奏发生器--------

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY Speakera IS

PORT(clk:IN STD_LOGIC;

Tone:IN INTEGER RANGE 0 TO 16#7FF#;

SpkS:OUT STD_LOGIC);

END;

ARCHITECTURE one OF Speakera IS

SIGNAL PreCLK:STD_LOGIC;

SIGNAL FullSpkS:STD_LOGIC;

BEGIN

DivideCLK:PROCESS(clk)

V ARIABLE Count4:INTEGER RANGE 0 TO 15;

BEGIN

PreCLK<='0';

IF Count4>11 THEN PreCLK<='1';Count4:=0;

ELSIF clk'EVENT AND clk='1' THEN Count4:=Count4+1; END IF;

END PROCESS;

IF PreCLK'EVENT AND PreCLK='1'THEN

IF Count11=16#7FF# THEN

Count11:=Tone;

FullSpkS<='1';

ELSE Count11:=Count11+1;

FullSpkS<='0';END IF;

END IF;

END PROCESS;

DelaySpkS:PROCESS(FullSpkS)

V ARIABLE Count2:STD_LOGIC;

BEGIN

IF FullSpkS'EVENT AND FullSpkS='1'THEN

Count2:=NOT Count2;

IF Count2='1'THEN SpkS<='1';

ELSE SpkS<='0';END IF;

END IF;

END PROCESS;

END;

--------音乐节拍和音调发生器--------

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY NoteTabs IS -----top design----

PORT (clk: IN STD_LOGIC;

ToneIndex:OUT INTEGER RANGE 0 TO 15 ); END ;

ARCHITECTURE one OF NoteTabs IS

SIGNAL Counter:INTEGER RANGE 0 TO 138;

BEGIN

CNT8:PROCESS(clk)

BEGIN

IF Counter=138 THEN Counter<=0;

ELSIF (clk'EVENT AND clk='1')THEN Counter<=Counter+1; END IF;

END PROCESS;

Search:PROCESS(Counter)

BEGIN

CASE Counter IS

WHEN 0=>ToneIndex<=3;

WHEN 1=>ToneIndex<=3;

WHEN 2=>ToneIndex<=3;

WHEN 3=>ToneIndex<=3;

WHEN 4=>ToneIndex<=5;

WHEN 5=>ToneIndex<=5;

WHEN 6=>ToneIndex<=5;

WHEN 7=>ToneIndex<=6;

WHEN 8=>ToneIndex<=8;

WHEN 15=>ToneIndex<=5; WHEN 16=>ToneIndex<=12; WHEN 17=>ToneIndex<=12; WHEN 18=>ToneIndex<=12; WHEN 19=>ToneIndex<=15; WHEN 20=>ToneIndex<=13; WHEN 21=>ToneIndex<=12; WHEN 22=>ToneIndex<=10; WHEN 23=>ToneIndex<=12; WHEN 24=>ToneIndex<=9; WHEN 25=>ToneIndex<=9; WHEN 26=>ToneIndex<=9; WHEN 27=>ToneIndex<=9; WHEN 28=>ToneIndex<=9; WHEN 29=>ToneIndex<=9; WHEN 30=>ToneIndex<=0; WHEN 31=>ToneIndex<=0; WHEN 32=>ToneIndex<=9; WHEN 33=>ToneIndex<=9; WHEN 34=>ToneIndex<=9; WHEN 35=>ToneIndex<=10; WHEN 36=>ToneIndex<=7; WHEN 37=>ToneIndex<=7; WHEN 38=>ToneIndex<=6; WHEN 39=>ToneIndex<=6; WHEN 40=>ToneIndex<=5; WHEN 41=>ToneIndex<=5; WHEN 42=>ToneIndex<=5; WHEN 43=>ToneIndex<=6; WHEN 44=>ToneIndex<=8; WHEN 45=>ToneIndex<=8; WHEN 46=>ToneIndex<=9; WHEN 47=>ToneIndex<=9; WHEN 48=>ToneIndex<=3; WHEN 49=>ToneIndex<=3; WHEN 50=>ToneIndex<=8; WHEN 51=>ToneIndex<=8; WHEN 52=>ToneIndex<=6; WHEN 53=>ToneIndex<=5; WHEN 54=>ToneIndex<=6; WHEN 55=>ToneIndex<=8; WHEN 56=>ToneIndex<=5; WHEN 57=>ToneIndex<=5;

WHEN 64=>ToneIndex<=10; WHEN 65=>ToneIndex<=10; WHEN 66=>ToneIndex<=10; WHEN 67=>ToneIndex<=12; WHEN 68=>ToneIndex<=7; WHEN 69=>ToneIndex<=7; WHEN 70=>ToneIndex<=9; WHEN 71=>ToneIndex<=9; WHEN 72=>ToneIndex<=6; WHEN 73=>ToneIndex<=8; WHEN 74=>ToneIndex<=5; WHEN 75=>ToneIndex<=5; WHEN 76=>ToneIndex<=5; WHEN 77=>ToneIndex<=5; WHEN 78=>ToneIndex<=5; WHEN 79=>ToneIndex<=5; WHEN 80=>ToneIndex<=5; WHEN 81=>ToneIndex<=0; WHEN 82=>ToneIndex<=0; WHEN 83=>ToneIndex<=3; WHEN 84=>ToneIndex<=5; WHEN 85=>ToneIndex<=3; WHEN 86=>ToneIndex<=5; WHEN 87=>ToneIndex<=5; WHEN 88=>ToneIndex<=6; WHEN 89=>ToneIndex<=7; WHEN 90=>ToneIndex<=9; WHEN 91=>ToneIndex<=6; WHEN 92=>ToneIndex<=6; WHEN 93=>ToneIndex<=6; WHEN 94=>ToneIndex<=6; WHEN 95=>ToneIndex<=6; WHEN 96=>ToneIndex<=6; WHEN 97=>ToneIndex<=5; WHEN 98=>ToneIndex<=6; WHEN 99=>ToneIndex<=8; WHEN 100=>ToneIndex<=8; WHEN 101=>ToneIndex<=8; WHEN 102=>ToneIndex<=9; WHEN 103=>ToneIndex<=12; WHEN 104=>ToneIndex<=12; WHEN 105=>ToneIndex<=12; WHEN 106=>ToneIndex<=10;

WHEN 113=>ToneIndex<=6;

WHEN 114=>ToneIndex<=5;

WHEN 115=>ToneIndex<=3;

WHEN 116=>ToneIndex<=3;

WHEN 117=>ToneIndex<=3;

WHEN 118=>ToneIndex<=3;

WHEN 119=>ToneIndex<=8;

WHEN 120=>ToneIndex<=8;

WHEN 121=>ToneIndex<=8;

WHEN 122=>ToneIndex<=8;

WHEN 123=>ToneIndex<=6;

WHEN 124=>ToneIndex<=8;

WHEN 125=>ToneIndex<=6;

WHEN 126=>ToneIndex<=5;

WHEN 127=>ToneIndex<=3;

WHEN 128=>ToneIndex<=5;

WHEN 129=>ToneIndex<=6;

WHEN 130=>ToneIndex<=8;

WHEN 131=>ToneIndex<=5;

WHEN 132=>ToneIndex<=5;

WHEN 133=>ToneIndex<=5;

WHEN 134=>ToneIndex<=5;

WHEN 135=>ToneIndex<=5;

WHEN 136=>ToneIndex<=5;

WHEN 137=>ToneIndex<=0;

WHEN 138=>ToneIndex<=0; WHEN OTHERS=>NULL;

END CASE;

END PROCESS;

END;

VHDL实验报告

《创新实验》实验报告 —基于VHDL的编程和硬件实现

一、实验目的 1.熟悉和掌握硬件描述语言VHDL的基本语法及编写; 2.掌握软件Xilinx ISE 10.1的使用; 3.熟悉SDZ-6电子技术实验箱的使用; 4.了解节拍脉冲发生器等基本电路的实现; 5.了解八位二进制计数器的功能与设计; 6.学习键盘和七段数码管显示的控制和设计。 二、实验内容 1.Xilinx ISE 10.1软件的使用; 2.节拍脉冲发生器等基本电路的实现; 3.八位二进制计数器的实现 4.键盘扫描及显示的实现 三、实验器材 1、PC机 2、SDZ-6电子技术实验箱 3、正负5V电源 4、I/O接口线 四、软件的使用 在安装Xilinx10.1软件时,需要一个ID号,其实这个ID号是可以重复使用的,几个同学在官网注册后就可以共享ID号了。 安装完成之后就可以使用这个软件编写相应的VHDL的程序。 1.新建工程 File—>New Project 弹出下面的对话框 输入工程名后单击Next。然后根据本实验的实验箱进行以下设置。

以后的步骤一般都是单击Next(有些资料上会介绍有些这些步骤的具体功能,但对于本实验不必用到),最后单击Finish,完成新建一个工程。在窗口的左边会出现刚刚新建的工程,如下: 2.新建一个VHDL的源文件。 在上图中,右击工程选择New Source ,弹出如下对话框。

在对画框的左边选择VHDL Module,输入文件的名字(改名字最好是你定义的实体的名字)。单击Next。出现下面的对话框。 该对话框主要是对外部端口的编辑。可以直接跳过,即单击Next,在源文件上编辑端口。然后在接下来的对话框中单击Finish。完成建立一个源文件。窗口右边就会出现刚才编辑的源文件。 3.编写和编译代码 将事先编好的代码复制到源文件里,然后保存文件。 选中左边的文件名,在窗体的左边出现如下编辑文档内容。

VHDL实验报告03137

VHDL实验报告 60 庄炜旭实验三. 4位可逆计数器,4位可逆二进制代码-格雷码转换器设计 一.实验目的 学习时序电路的设计,仿真和硬件测试,进一步熟悉VHDL设计技术 1. 学习4位可逆计数器的设计 2. 学习4位可逆二进制代码-格雷码转换器设计 二.实验内容 设计4位可逆计数器,及4位可逆二进制代码-格雷码转换器,并仿真,下载。 [具体要求] 1.4位可逆计数器 a)使用CLOCK_50作为输入时钟,其频率为50MHz(对于频率大于50Hz的闪烁, 人眼会看到连续的光),因而,对其进行225的分频后,再用于时钟控制。(可 利用实验一) b)使用拨码开关SW17作为模式控制,置‘1’时为加法计数器,置‘0’时为减 法计数器,同时使用LEDR17显示SW17的值。 c)使用KEY3作为异步复位开关(按下时为0,不按为1),当为加法计数器时, 置“0000”,当为减法计数器时,置“1111”。 d)使用LEDR3,LEDR2,LEDR1,LEDR0作为转换后的输出结果显示,LEDR3为高 位,LEDR0为低位。 2.4位可逆二进制代码――格雷码转换器 a)使用拨码开关SW17作为模式控制,置‘1’时为二进制代码―>格雷码转换, 置‘0’时为格雷码―>二进制代码,同时使用LEDR17显示SW17的值。 b)使用拨码开关SW3, SW2, SW1, SW0作为输入的被转换数,SW3为高位,SW0 为低位。 c)使用LEDR3,LEDR2,LEDR1,LEDR0作为转换后的输出结果显示,LEDR3为高 位,LEDR0为低位。 三.管脚设定 SW[0]PIN_N25 SW[1]PIN_N26 SW[2]PIN_P25 SW[3] PIN_AE14 SW[17] PIN_V2 LEDR[0] PIN_AE23 LEDR[1] PIN_AF23 LEDR[2] PIN_AB21 LEDR[3] PIN_AC22 LEDR[17] PIN_AD12 KEY[3] PIN_W26

基于VHDL语言的EDA实验报告(附源码)

EDA 实验报告 ——多功能电子钟 姓名:张红义 班级:10级电科五班 学号:1008101143 指导老师:贾树恒

电子钟包括:主控模块,计时模块,闹钟模块,辅控模块,显示模块,蜂鸣器模块,分频器模块。 1.主控模块: 主要功能:控制整个系统,输出现在的状态,以及按键信息。 源代码: libraryieee; use ieee.std_logic_1164.all; useieee.std_logic_arith.all; useieee.std_logic_unsigned.all; entity mc is port(functionswitch,k,set,lightkey: in std_logic; chose21,setout: out std_logic; lightswitch:bufferstd_logic; modeout,kmodeout : out std_logic_vector(1 downto 0); setcs,setcm,setch,setas,setam,setah:outstd_logic); end mc; architecture work of mc is signalmode,kmode:std_logic_vector(1 downto 0); signal light,chose21buf:std_logic; signalsetcount:std_logic_vector(5 downto 0); begin process(functionswitch,k,set,lightkey) begin iffunctionswitch'event and functionswitch='1' then mode<=mode+'1'; end if; iflightkey'event and lightkey='1' then lightswitch<=not lightswitch; end if; if mode="01" thenchose21buf<='0'; else chose21buf<='1'; end if; ifk'event and k='1' then if mode="01" or mode="11" then kmode<=kmode+'1'; end if;end if; if set='1' then if mode = "01" then ifkmode="01" then setcount<="000001"; elsifkmode="10" thensetcount<="000010"; elsifkmode="11" then setcount<="000100";

VHDL实验报告论文

硬件描述语言期末实验报告 题目:硬件描述语言实现秒表功能 姓名xxxx 学号xxxxxxxxxx 年级专业xxxxxxxxxxxxx 指导教师xxxx 2012年6月20日

河北大学本科生VHDL硬件实验论文(设计) 硬件描述语言实现秒表功能 摘要 应用VHDL语言设计数字系统,很多设计工作可以在计算机上完成,从而缩短了数字系统的开发时间。我们尝试利用VHDL为开发工具设计数字秒表。 秒表的逻辑结构较简单,它主要由十进制计数器、六进制计数器、数据选择器、和显示译码器等组成。在整个秒表中最关键的是如何获得一个精确的100HZ计时脉冲,除此之外整个秒表还需有一个启动信号,暂停信号和一个清零信号,以便秒表能随意停止及启动。 关键词:VHDL语言数字秒表时序仿真图

目录 一、实验目的 (1) 二、硬件要求 (1) 三、引脚说明 (1) 四、模块介绍 (2) 4.1.计数器(六、十进制) (2) 4.2.蜂鸣器 (2) 4.3.译码器 (3) 4.4.控制器 (4) 五、整体连接图 (5) 六、实验结果 (6) 七、实验总结 (6) 八、谢辞 (7) 九、附录 (7)

一实验目的 学习使用VHDL语言,以及EDA芯片的下载仿真。 二硬件要求 (1)主芯片EPF10K10LC84-4。 (2)蜂鸣器。 (3)8位八段扫描共阴极数码显示管。 (4)二个按键(暂停,开关)。 三引脚说明 3.1引脚设置 3.2信号说明 signal q:std_logic_vector(3 downto 0); --q是用于分频的信号。 signal state: std_logic_vector(3 downto 0); --state为状态信号,state为1时为暂停记录状态,为0时为正常显示计数状态。signal led: std_logic_vector(3 downto 0); --led为数码管扫描信号,通过对d1~d6的选择使数码管发光。

VHDL实验报告

专用集成电路实验报告 13050Z01 1305024237 刘德文

实验一开发平台软件安装与认知实验 实验内容 1、本实验以三线八线译码器(LS74138)为例,在Xilinx ISE 9.2软件平台上完成设计 电路的VHDL文本输入、语法检查、编译、仿真、管脚分配和编程下载等操作。下载芯片选择Xilinx公司的CoolRunner II系列XC2C256-7PQ208作为目标仿真芯片。 2、用1中所设计的的三线八线译码器(LS74138)生成一个LS74138元件,在Xilinx ISE 9.2软件原理图设计平台上完成LS74138元件的调用,用原理图的方法设计三线八线译 码器(LS74138),实现编译,仿真,管脚分配和编程下载等操作。 源程序: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; -- Uncomment the following lines to use the declarations that are -- provided for instantiating Xilinx primitive components. --library UNISIM; --use UNISIM.VComponents.all; entity ls74138 is Port ( g1 : in std_logic; g2 : in std_logic; inp : in std_logic_vector(2 downto 0); y : out std_logic_vector(7 downto 0)); end ls74138; architecture Behavioral of ls74138 is begin process(g1,g2,inp) begin if((g1 and g2)='1') then case inp is when "000"=>y<="00000001"; when "001"=>y<="00000010";

vhdl实验报告--蜂鸣器

VHDL 实验报告 一、实验目的 1、掌握蜂鸣器的使用; 2、通过复杂实验,进一步加深对VHDL语言的掌握程度。 二、实验原理乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在蜂鸣器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让蜂鸣器能够发声是不够的,还必须准确地控制乐曲的节奏,即每个音符的持续时间。由此可见,乐曲中每个音符的发音频率及其持续的时间是乐曲能够连续演奏的两个关键因素。 乐曲的12 平均率规定:每2 个八度音(如简谱中的中音1 与高音1)之间的频率相差1 倍。在2个八度音之间,又可分为12个半音。另外,音符A(简谱中的低音6)的频率为440Hz, 音符B到C之间、E到F之间为半音,其余为全音。由此可以计算出简谱中从低音I至高音1 之间每个音符的频率,如表所示。 音名频率/Hz 音名频率/Hz 音名频率/Hz 低音1 中音1 高音1 低音2 中音2 高音2 低音3 中音3 高音3 低音4 中音4 高音4 低音5 392 中音5 784 高音5 1568 低音6 440 中音6 880 高音6 1760 低音7 中音7 高音7 表简谱音名与频率的对应关系 产生各音符所需的频率可用一分频器实现, 由于各音符对应的频率多为非整数, 而分频系数又不能为小数, 故必须将计算得到的分频数四舍五入取整。若分频器时钟频率过低, 则由于分频系数过小, 四舍五入取整后的误差较大;若时钟频率过高,虽然误差变小,但分频数将变大。实际的设计应综合考虑两方面的因素, 在尽量减小频率误差的前提下取合适的时钟频率。实际上,只要各个音符间的相对频率关系不变,演奏出的乐曲听起来都不会走调。 音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定。因此, 要控制音符的音 长,就必须知道乐曲的速度和每个音符所对应的节拍数, 本例所演奏的乐曲的最短的音符为四分音符,如果将全音符的持续时间设为1s 的话,那么一拍所应该持续的时间为秒,则只需要提供一个4HZ的时钟频率即可产生四分音符的时长。 本例设计的音乐电子琴选取40MHZ的系统时钟频率。在数控分频器模块,首先对时钟频率进行40分频,得到1MHZ的输入频率,然后再次分频得到各音符的频率。由于数控分频器 输出的波形是脉宽极窄的脉冲波, 为了更好的驱动蜂鸣器发声, 在到达蜂鸣器之前需要均衡占空比, 从而生成各音符对应频率的对称方波输出。这个过程实际上进行了一次二分频, 频率变为原来的二分之一即。 因此,分频系数的计算可以按照下面的方法进行。以中音1为例,对应的频率值为 523. 3Hz,它的分频系数应该为: 0.375MHZ 0.375 106 716 523.3 523.3

vhdl实验报告

福建农林大学计算机与信息学院 信息工程类 实验报告 2013年11 月13 日

实验项目列表

福建农林大学计算机与信息学院信息工程类实验报告 系:电子信息工程系专业:电子信息工程年级: 2010级 姓名:学号:实验课程: VHDL数字系统设计 实验室号:__ 田C407 实验设备号: 07 实验时间: 11.12 指导教师签字:成绩: 实验一数控分频器的设计 1.实验目的和要求 学习数控分频器的设计、分析和测试方法。 2.实验原理 信号有不同的分频比,数控分频器就是用计数值可并行预置的加法计数器设计完成的,方法是将计数溢出位与预置数加载输入信号相接即可,详细设计程序如例1所示。 数控分频器的仿真波形如图1所示:输入不同的CLK频率和预置值D,给出如图1的时序波形。 100.0μs200.0μs300.0μs400.0μs 图1 当给出不同输入值D时,FOUT输出不同频率(CLK周期=50ns) 3.主要仪器设备(实验用的软硬件环境) 实验的硬件环境是: 微机一台 GW48 EDA实验开发系统一套 电源线一根 十芯JTAG口线一根 USB下载线一根 USB下载器一个 示波器 实验的软件环境是: Quartus II 9.0软件

4.操作方法与实验步骤 (1)创建工程,并命名位test。 (2)打开QuartusII,建立VHDL文件,并输入设计程序。保存为DVF. (3)选择目标器件。Acex1k—EP1K100QC208-3。 (4)启动编译。 (5)建立仿真波形图。 (6)仿真测试和波形分析。 (7)引脚锁定编译。 (8)编程下载。 (9)硬件测试 5.实验内容及实验数据记录 在实验系统上硬件验证例5-20的功能。可选实验电路模式1(第一章图4);键2/键1负责输入8位预置数D(PIO7-PIO0);CLK由clock0输入,频率选65536Hz 或更高(确保分频后落在音频范围);输出FOUT接扬声器(SPKER)。编译下载后进行硬件测试:改变键2/键1的输入值,可听到不同音调的声音。 6.实验数据处理与分析 1)实验代码 【例1】 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DVF IS PORT ( CLK : IN STD_LOGIC; D : IN STD_LOGIC_VECTOR(7 DOWNTO 0); FOUT : OUT STD_LOGIC ); END; ARCHITECTURE one OF DVF IS SIGNAL FULL : STD_LOGIC; BEGIN P_REG: PROCESS(CLK) VARIABLE CNT8 : STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN IF CLK'EVENT AND CLK = '1' THEN IF CNT8 = "11111111" THEN CNT8 := D; --当CNT8计数计满时,输入数据D被同步预置给计数器CNT8 FULL <= '1'; --同时使溢出标志信号FULL输出为高电平 ELSE CNT8 := CNT8 + 1; --否则继续作加1计数 FULL <= '0'; --且输出溢出标志信号FULL为低电平 END IF; END IF; END PROCESS P_REG ; P_DIV: PROCESS(FULL) VARIABLE CNT2 : STD_LOGIC; BEGIN IF FULL'EVENT AND FULL = '1' THEN CNT2 := NOT CNT2; --如果溢出标志信号FULL为高电平,D触发器输出取反

VHDL实验报告一2选1多路选择器

实验一 实验目的: 熟悉quartus的vhdl文本设计流程全过程,学习简单的组合电路的设计,多层次的电路设计,仿真和硬件测试 二、实验内容 内容(一)用vhdl语言设计2选1多路选择器 参考例3-1程序设计如下: library ieee; use mux21a is port (a,b,s:in bit; y: out bit); end entity mux21a; architecture one of mux21a is begin y<=a when s='0' else b; end architecture one 全程编译后软件提示0错误,3警告,可以继续下面仿真操作。 程序分析: 这是一个2选1多路选择器,a和b分别为两个数字输入端的端口名,s为通道选择控制信号输入端的端口名,y为输出端的端口名。 时序仿真及分析: 时序仿真输入图: 时序仿真输出图: 时序分析: 由上面两图可以得知:当s=0时,y口输出a,当s=1时,y口输出b 下载和硬件测试: 引脚锁定图: 程序下载完成后,选择实验电路模式5,通过短路帽选择clock0接256Hz 信号,clock2接8Hz信号。通过键一控制s,当键一进行切换时,明显能听到扬声器发出两种不同音调的声音。 实验内容(二)双二选一多路选择器设计

程序设计: library ieee; use mux21a is port (a,b,s:in bit; y: out bit); end entity mux21a; architecture one of mux21a is begin y<=a when s='0' else b; end architecture one; entity muxk is port (a1,a2,a3,s0,s1:in bit; outy:out bit); end entity muxk; architecture bhv of muxk is component mux21a port (a,b,s:in bit; y:out bit); end component; signal tmp: bit; begin u1:mux21a port map(a=>a2,b=>a3,s=>s0,y=>tmp); u2:mux21a port map(a=>a1,b=>tmp,s=>s1,y=>outy); end architecture bhv; 全程编译后软件提示0错误,2警告 程序分析: 这是一个双2选1多路选择器,a1、a2和a3分别为两个数字输入端的端口名,s0、s1为通道选择控制信号输入端的端口名,outy为输出端的端口名。实体mux21a是一个2选一选通电路,实体muxk是元件的例化,其作用是将两个mux21a组合成一个3选1多路选择器。 时序仿真及分析: 时序仿真输入图 时序仿真输出图 时序分析: 从仿真出来的结果,我们不难发现,s0和s1做为a1、a2、a3的选通控制信号。当s0=0.、s1=0时,outy输出a1;当s0=0.、s1=1时,outy输出a2;当s0=1.、s1=0时,outy输出a1;当s1=1.、s2=1时,outy输出a3; 下载和硬件测试: 引脚锁定图

VHDL实验报告

VHDL实验报告 5080309563 李斌 实验三.4位可逆计数器,4位可逆二进制代码-格雷码转换器设计 [设计思路及步骤]: 一.需求: 设计4位可逆计数器,及4位可逆二进制代码-格雷码转换器,并仿真,下载。 [具体要求] 1.4位可逆计数器 a)使用CLOCK_50作为输入时钟,其频率为50MHz(对于频率大于50Hz的闪烁, 人眼会看到连续的光),因而,对其进行225的分频后,再用于时钟控制。(可 利用实验一) b)使用拨码开关SW17作为模式控制,置‘1’时为加法计数器,置‘0’时为减 法计数器,同时使用LEDR17显示SW17的值。 c)使用KEY3作为异步复位开关(按下时为0,不按为1),当为加法计数器时, 置“0000”,当为减法计数器时,置“1111”。 d)使用LEDR3,LEDR2,LEDR1,LEDR0作为转换后的输出结果显示,LEDR3为高 位,LEDR0为低位。 2.4位可逆二进制代码――格雷码转换器 a)使用拨码开关SW17作为模式控制,置‘1’时为二进制代码―>格雷码转换, 置‘0’时为格雷码―>二进制代码,同时使用LEDR17显示SW17的值。 b)使用拨码开关SW3, SW2, SW1, SW0作为输入的被转换数,SW3为高位,SW0 为低位。 使用LEDR3,LEDR2,LEDR1,LEDR0作为转换后的输出结果显示,LEDR3为高位,LEDR0为低位。 二.变量解释: 4位可逆计数器: 1.clk为时钟输入,clkout为分频后的时钟,cnt为分频计数,ctr为SW17模式 控制,rst为KEY3异步复位开关,tem为输出结果的中间变量; 2.本实验的时钟输入为50MHz,定义为clk,为此设计时需要将其分频为50Hz, 需225分频,因此,代码中,需要有一个cnt作为一个225计数器,同时,定义 分频后的时钟为clkout; 3.建立process,检测key是否为0,为0则复位。否则,检测clkout,触发上升 沿则检测模式控制,对tem加1或减1,同时应检测是否达到最大或最小值, 达到最值则直接返回到最初值,否则继续操作; 4.最后,转换tem的值为相应的4位二进制数,并于LED上反映出来。 四位可逆二进制代码-格雷码转换器: 1.检测模式,进行相应的操作; 2.ctr为0则格雷码转换成二进制码;ctr为1则为二进制码转换为格雷码 [源代码]: 1)4位可逆计数器: library ieee; use ieee.std_logic_1164.all; entity cnt is

VHDL实验报告汇总

实验一4选一多路选择器 一:实验目的及实验环境 目的 1、熟悉ModelSim SE 6.5c的verilog 的文本设计流程,组合电路的设计、仿真和测试。 2、用verilog语言完成设计4选一多路选择器。 3、熟悉文本输入及仿真步骤。 4、初步了解可编程器件设计的全过程。 环境 1、P C 机一台 2、M odelSim SE 6.5c 二. 实验内容 1、用verilog语言完成设计4选一多路选择器, 2、用结构建模及数据流建模两种方法实现。 3、对于所设计的程序进行编译,检查纠错。 4、程序完善之后进行程序的仿真并进行波形的记录与分析 三.实验步骤 1、建立工程 2、添加文件到工程 3、编译文件 4、查看编译后的设计单元 5、将信号加入波形窗口 6、运行仿真 四.运行结果

五.总结 本次实验让我更加的熟悉modelsim使用方法,以及使用时应该注意的问题。在试验中也学习到了Verilog语法。在实验中我们应该注意verilog的格式要求,在用编程语言编程的时候,要自习留意语法标准,整理好逻辑思维的同时保证格式的正确。否则就会浪费大量的时间来完成实验。试验开始到结束这一过程中,我遇到了很多困难,后来都在同学的提醒和帮助下克服了。相信有了这次对这个语言和这个软件的接触,我们都有了更加深入的理解。 六.源代码 module mux41(a,b,c,d,s1,s0,out); input[1:0] a,b,c,d; input s1,s0; output[1:0] out; reg[1:0] out; always @(a or b or c or d or s 1 or s0) begin :mux41 case({s1,s0}) 2'b00: out<=a; 2'b01: out<=b; 2'b10: out<=c; 2'b11: out<=d; default: out=a; endcase end endmodule module sti; reg[1:0] a,b,c,d; reg s0,s1; wire[1:0] out; mux41 dtg(a,b,c,d,s0,s1,out); initial begin a=3'd0;b=3'd1;c=3'd2;d=3'd3; s0=0;s1=0; #100 a=3'd0;b=3'd1;c=3'd2;d= 3'd3;s0=0;s1=1; #100 a=3'd0;b=3'd1;c=3'd2;d= 3'd3;s0=1;s1=0; #100 a=3'd0;b=3'd1;c=3'd2;d= 3'd3;s0=1;s1=1; end endmodule

VHDL硬件描述语言实验报告

硬件描述语言实验附录 姓名:xxx 学号:xxx 指导教师:xxx 目录 硬件描述语言实验附录 (1) 实验1.三输入与门电路实验 (2) 实验2. 三—八译码器实验 (3) 实验3. D触发器实验 (4) 实验4. 分频器实验 (5) 实验5. 状态机实验 (8)

实验1.三输入与门电路实验 --三输入与门电路threeinput --姓名:王定 --学号:1306034248 --中北大学 LIBRARY IEEE; --调用库 USE IEEE.STD_LOGIC_1164.ALL;--库文件 -------------------------------------------------------------- ENTITY threeinput IS --定义实体名,其名称必须与VHDL文本文件名称相同PORT( A: IN STD_LOGIC; --输入端口,时钟输入 B: IN STD_LOGIC; --输入端口,个位写入使能 C: IN STD_LOGIC; --输入端口,十位写入使能 CO: OUT STD_LOGIC); --输出端口,溢出标志 END ENTITY threeinput; --结束端口定义 -------------------------------------------------------------- ARCHITECTURE RTL OF threeinput IS--定义结构体 BEGIN PROCESS(A,B,C) IS --开始,必须带上 BEGIN CO<=A AND B AND C ; END PROCESS; END ARCHITECTURE RTL; --结束结构体 表1. 三输入与门电路VHDL实验代码 图1. 三输入与门电路仿真波形图,A,B,C输入,CO输出

北邮数电VHDL实验报告

2009级数字电路实验报告 实验名称:EDA基础实验 学生姓名: 班级: 班内序号: 学号: 日期: 1.实验要求 【实验目的】 1.熟悉用QuartusII原理图输入法进行电路设计和仿真; 2.掌握QuartusII图形模块单元的生成与调用; 3.熟悉用VHDL语言设计组合逻辑电路和时序电路的方法; 4.熟悉用QuartusII文本输入法和图形输入法进行电路设计; 5.熟悉不同的编码及其之间的转换; 6.掌握触发器的逻辑功能及使用方法; 7.熟悉计数器、寄存器、锁存器、分频器、移位寄存器的设计方法 8.掌握VHDL语言的语法规范,掌握时序电路描述方法; 9.掌握多个数码管动态扫描显示的原理及设计方法。 【实验所用仪器及元器件】 1.计算机 2.直流稳压电源 3.数字系统与逻辑设计实验开发板 【实验内容】 1.用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图形模块单元。 2.用实验内容1中生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功 能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信 号。

3.用3线-8线译码器(74LS138)和逻辑门设计实现函数F,仿真验证其功能,并下 载到实验板测试。要求用拨码开关设定输入信号,发光二极管显示输出信号。 4.用VHDL语言设计实现一个3位二进制数值比较器,仿真验证其功能,并下载到实 验板测试。要求用拨码开关设定输入信号,发光二极管显示输出信号。 5.用VHDL语言设计实现一个4选1的数据选择器;一个8421码转换为格雷码的代码 转换器;一个举重比赛裁判器;一个带同步置位和同步复位功能的D触发器;一个 带异步复位的4位二进制减计数器;一个带异步复位的8421码十进制计数器;一 个带异步复位的4位自启动环形计数器;一个带控制端的8位二进制寄存器,当控 制端为‘1’时,电路正常工作,否则输出为高阻态;一个分频系数为12,分频输 出信号占空比为50%的分频器。仿真验证其功能,并下载到实验板测试。要求用拨 码开关和按键开关设定输入信号,发光二极管显示输出信号。(注:有几个不需要 下载到实验板测试) 2.程序分析 全加器: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY h_adder IS PORT(a,b:IN STD_LOGIC; co,so:OUT STD_LOGIC); END ENTITY h_adder; ARCHITECTURE a OF h_adder IS BEGIN so<= a XOR b; co<= a AND b; END;

VHDL实验报告一2选1多路选择器

实验目的: 熟悉quartus的vhdl文本设计流程全过程,学习简单的组合电路的设计,多层次的电路设计,仿真和硬件测试 二、实验内容 内容(一)用vhdl语言设计2选1多路选择器 参考例3-1程序设计如下: library ieee; use mux21a is port (a,b,s:in bit; y: out bit); end entity mux21a; architecture one of mux21a is begin y<=a when s='0' else b; end architecture one 全程编译后软件提示0错误,3警告,可以继续下面仿真操作。 程序分析: 这是一个2选1多路选择器,a和b分别为两个数字输入端的端口名,s为通道选择控制信号输入端的端口名,y为输出端的端口名。 时序仿真及分析: 时序仿真输入图: 时序仿真输出图: 时序分析: 由上面两图可以得知:当s=0时,y口输出a,当s=1时,y口输出b 下载和硬件测试: 引脚锁定图: 程序下载完成后,选择实验电路模式5,通过短路帽选择clock0接256Hz 信号,clock2接8Hz信号。通过键一控制s,当键一进行切换时,明显能听到扬声器发出两种不同音调的声音。 实验内容(二)双二选一多路选择器设计 程序设计: library ieee;

use mux21a is port (a,b,s:in bit; y: out bit); end entity mux21a; architecture one of mux21a is begin y<=a when s='0' else b; end architecture one; entity muxk is port (a1,a2,a3,s0,s1:in bit; outy:out bit); end entity muxk; architecture bhv of muxk is component mux21a port (a,b,s:in bit; y:out bit); end component; signal tmp: bit; begin u1:mux21a port map(a=>a2,b=>a3,s=>s0,y=>tmp); u2:mux21a port map(a=>a1,b=>tmp,s=>s1,y=>outy); end architecture bhv; 全程编译后软件提示0错误,2警告 程序分析: 这是一个双2选1多路选择器,a1、a2和a3分别为两个数字输入端的端口名,s0、s1为通道选择控制信号输入端的端口名,outy为输出端的端口名。实体mux21a是一个2选一选通电路,实体muxk是元件的例化,其作用是将两个mux21a组合成一个3选1多路选择器。 时序仿真及分析: 时序仿真输入图 时序仿真输出图 时序分析: 从仿真出来的结果,我们不难发现,s0和s1做为a1、a2、a3的选通控制信号。当s0=0.、s1=0时,outy输出a1;当s0=0.、s1=1时,outy输出a2;当s0=1.、s1=0时,outy输出a1;当s1=1.、s2=1时,outy输出a3; 下载和硬件测试: 引脚锁定图 程序下载完成后,选择实验电路模式5,通过短路帽选择clock0接256Hz

VHDL实验报告

实验者:黄成勇学号:3110008723 班级:电子(4)班日期:2012年12月30日 实验一:应用Quart us II 完成基本组合电路设计 (1) 实验目的:熟悉QuartusⅡ的VHDL文本设计流程全过程,学习简单组合电路的设计、多层次电路设计、仿真和硬件测试。 (2) 实验容1:首先利用QuartusⅡ完成2选1多路选择器的文本编辑输入(mux21a.vhd)和仿真测试等步骤,给出仿真波形。最后在实验系统上进行硬件测试,验证本项设计的功能。 2选1多路选择器: LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY mux21a IS PORT ( a, b, s: IN BIT; y : OUT BIT ); END ENTITY mux21a; ARCHITECTURE one OF mux21a IS BEGIN PROCESS (a,b,s) BEGIN IF s = '0' THEN y <= a ; ELSE y <= b ;

END IF; END PROCESS; END ARCHITECTURE one ; 双2选1多路选择器 2选1多路选择器功能时序波形 (3) 实验容2:将此多路选择器看成是一个元件mux21a,利用元件例化语句。 例化程序: LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY mux31a IS PORT ( a1, a2,a3, s0,s1: IN STD_LOGIC; outy : OUT STD_LOGIC );

VHDL第一次实验报告

VHDL第一次实验报告 深圳大学实验报告 课程名称:EDA技术 实验项目名称:基本电路行为的描述 学院:信息工程学院 专业:电子信息工程 指导教师: 报告人:学号:班级: 2 实验时间: 实验报告提交时间:2014年5月9日 教务部制 实验内容:1 多路选择器(习题2.1)2 ROM(习题3.4)3 简易加法器(习题3.5)4 通用译码器(习题4.4)5 第五章习题5.1、5.5、5.6、5.7、5.8 实验要求:1.依次完成各电路功能的VHDL代码编写 2.完成相应电路仿真,并对仿真结果截图,截图中要求尽可能多的体现不同输入信号对应的输入结果 3.完成实验报告,并按时提交至Blackboard,实验报告见实验报告模板,要求按模板各项内容完成。4.特别提示:实验报告按模板内容逐项填写,要求有完整的VHDL代码、仿真测试文件(VHDL test bench)、仿真结果截图、仿真结果分析、实验结论(或对实验的总结、心得体会)等内容。实验过程及内容:2.1 多路选择器多路选择器的顶层电路如图P2.1所示。根据真值表,如果输入sel=“01”或者sel=“10”,那么输出将等于对应的某一输入(c=a或c=b).然而如果输入sel=“00”或者sel=“11”,那么输出将分别为‘0’和‘Z’(高阻)。(a)填写表格,完成下

面的代码。(b)是对你的解答给出相关的注释。(c)将代码编译后进行仿真,验证其正确性。实验完整VHDL代码:library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity mux is Port ( a : in STD_LOGIC_VECTOR(7 DOWNTO 0); b : in STD_LOGIC_VECTOR(7 DOWNTO 0); sel : in STD_LOGIC_VECTOR(1 DOWNTO 0); c : out STD_LOGIC_VECTOR(7 DOWNTO 0)); end mux; architecture example of mux is begin PROCESS (a,b,sel) begin IF (sel=\ c ‘U’); END IF; END PROCESS; end EXAMPLE; 仿真测试文件代码:LIBRARY ieee; USE ieee.std_logic_1164.ALL; ENTITY Test_Mux IS END Test_Mux; ARCHITECTURE behavior OF Test_Mux IS COMPONENT mux PORT( a : IN std_logic_vector(7 downto 0); b : IN std_logic_vector(7 downto 0); sel : IN std_logic_vector(1 downto 0); c : OUT std_logic_vector(7 downto 0) ); END COMPONENT; --Inputs signal a : std_logic_vector(7 downto 0) := (others => ‘0’); signal b : std_logic_vector(7 downto 0) := (others => ‘0’); signal sel : std_logic_vector(1 d ownto 0) := (others => ‘0’); --Outputs signal c : std_logic_vector(7 downto 0); -- No clocks detected in port list. Replace below with -- appropriate port name BEGIN -- Instantiate the Unit Under Test (UUT) uut: mux PORT MAP ( a => a, b => b, sel => sel, c => c ); -- Stimulus process stim_proc: process begin -- hold reset state for 100 ns. a<=\ b<=\ sel <=\ wait for 100 ns; sel <=\ wait for 100 ns; sel <=\ wait for 100 ns; sel <=\ wait for 100 ns; -- insert stimulus here wait; end process; END; 仿真结果:如图,当输入信号sel为“00”时,输出信号c为“00000000”;当输入信号sel为“01”时,输出信号c等于a即为“10101010”;当输入信号sel为“10”时,输出信号c等于b即为“11110000”;当输入信号sel 为其他情况时,输出信号c等于自己设定的值,在此处即为“U”。习题3.4 ROM 试用1*1维常数来实现只读存储器ROM(read-only memory),假设一个ROM由许多深度为8,位宽为4的块组成。提示:首先建立一个名为rom的数组,然后定义一个rom类型的信号来实现ROM,用常数值填充到ROM块中:CONSTANT my_rom:rom:=(values);。实验完整VHDL代码:library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity ROM is Port ( addr :

VHDL乐曲演奏实验报告

文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。设计性实验报告 班级: 姓名(学号): 实验项目名称:乐曲演奏实验 实验项目性质:设计性 实验所属课程:EDA基础 实验室(中心): 指导教师: 实验完成时间:2009 年12 月13 日

教师评阅意见: 签名:年月日实验成绩: 一、实验目的 1、熟悉QuartusII 软件的使用。 2、熟悉EDA实验开发系统的基本使用。 3、学习VHDL基本单元电路的设计应用。进一步掌握EDA的多层次设计方法。 4、学习音乐发生器的设计。 二、实验内容及要求 1、实验内容 利用可编程逻辑器件FPGA,设计乐曲硬件电路,可自动演奏乐曲。 2、实验要求 要求能够演奏出《友谊天长地久》的曲调或可另选一段较完整的曲调(扩展要 求:能够从数码管上显示出当前曲调的简谱和频率),我们组演奏出的是实验 要求上的《友谊天长地久》曲调。 三、实验原理 1、乐曲硬件电路产生音乐是和音乐频率和音乐的持续时间有关;音符的持续时间需 根据乐曲的速度和每个音符的节拍数来确定。其简谱中音符和频率的关系如下: 2、该演奏电路演奏的乐曲是《友谊天长地久》片段,其最小的节拍为1拍,将1拍

的时长定位0.25S,则只需要再提供一个4hz的时钟频率即可产生1拍的时长,演奏的时间控制通过ROM查表的方式来完成。对于占用时间较长的节拍,(一定是节拍的整数倍),如全音符为4拍,2/4音符为2拍,1/4音符为1拍。 3、乐曲硬件演奏电路系统主要有数控分频器和乐曲存储模块两个部分组成,其余还有 音乐节拍发生器等等。数控分频器对FPGA 的基准频率进行分频,得到与各个音节对应的频率输出。乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中存放一个乐曲曲谱真值表(实验中用的ROM存储),由一个计数器来控制此真值表的输出,而由计数器的技术时钟信号作为乐曲节拍控制信号。 4、要求演奏时能循环进行,必须需另外设置一个时长计数器,当乐曲演奏完成时,保 证能自动从头开始演奏。该计数器控制真值表按顺序输出简谱。 四、实验仪器、材料 计算机一台、GW48 EDA/SOPC实验箱一台 QuartusII软件、实验箱连接线一根 五、方案设计 这个实验中采用层次化的设计思路,因此我们把此乐曲硬件演奏电路分为3个主要模块,即音乐发生器NoteTabs模块,音符译码电路Tonetaba模块,数控分频Speakera 模块。分好层次之后,编写每个模块的程序,分别生成项目符号,最后把生成的个项目符号用原理图的方式连接起来,然后编译、下载即可。由图例表示如下: 此实验设计中,我主要负责音乐发生器NoteTabs模块(ROM的定制过程)和最后的连接原理图部分。 六、实验过程及原始记录 1、音乐节拍发生器NoteTabs模块 这个模块用FPGA的片内ROM存放乐曲的简谱真值表,由一个二进制计数器为乐曲数据存储ROM的地址发生器随着NoteTabs中计数器按时钟频率做加法计数时,乐曲数据存储器ROM中的音符数据,将从ROM中的输出口输向音符译码电路Tonetaba ,所存储的乐曲就开始连续自然地演奏起来。

相关主题
文本预览
相关文档 最新文档