FPGA与CPLD实验报告

FPGA与CPLD实验报告
FPGA与CPLD实验报告

FPGA与CPLD实验报告

159030004杨文忠

实验一、正弦波的产生

一、实验目的:

1.学习QuartusII的使用;

2.掌握宏单元模块定制ROM;

3.掌握VHDL语言中的元件例化;

4.掌握VHDL语言中的计数器的设计;

5.掌握SignalTap II的使用。

二、实验条件:

1. 装有QuartusII13.0的电脑一台;

2. EP4CE15F17C8实验开发板一套。

三、实验原理:

1. 使用查表的方式计算正弦值,使用MATLAB产生ROM所需的正弦波mif文件;

2. 程序中根据计数器的值进行查表输出,并用modelsim和SignalTap II观察输出的结果。

3.使用MATLAB产生mif文件的程序如下:

WIDTH=8;

DEPTH=1024;

ADDRESS_RADIX=DEC;

DATA_RADIX=DEC;

CONT

ENT BEGIN

0:128;

1:129;

2:130;

…(数据略去)

1021:126;

1022:126;

1023:127;

End;

保存为mif格式文件,或者直接使用Mif_Maker2010产生mif文件。

四、实验内容:

1. 使用宏单元模块定制ROM,操作步骤如下:

Tools -> MegaWizars Plug-In Manager[page 1] -> Create a new custom megafunction variation -> Next -> MegaWizars Plug-In Manager[page 2a] -> Installed Plug-In -> I/O ->Memory Complier -> ROM:1-PORT

设置好参数后,将定制的Files添加到工程中,调用Modelsim观察正选波形,观察之前需设计相应参数,时钟设置为100ns。

2. 使用SignalTap II逻辑分析仪分析FPGA产生的正弦波信号, SignalTap II的使用步骤

如下:

Tools ->SignalTap II Logic Analyzer ->设置好之后,直接点击运行即可。

五、实验总结:

通过本次实验学会了怎么使用使用宏单元模块定制ROM,并学会了如何使SignalTap II。

六、实验代码:

library ieee; --正弦信号发生器源文件

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity sinwave is

port (clk:in std_logic; --信号源时钟

dout:out std_logic_vector(7 downto 0));--8位波形数据输出

end;

architecture dacc of sinwave is

component data_rom

PORT

(

address : IN STD_LOGIC_VECTOR (9 DOWNTO 0);--10位地址信号

clock : IN STD_LOGIC := '1';

q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)

);

end component;

signal q1:std_logic_vector(9 downto 0):="0000000000";--设定内部节点作为地址计算器

begin

process(clk)

begin

if clk'event and clk ='1' then q1<=q1+1;--q1作为地址发生器计算器

end if;

end process;

u1:data_rom port map(address=>q1,q=>dout,clock=>clk);--例化

end;

实验二、数字钟的设计

一、实验目的:

1.熟练掌握QuartusII的使用;

2.掌握宏单元模块定制ROM;

3.掌握VHDL语言中的元件例化;

4.掌握VHDL语言中的数字钟的设计;

5.练习使用VHDL写状态机程序。

二、实验条件:

1. 装有QuartusII13.0的电脑一台;

2. EP4CE15F17C8实验开发板一套。

三、实验原理:

1. EP4CE15F17C8开发板的系统时钟是50MHz,通过分频方式产生1Hz的标准秒脉冲,通过把三个计数器级联,分别对电子钟的秒分时进行计数,计数器的模分别为

60,60,24;

2. 对计数结果进行二进制到8421BCD码的转换,通过译码器把BCD码转换成七段码,显示是通过位码控制来进行动态显示的;

3. 本开发板使用的按键是独立式按键,总共有六个按键,上下键完成状态间的切换,左右键完成数字的加减,中间键为确认键,还有一个单独的复位键;

5. 通过按键来完成当前时间和闹钟的时间调整。

四、实验内容:

1. 计数器的设计

在本次实验中使用了较多的计数器,通过编写通用计数器,再在主程序中多次例化,以达到精简代码的目的。本计数器定义了置数使能和置数值输入口来完成当前时钟时间的调节。时钟的位数和模值可通过具体的例化原件来进行初始化。

entity counter is

generic (bitwidth:integer:=4;moda:integer:=12);

port (clk,en,en_set:in std_logic;

d :in std_logic_vector(bitwidth-1 downto 0);

cout:out std_logic;

counterout :out std_logic_vector(bitwidth-1 downto 0));

end entity;

计数器的cout是计数进位端,作为下一级计数器的计数使能端,此处需要注意本级的进位端不能作为下一级的时钟信号使,因为进位端的毛刺会使计数结果出现错误。

2. 按键去抖程序的设计

实验中需要对按键进行消抖处理,消抖的程序是直接采用计数器计数的形式,等计数器达到一定的值时,将相应的按键使能信号置为有效位。

设置计数器的最大计数值为5000000,当按键按下时间到100ms时,将按键使能信号置位。

调节时间和闹钟时间的程序采用状态机的方法设计。状态转换如下

S0是空闲状态,在没有按键按下时在此状态,S1是分钟调节状态,S2是小时调节状态,S3是闹钟分钟调节状态,S4是闹钟小时调节状态,S5是置数使能端使能状态,此状态停留一个系统时钟后自动返回S0状态。

3.译码器的设计

本设计的译码器包括两类译码器:(1)将二进制数转换成8421BCD码;(2)将BCD码转换成七段码。

4.在调节时间的时候为了显示现在正在调节的时间,在程序中加入显示控制端,显示控制端

当正在调节时间时,让秒显示00,当调节闹铃时间时,让秒显示55,在主程序中显示控制程序如下:

if disply_ctrl(3 downto 2)="10" then--有键按下

hour_display<=hour_set;

minute_display<=minute_set;

second_display<="000000";

elsif disply_ctrl(3 downto 2)="11" then

hour_display<=hour_alarm;

minute_display<=minute_alarm;

second_display<="110111";

else

hour_display<=hour;

minute_display<=minute;

second_display<=second;

end if;

为了便于观察正在设置的是分钟还是小时,使正在设置的部分以2Hz的频率闪烁显示,处理方法如下:

case cnt8 is

when "000" => if disply_ctrl(1 downto 0)="11" then

bt <= "111110" or ("11111"& clk_0_5s_duty_50 );

else

bt <= "111110";

end if;

a<=no1;

when "001" => if disply_ctrl(1 downto 0)="11" then

bt <= "111101" or ("1111"& clk_0_5s_duty_50 & '1' );

else

bt <= "111101";

end if;

a<=no2;

when "010" => if disply_ctrl(1 downto 0)="10" then

bt <= "111011" or ("111"& clk_0_5s_duty_50 &"11" );

else

bt <= "111011";

end if;

a<=no3;

when "011" => if disply_ctrl(1 downto 0)="10" then

bt <= "110111" or ("11"& clk_0_5s_duty_50 &"111" );

else

bt <= "110111";

end if;

a<=no4;

when "100" => bt <= "101111"; a<=no5;

when "101" => bt <= "011111"; a<=no6;

when others => bt <= "000000"; a<=15;--null;

end case;

6. 闹铃

通过对比当前时间和设定的闹铃的时间,当相同时,启动蜂鸣器,主要程序如下:if hour=hour_alarm and minute=minute_alarm then

buzzer <= '1';

else

buzzer <= '0';

end if;

五、实验总结:

通过动手完成了本实验的主要任务,显示时间,调节时间,闹铃功能。

六、实验代码

计数器程序:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity counter is

generic (bitwidth:integer:=4;moda:integer:=12);

port (clk,en,en_set:in std_logic;

d :in std_logic_vector(bitwidth-1 downto 0);

cout:out std_logic;

counterout :out std_logic_vector(bitwidth-1 downto 0));

end entity;

architecture one of counter is

begin

process(clk)

variable temp:std_logic_vector(bitwidth-1 downto 0);

begin

if clk'event and clk='1' then

cout<='0';

if en_set='0' then temp := d;cout<='0';

elsif en='1' then

if temp < moda-1 then temp :=temp + '1';

else

temp :=(others=>'0');cout<='1';

end if;

end if;

end if;

counterout<=temp;

end process;

end;

按键消抖程序:

library ieee;

use ieee.std_logic_1164.all;

entity key_detect is

generic (N:integer:=5);

port (clk : in std_logic;

key_rst : in std_logic;

key_ok : in std_logic;

key_up : in std_logic;

key_down : in std_logic;

key_left : in std_logic;

key_right : in std_logic;

key_rst_en : out std_logic;

key_ok_en : out std_logic;

key_up_en : out std_logic;

key_down_en : out std_logic;

key_left_en : out std_logic;

key_right_en : out std_logic);

end entity key_detect;

architecture one of key_detect is

signal key_all : std_logic_vector (5 downto 0);--将输入输出并行操作signal key_all_en : std_logic_vector (5 downto 0);

signal key_and : std_logic;--输入相与

begin

process(clk)

variable count : integer range 0 to 500000;

begin

key_all <= key_rst & key_ok & key_up & key_down & key_left & key_right;

key_and <= key_rst and key_ok and key_up and key_down and key_left and key_right;

if clk'event and clk='1' then

if key_and='0' then

if count=N then count:=count;

else count:=count+1;

end if;

if count=N-1 then key_all_en<=key_all;

else key_all_en<="111111";

end if;

else count:=0;key_all_en<="111111";

end if;

end if;

key_rst_en <= key_all_en(5);

key_ok_en <= key_all_en(4);

key_up_en <= key_all_en(3);

key_down_en <= key_all_en(2);

key_left_en <= key_all_en(1);

key_right_en <= key_all_en(0);

end process;

end architecture one;

当前时间及闹钟时间设置程序:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity time_set is

port (clk : in std_logic;

key_rst_en : in std_logic;

key_ok_en : in std_logic;

key_up_en : in std_logic;

key_down_en : in std_logic;

key_left_en : in std_logic;

key_right_en : in std_logic;

minute : in std_logic_vector(5 downto 0);--当前的时间和闹钟时间

hour : in std_logic_vector(4 downto 0);

minute_set : out std_logic_vector(5 downto 0);--分别为秒分时的设置单元

hour_set : out std_logic_vector(4 downto 0);

minute_alarm : out std_logic_vector(5 downto 0);

hour_alarm : out std_logic_vector(4 downto 0);

en_set : out std_logic;

disply_ctrl : out std_logic_vector(3 downto 0));

end entity time_set;

architecture one of time_set is

constant s0 : integer := 0;--空闲状态

constant s1 : integer := 1;--设置计数时间的分钟

constant s2 : integer := 2;--设置计数时间的小时

constant s3 : integer := 3;--设置闹钟时间的分钟

constant s4 : integer := 4;--设置闹钟时间的小时

constant s5 : integer := 5;

begin

p1:process(clk)

variable state : integer range 0 to 8;--当前状态机的状态

variable minute_set_temp : std_logic_vector(5 downto 0);--分别为秒分时的设置单元

variable hour_set_temp : std_logic_vector(4 downto 0);

variable minute_a_set_temp : std_logic_vector(5 downto 0);

variable hour_a_set_temp : std_logic_vector(4 downto 0);

begin

if clk'event and clk='1' then

case state is

when s0 => en_set <= '1';--复位低电平有效

if key_rst_en='0' then --有复位键按下

minute_set_temp := "000000";--对时间进行复位

hour_set_temp := "00000";

minute_a_set_temp:= "000000";

hour_a_set_temp := "00000";

--en_set <= '0';--复位低电平有效

state := s5;

elsif key_ok_en='0' then --有设置键按下

minute_set_temp := minute;--读取当前的时间

hour_set_temp := hour;

disply_ctrl <= "1010";--显示控制

state := s1;

end if;

when s1 => en_set <= '1';--复位低电平有效

if key_rst_en='0' then --有复位键按下

minute_set_temp := "000000";--对时间进行复位

hour_set_temp := "00000";

minute_a_set_temp:= "000000";

hour_a_set_temp := "00000";

--en_set <= '0';--复位低电平有效

state := s5;

elsif key_ok_en='0' then--退出设置

minute_set <= minute_set_temp;

hour_set <= hour_set_temp;

minute_alarm <= minute_a_set_temp;

hour_alarm <= hour_a_set_temp;

--en_set <= '0';--复位低电平有效

disply_ctrl <= "0000";

state := s5;

elsif key_up_en='0' then--跳至闹钟小时设置

disply_ctrl <= "1111";--显示控制

state := s4;

elsif key_down_en='0' then --跳至小时设置

disply_ctrl <= "1011";--显示控制

state := s2;

elsif key_left_en='0' then--分钟减1

if minute_set_temp>"000000" then

minute_set_temp:= minute_set_temp-'1';

else

minute_set_temp:= "000000";

end if;

elsif key_right_en='0' then--分钟加1

if minute_set_temp<"111011" then

minute_set_temp:= minute_set_temp+'1';

else

minute_set_temp:= "000000";

end if;

end if;

when s2 => en_set <= '1';--复位低电平有效

if key_rst_en='0' then --有复位键按下

minute_set_temp := "000000";--对时间进行复位

hour_set_temp := "00000";

minute_a_set_temp:= "000000";

hour_a_set_temp := "00000";

--en_set <= '0';--复位低电平有效

state := s5;

elsif key_ok_en='0' then--退出设置

minute_set <= minute_set_temp;

hour_set <= hour_set_temp;

minute_alarm <= minute_a_set_temp;

hour_alarm <= hour_a_set_temp;

--en_set <= '0';--复位低电平有效

disply_ctrl <= "0000";

state := s5;

elsif key_up_en='0' then--跳至分钟设置

disply_ctrl <= "1010";--显示控制

state := s1;

elsif key_down_en='0' then --跳至闹铃分钟设置disply_ctrl <= "1110";--显示控制

state := s3;

elsif key_left_en='0' then--小时减1

if hour_set_temp>"00000" then

hour_set_temp:= hour_set_temp-'1';

else

hour_set_temp:= "00000";

end if;

elsif key_right_en='0' then--小时加1

if hour_set_temp<"10111" then

hour_set_temp:= hour_set_temp+'1';

else

hour_set_temp:= "00000";

end if;

end if;

when s3 => en_set <= '1';--复位低电平有效

if key_rst_en='0' then --有复位键按下

minute_set_temp := "000000";--对时间进行复位

hour_set_temp := "00000";

minute_a_set_temp:= "000000";

hour_a_set_temp := "00000";

--en_set <= '0';--复位低电平有效

state := s5;

elsif key_ok_en='0' then--退出设置

minute_set <= minute_set_temp;

hour_set <= hour_set_temp;

minute_alarm <= minute_a_set_temp;

hour_alarm <= hour_a_set_temp;

--en_set <= '0';--复位低电平有效

disply_ctrl <= "0000";

state := s5;

elsif key_up_en='0' then--跳至小时设置

disply_ctrl <= "1011";--显示控制

state := s2;

elsif key_down_en='0' then --跳至闹铃小时设置disply_ctrl <= "1111";--显示控制

state := s4;

elsif key_left_en='0' then--闹铃分钟减1

if minute_a_set_temp>"000000" then

minute_a_set_temp:= minute_a_set_temp-'1';

else

minute_a_set_temp:= "000000";

end if;

elsif key_right_en='0' then--闹铃分钟加1

if minute_a_set_temp<"111011" then

minute_a_set_temp:= minute_a_set_temp+'1';

else

minute_a_set_temp:= "000000";

end if;

end if;

when s4 => en_set <= '1';--复位低电平有效

if key_rst_en='0' then --有复位键按下

minute_set_temp := "000000";--对时间进行复位

hour_set_temp := "00000";

minute_a_set_temp:= "000000";

hour_a_set_temp := "00000";

--en_set <= '0';--复位低电平有效

state := s5;

elsif key_ok_en='0' then--退出设置

minute_set <= minute_set_temp;

hour_set <= hour_set_temp;

minute_alarm <= minute_a_set_temp;

hour_alarm <= hour_a_set_temp;

--en_set <= '0';--复位低电平有效

disply_ctrl <= "0000";

state := s5;

elsif key_up_en='0' then--跳至闹钟分钟设置

disply_ctrl <= "1110";--显示控制

state := s3;

elsif key_down_en='0' then --跳至分钟设置

disply_ctrl <= "1010";--显示控制

state := s1;

elsif key_left_en='0' then--闹铃小时减1

if hour_a_set_temp>"00000" then

hour_a_set_temp:= hour_a_set_temp-'1';

else

hour_a_set_temp:= "00000";

end if;

elsif key_right_en='0' then--闹铃小时加1

if hour_a_set_temp<"10111" then

hour_a_set_temp:= hour_a_set_temp+'1';

else

hour_a_set_temp:= "00000";

end if;

end if;

when s5 =>state := s0;

en_set <= '0';--置数使能

when others =>state := s0;

en_set <= '1';

minute_set <= minute_set_temp;

hour_set <= hour_set_temp;

minute_alarm <= minute_a_set_temp;

hour_alarm <= hour_a_set_temp;

end case;

minute_set <= minute_set_temp;

hour_set <= hour_set_temp;

minute_alarm <= minute_a_set_temp;

hour_alarm <= hour_a_set_temp;

end if;

end process;

end architecture one;

二进制数转8421BCD码程序:

library IEEE;

use IEEE.STD_LOGIC_1164.all;

entity dec_to_bcd is

port(tt : in std_logic_vector(5 downto 0);

led0 : out integer range 0 to 15;

led1 : out integer range 0 to 15);

end entity;

architecture one of dec_to_bcd is

begin

process(tt)

begin

case tt is

when "000000" => led1<=0;led0<=0;--0

when "000001" => led1<=0;led0<=1;--1

when "000010" => led1<=0;led0<=2;--2

when "000011" => led1<=0;led0<=3;--3

when "000100" => led1<=0;led0<=4;--4

when "000101" => led1<=0;led0<=5;--5

when "000110" => led1<=0;led0<=6;--6

when "000111" => led1<=0;led0<=7;--7

when "001000" => led1<=0;led0<=8;--8

when "001001" => led1<=0;led0<=9;--9

when "001011" => led1<=1;led0<=1;--11 when "001100" => led1<=1;led0<=2;--12 when "001101" => led1<=1;led0<=3;--13 when "001110" => led1<=1;led0<=4;--14 when "001111" => led1<=1;led0<=5;--15 when "010000" => led1<=1;led0<=6;--16 when "010001" => led1<=1;led0<=7;--17 when "010010" => led1<=1;led0<=8;--18 when "010011" => led1<=1;led0<=9;--19 when "010100" => led1<=2;led0<=0;--20 when "010101" => led1<=2;led0<=1;--21 when "010110" => led1<=2;led0<=2;--22 when "010111" => led1<=2;led0<=3;--23 when "011000" => led1<=2;led0<=4;--24 when "011001" => led1<=2;led0<=5;--25 when "011010" => led1<=2;led0<=6;--26 when "011011" => led1<=2;led0<=7;--27 when "011100" => led1<=2;led0<=8;--28 when "011101" => led1<=2;led0<=9;--29 when "011110" => led1<=3;led0<=0;--30 when "011111" => led1<=3;led0<=1;--31 when "100000" => led1<=3;led0<=2;--32 when "100001" => led1<=3;led0<=3;--33 when "100010" => led1<=3;led0<=4;--34 when "100011" => led1<=3;led0<=5;--35 when "100100" => led1<=3;led0<=6;--36 when "100101" => led1<=3;led0<=7;--37 when "100110" => led1<=3;led0<=8;--38 when "100111" => led1<=3;led0<=9;--39 when "101000" => led1<=4;led0<=0;--40 when "101001" => led1<=4;led0<=1;--41 when "101010" => led1<=4;led0<=2;--42 when "101011" => led1<=4;led0<=3;--43 when "101100" => led1<=4;led0<=4;--44 when "101101" => led1<=4;led0<=5;--45 when "101110" => led1<=4;led0<=6;--46 when "101111" => led1<=4;led0<=7;--47 when "110000" => led1<=4;led0<=8;--48 when "110001" => led1<=4;led0<=9;--49 when "110010" => led1<=5;led0<=0;--50 when "110011" => led1<=5;led0<=1;--51 when "110100" => led1<=5;led0<=2;--52 when "110101" => led1<=5;led0<=3;--53

when "110111" => led1<=5;led0<=5;--55

when "111000" => led1<=5;led0<=6;--56

when "111001" => led1<=5;led0<=7;--57

when "111010" => led1<=5;led0<=8;--58

when "111011" => led1<=5;led0<=9;--59

when others => led1<=15;led0<=15;

end case;

end process;

end architecture;

BCD码转七段码程序:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

entity decode is

Port ( a : integer range 0 to 15;

sg: out std_logic_vector (6 downto 0)); end entity;

architecture one of decode is

begin

process(a)

begin

case a is

when 0 => sg<="1000000";

when 1 => sg<="1111001";

when 2 => sg<="0100100";

when 3 => sg<="0110000";

when 4 => sg<="0011001";

when 5 => sg<="0010010";

when 6 => sg<="0000010";

when 7 => sg<="1111000";

when 8 => sg<="0000000";

when 9 => sg<="0010000";

when 10 => sg<="0001000";

when 11 => sg<="0000011";

when 12 => sg<="1000110";

when 13 => sg<="0100001";

when 14 => sg<="0000110";

when 15 => sg<="0000110";

when others => null;

end case;

end process;

end;

architecture two of decode is

begin

WITH a SELECT

sg <= "1000000" WHEN 0,

"1111001" WHEN 1,

"0100100" WHEN 2,

"0110000" WHEN 3,

"0011001" WHEN 4,

"0010010" WHEN 5,

"0000010" WHEN 6,

"1111000" WHEN 7,

"0000000" WHEN 8,

"0010000" WHEN 9,

"0001000" WHEN 10,

"0000011" WHEN 11,

"1000110" WHEN 12,

"0100001" WHEN 13,

"0000110" WHEN 14,

"0001110" WHEN 15,

"1111111" WHEN OTHERS ;

end;

configuration aa of decode is

for two

end for;

end aa;

电子钟主程序:

-------------------包含的库文件-------------------------------- library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use ieee.std_logic_arith.all;

-------------------实体部分------------------------------------

entity digital_clock is

Port ( clk : in std_logic;--系统的时钟信号

key_rst : in std_logic;

key_ok : in std_logic;

key_up : in std_logic;

key_down : in std_logic;

key_left : in std_logic;

key_right : in std_logic;

buzzer : out std_logic;

sg : out std_logic_vector (6 downto 0);--段码bt : out std_logic_vector (5 downto 0));--位码); end entity digital_clock;

-------------------结构体描述----------------------------------

architecture Behavioral of digital_clock is

---------元器件声明

component counter is--计数器

generic (bitwidth:integer;moda:integer);

port (clk,en,en_set:in std_logic;

d :in std_logic_vector(bitwidth-1 downto 0);

cout:out std_logic;

counterout :out std_logic_vector(bitwidth-1 downto 0));

end component;

component decode is--译码器

Port ( a : in integer range 0 to 15;

sg: out std_logic_vector (6 downto 0));

end component;

component dec_to_bcd is--二进制转化为BCD码

port ( tt: in std_logic_vector(5 downto 0);

led1,led0: out integer range 0 to 15);

end component;

component key_detect is

generic (N:integer);

port (clk : in std_logic;

key_rst : in std_logic;

key_ok : in std_logic;

key_up : in std_logic;

key_down : in std_logic;

key_left : in std_logic;

key_right : in std_logic;

key_rst_en : out std_logic;

key_ok_en : out std_logic;

key_up_en : out std_logic;

key_down_en : out std_logic;

key_left_en : out std_logic;

key_right_en : out std_logic);

end component key_detect;

component time_set is

port (clk : in std_logic;

key_rst_en : in std_logic;

key_ok_en : in std_logic;

key_up_en : in std_logic;

key_down_en : in std_logic;

key_left_en : in std_logic;

key_right_en : in std_logic;

minute : in std_logic_vector(5 downto 0);

hour : in std_logic_vector(4 downto 0);--当前的时间

minute_set : out std_logic_vector(5 downto 0);

hour_set : out std_logic_vector(4 downto 0);--分别为分时的设置单元

minute_alarm : out std_logic_vector(5 downto 0);

hour_alarm : out std_logic_vector(4 downto 0);--闹钟时间

en_set : out std_logic;--置数使能

disply_ctrl : out std_logic_vector(3 downto 0));--显示控制

end component time_set;

---------信号的定义

signal countcarry:std_logic;--分频计数器的计数值

signal cnt8:std_logic_vector(2 downto 0);--根据cnt8的计数值循环显示6个位

signal a:integer range 0 to 15;--当前要显示的实际内容,通过译码器后变成段码数据signal clk_0_5s,clk_1s,clk_1m,clk_1h:std_logic;--分别为秒分时的计数时钟

signal clk_0_5s_duty_50:std_logic;

signal second:std_logic_vector(5 downto 0);--秒的计数单元

signal minute:std_logic_vector(5 downto 0);--分的计数单元

signal hour :std_logic_vector(4 downto 0);--时的计数单元

signal second_display:std_logic_vector(5 downto 0);--秒的显示控制单元

signal minute_display:std_logic_vector(5 downto 0);--分的显示控制单元

signal hour_display :std_logic_vector(4 downto 0);--时的显示控制单元

signal no1,no2,no3,no4,no5,no6:integer range 0 to 60;--表示数码管的每一位要显示的内容signal key_rst_en,key_ok_en,key_up_en,key_down_en,key_left_en,key_right_en:std_logic; signal minute_alarm : std_logic_vector(5 downto 0);

signal hour_alarm : std_logic_vector(4 downto 0);

signal minute_set:std_logic_vector(5 downto 0);--分时的计数单元

signal hour_set :std_logic_vector(4 downto 0);--时的计数单元

signal en_set:std_logic;

signal disply_ctrl:std_logic_vector(3 downto 0);

begin

--显示刷新时钟产生部分

u1:counter generic map(bitwidth=>14,moda=>10000)

port

map(clk=>clk,en=>'1',en_set=>'1',d=>conv_std_logic_vector(0,14),cout=>countcarry);

u2:counter generic map(bitwidth=>3,moda=>6)

port

map(clk=>clk,en=>countcarry,en_set=>'1',d=>conv_std_logic_vector(0,3),counterout=>cnt8); u13:counter generic map(bitwidth=>26,moda=>12500000)

port

map(clk=>clk,en=>'1',en_set=>'1',d=>conv_std_logic_vector(0,26),cout=>clk_0_5s);

--数字时钟计数部分

u3:counter generic map(bitwidth=>26,moda=>50000000)--产生秒脉冲

port map(clk=>clk,en=>'1',en_set=>en_set,d=>conv_std_logic_vector(0,26),cout=>clk_1s); u4:counter generic map(bitwidth=>6,moda=>60)

portmap(clk=>clk,en=>clk_1s,en_set=>en_set,d=>conv_std_logic_vector(0,6),cout=>clk_1m,cou nterout=>second); --秒计数单元

u5:counter generic map(bitwidth=>6,moda=>60)

portmap(clk=>clk,en=>clk_1m,en_set=>en_set,d=>minute_set,cout=>clk_1h,counterout=>minut e); --分钟计数单元

u6:counter generic map(bitwidth=>5,moda=>24)

port map(clk=>clk,en=>clk_1h,en_set=>en_set,d=>hour_set,counterout=>hour); --小时计数单元--将时钟计数值变换成8421BCD码部分

u7:dec_to_bcd port map(tt=>('0' & hour_display), led1=>no1, led0=>no2);

u8:dec_to_bcd port map(tt=>minute_display, led1=>no3, led0=>no4);

u9:dec_to_bcd port map(tt=>second_display, led1=>no5, led0=>no6);

u10:decode port map( a=>a,sg=>sg);

u11:key_detect generic map(N=>500000)--延时10ms

port map( clk => clk,

key_rst => key_rst,

key_ok => key_ok,

key_up => key_up,

key_down => key_down,

key_left => key_left,

key_right => key_right,

key_rst_en => key_rst_en,

key_ok_en => key_ok_en,

key_up_en => key_up_en,

key_down_en => key_down_en,

key_left_en => key_left_en,

key_right_en => key_right_en);

u12:time_set port map( clk => clk,

key_rst_en => key_rst_en,

key_ok_en => key_ok_en,

key_up_en => key_up_en,

key_down_en => key_down_en,

key_left_en => key_left_en,

key_right_en => key_right_en,

minute => minute,

hour => hour,

minute_set => minute_set,

hour_set => hour_set,

minute_alarm => minute_alarm,

hour_alarm => hour_alarm,

en_set => en_set,

disply_ctrl => disply_ctrl);

p1:process (clk)

begin

if clk'event and clk='1' then

if clk_0_5s='1'then

clk_0_5s_duty_50 <= not clk_0_5s_duty_50;

end if;

end if;

if disply_ctrl(3 downto 2)="10" then--有键按下

hour_display<=hour_set;

minute_display<=minute_set;

second_display<="000000";

elsif disply_ctrl(3 downto 2)="11" then

hour_display<=hour_alarm;

minute_display<=minute_alarm;

second_display<="110111";

else

hour_display<=hour;

minute_display<=minute;

second_display<=second;

end if;

if hour=hour_alarm and minute=minute_alarm then

buzzer <= '1';----------------------------------------------------------- else

buzzer <= '0';

end if;

end process;

p2:process (cnt8)

begin

case cnt8 is

when "000" => if disply_ctrl(1 downto 0)="11" then

bt <= "111110" or ("11111"& clk_0_5s_duty_50 );

else

bt <= "111110";

end if;

a<=no1;

when "001" => if disply_ctrl(1 downto 0)="11" then

bt <= "111101" or ("1111"& clk_0_5s_duty_50 & '1' );

else

bt <= "111101";

end if;

a<=no2;

when "010" => if disply_ctrl(1 downto 0)="10" then

bt <= "111011" or ("111"& clk_0_5s_duty_50 &"11" );

else

bt <= "111011";

end if;

a<=no3;

when "011" => if disply_ctrl(1 downto 0)="10" then

bt <= "110111" or ("11"& clk_0_5s_duty_50 &"111" );

else

bt <= "110111";

end if;

a<=no4;

when "100" => bt <= "101111"; a<=no5;

when "101" => bt <= "011111"; a<=no6;

when others => bt <= "000000"; a<=15;--null;

end case;

end process;

end;

CPLD可编程数字信号发生器实验

课程: 通信原理 CPLD可编程数字信号发生器实验报告 系电子信息与计算机科学系 专业电子信息科学与技术 班级 姓名 学号 指导教师 实验地点 学年学期

一、实验目的 1、熟悉各种时钟信号的特点及波形。 2、熟悉各种数字信号的特点及波形。 二、实验内容 1、熟悉CPLD可编程信号发生器各测量点波形。 2、测量并分析各测量点波形及数据。 三、实验模块 1、通信原理0 号模块一块 2、示波器一台 四、实验原理 CPLD可编程模块用来产生实验系统所需要的各种时钟信号和各种数字信号。它由CPLD可编程器件ALTERA公司的EPM240T100C5、下载接口电路和一块晶振组成。晶振JZ1用来产生系统内的32.768MHz主时钟。本实验要求参加实验者了解这些信号的产生方法、工作原理以及测量方法,才可通过CPLD可编程器件的二次开发生成这些信号,理论联系实验,提高实际操作能力。 1、CPLD数字信号发生器,包括以下五个部分: ①时钟信号产生电路; ②伪随机码产生电路; ③帧同步信号产生电路; ④NRZ码复用电路及码选信号产生电路; ⑤终端接收解复用电路。 2、24位NRZ码产生电路 本单元产生NRZ信号,信号速率可根据输入时钟不同自行选择,帧结构如下图所示。帧长为24位,其中首位无定义,第2位到第8位是帧同步码(7位巴克码1110010),另外16路为2路数据信号,每路8位。此NRZ信号为集中插入帧同步码时分复用信号。LED亮状态表示1码,熄状态表示0码。 五、实验步骤 1、观测时钟信号输出波形。 信号源输出两组时钟信号,对应输出点为“CLK1”和“CLK2”,拨码开关S4的作用是改变第一组时钟“CLK1”的输出频率,拨码开关S5的作用是改变第二组时钟“CLK2”的输出频率。拨码开关拨上为1,拨下为0,拨码开关和时钟的对应关系如下表所示拨码开关时钟拨码开关时钟 000032.768M1000128K 000116.384M100164K 00108.192M101032K 0011 4.096M101116K

11级电路分析基础实验报告

11级电路分析基础实验报告 篇一:电路分析基础实验 实验一:基尔霍夫定理与电阻串并联 一、实验目的 学习使用workbench软件,学习组建简单直流电路并使用仿真测量仪 表测量电压、电流。 二、实验原理 1、基尔霍夫电流、电压定理的验证。 解决方案:自己设计一个电路,要求至少包括两个回路和两个节点, 测量节点的电流代数和与回路电压代数和,验证基尔霍夫电流和电压 定理并与理论计算值相比较。 2、电阻串并联分压和分流关系验证。 解决方案:自己设计一个电路,要求包括三个以上的电阻,有串联电 阻和并联电阻,测量电阻上的电压和电流,验证电阻串并联分压和分 流关系,并与理论计算值相比较。 三、实验数据分析 1、基尔霍夫电流、电压定理的验证。

测量值验证 (1)对于最左边的外围网孔,取逆时针为参考方向得:U1-U2-U3?20V-8.889V-11.111V?0故满足KVL。 (2)对于最大的外围网孔,取逆时针为参考方向得: U1?I5?R3-U2?20V?(-0.111?100)V-8.889V?0 (3)对于节点4,取流进节点的电流方向为正得: -I1?I2?I3?(--0.444)A?(-0.222)A?(-0.222)A?0 (4)对于节点7,取流进节点的电流方向为正得: -I3?I4?I5?(--0.222)A?(-0.111)A?(-0.111)A?0 理论计算值 U1?I1?(R1?R2//R3//R4) IU1204 1?(R?A?A 1?R2//R3//R4)459 I3//R4 2?R RR?I?1?4A?2 1A 2?R3//4299 I(I422 3?1-I2)?(9-9)A?9A IR1 312

FPGA与CPLD

FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。 CPLD与FPGA的关系 早在1980年代中期,FPGA已经在PLD设备中扎根。CPLD和FPGA包括了一些相对大数量的可以编辑逻辑单元。CPLD逻辑门的密度在几千到几万个逻辑单元之间,而FPGA通常是在几万到几百万。 CPLD和FPGA的主要区别是他们的系统结构。CPLD是一个有点限制性的结构。这个结构由一个或者多个可编辑的结果之和的逻辑组列和一些相对少量的锁定的寄存器。这样的结果是缺乏编辑灵活性,但是却有可以预计的延迟时间和逻辑单元对连接单元高比率的优点。而FPGA却是有很多的连接单元,这样虽然让它可以更加灵活的编辑,但是结构却复杂的多。 CPLD和FPGA另外一个区别是大多数的FPGA含有高层次的内置模块(比如加法器和乘法器)和内置的记忆体。一个因此有关的重要区别是很多新的FPGA支持完全的或者部分的系统内重新配置。允许他们的设计随着系统升级或者动态重新配置而改变。一些FPGA可以让设备的一部分重新编辑而 FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。FPGA的基本特点 1)采用FPGA设计ASIC电路(特定用途集成电路),用户不需要投片生产,就能得到合用的芯片。 2)FPGA可做其它全定制或半定制ASIC电路的中试样片。 3)FPGA内部有丰富的触发器和I/O引脚。 4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。 5) FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。 可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。 FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式。 加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完

计算机组成原理实验报告

实验报告书 实验名称:计算机组成原理实验 专业班级:113030701 学号:113030701 姓名: 联系电话: 指导老师:张光建 实验时间:2015.4.30-2015.6.25

实验二基本运算器实验 一、实验内容 1、根据原理图连接实验电路

3、比较实验结果与手工运算结果,如有错误,分析原因。 二、实验原理 运算器可以完成算术,逻辑,移位运算,数据来自暂存器A和B,运算方式由S3-S0以及CN来控制。运算器由一片CPLD来实现。ALU的输入和输出通过三态门74LS245连接到CPU内总线上。另外还有指示灯进位标志位FC和零标志位FZ。 运算器原理图: 运算器原理图 暂存器A和暂存器B的数据能在LED灯上实时显示。进位进位标志FC、零标志FZ 和数据总线D7…D0 的显示原理也是如此。 ALU和外围电路连接原理图:

ALU和外围电路连接原理图运算器逻辑功能表:

三、实验步骤 1、按照下图的接线图,连接电路。 2、将时序与操作台单元的开关KK2 置为‘单拍’档,开关KK1、KK3 置为‘运行’档。 3、打开电源开关,如果听到有‘嘀’报警声,说明有总线竞争现象,应立即关闭电源,重新检查接线,直到错误排除。然后按动CON 单元的CLR 按钮,将运算器的A、B 和FC、FZ 清零。 4、用输入开关向暂存器A 置数。 ①拨动CON 单元的SD27…SD20 数据开关,形成二进制数01100101 (或其它数值),数据显示亮为‘1’,灭为‘0’。 ②置LDA=1,LDB=0,连续按动时序单元的ST 按钮,产生一个T4 上沿,则将二进制数01100101 置入暂存器A 中,暂存器A 的值通过ALU 单元的 A7…A0 八位LED 灯显示。 5、用输入开关向暂存器B 置数。 ①拨动CON 单元的SD27…SD20 数据开关,形成二进制数10100111 (或其它数值)。 ②置LDA=0,LDB=1,连续按动时序单元的ST 按钮,产生一个T4 上沿,则将二进制数10100111 置入暂存器B 中,暂存器B 的值通过ALU 单元的 B7…B0 八位LED 灯显示。 6、改变运算器的功能设置,观察运算器的输出。置ALU_B=0 、LDA=0、LDB=0,然后按表2-2-1 置S3、S2、S1、S0 和Cn的数值,并观察数据总线LED 显示灯显示的结果。如置S3、S2、S1、S0 为0010 ,运算器作逻辑与运算,置S3、S2、

11级建筑《建筑工程测量》实验报告(学生) 2

建筑工程测量 实验报告 专业 年级 班级 学号 姓名 2013年月日 实验报告一

日期 20131013 班组学号姓名 ㈠完成下列填空 1.安置仪器后,转动脚螺旋使圆水准器气泡居中,转动 目镜看清十字丝,通过缺口和准星瞄准水准尺,转动微动螺旋精确照准水准尺,转动调焦镜消除视差,转动微倾螺旋使符合水准器气泡居中,最后读数。 2.消除视差的步骤是转动目镜使十字丝清晰,再转动 调焦镜使目标清晰。 ㈡实验记录和计算 1.记录水准尺上读数填入表1-1中。 表1-1 2.计算(注:依据[黑+(红-K)]/2的结果数据) ⑴ A点比B点(高、低)高 m。 ⑵ A点比C点(高、低)低 m。 ⑶ B点比C点(高、低)低 m。 ⑷假设C点的高程H C= 136.785 m,求A点和B点的高程,即:

A A= -265.715 m, H B= -471.715 m,水准仪的视线高程H I= 1019.785 m。 ㈢写出图1-1中水准仪各部件的名称 图1-1 1)目镜;2)望远镜物镜; 3)水准管;4)水平微动螺旋; 5)圆水准器;6)校正螺丝; 7)水平制动螺旋;8)准心; 9)脚螺旋;10)微倾螺旋; 11)水平微动螺旋;12)物镜对光螺旋; 13)缺口;14)三角架。 实验报告二水准测量 日期班组学号姓名 ㈠水准测量的外业记录及其高程计算 实验数据记入表2-1,进行高程的计算,并进行验算,以确保各项计算准确无误。 表2-1 水准测量的外业记录及其高程计算

续表

㈡水准测量的内业整理及待测点的高程计算将表2-1的计算结果填入表2-2,求各个待定点的高程 表2-2 各待定点高程的计算

CPLD和FPGA区别

CPLD和FPGA区别 可编程逻辑器件主要包括FPGA和CPLD,FPGA是Field Programmable Gate Array缩写,CPLD是plex Promrammable Logic Device的缩写。 从可编程逻辑器件的发展历史上来讲,CPLD一般是指采用乘积相结构的基于EEPROM 的器件,所以具有非挥发的,不需要外部配置ROM,具有XX性和有限次编程次数(根据不同的结构,从100次到1万次不等)等特点,适合用在胶合逻辑(glue logic,如DSP芯片外围的译码逻辑),IO扩展,IO电平转换,FPGA芯片配置等应用场合。如Altera的MAX7000和MAX3000系列芯片,Xilinx的XC9500和CoolRunner/II系列芯片,Lattice的ispMACH4000/Z系列芯片都是CPLD器件,容量从32宏单元到512宏单元不等。 FPGA主要是指采用四输入查找表(LUT4)的基于SRAM的器件,因为SRAM是挥发的,掉电丢失数据,所以FPGA需要外部配置ROM,上电的时候,从外部的ROM把FPGA的配置数据导入到FPGA芯片内部后工作。具有SRAM的FPGA采用标准的CMOS制造工艺,可以随着最新的工艺而更新还代,给用户带来了实惠;衡量FPGA容量的一个基本指标是逻辑单元(Logic cell或者Logic element),由一个可编程得LUT4和一个可编程的DFF组成,LUT4完成组合逻辑功能, 而DFF用来实现时序功能。FPGA的容量从几千的逻辑单元到几十万的逻辑单元不等。如Altera的Cyclone/II/III和Stratix/II/III系列芯片,Xilinx Spartan3/3E/3A/3AN 和Virtex4/5系列芯片都是FPGA器件。 随着芯片技术的发展,CPLD和FPGA的概念已经模糊在一起,如Altera和Lattice 公司把小容量(小于2K左右逻辑单元)非挥发的可编程器件归到CPLD里,如Altera的MAXII 系列和Lattice的MACH XO系列芯片,把基于SRAM的FPGA和FLASH的储存单元做到一个芯片里面,以及跟传统的CPLD不一样了; 总之,我们可以简单的区分FPGA和CPLD,CPLD:小容量(<2K左右LE)的非挥发的可编程器件;其它的可编程器件都可归到FPGA。 系统的比较:

CPLD课程实验报告

CPLD课程学习报告 八周的CPLD及电子CAD实验结束了,回忆着过去八周的学习,收获很多。这八周的学习,是我从一个对CPLD完全没有概念的人变得能完成数字时钟及其扩展,其中虽然遇到了很多困难,但当困难被克服,实验结果出来是的喜悦是难以言状的。下面,分别讲述这八次课的收获和心得。 学习上,学到了知识,肯定是不小的收获,但在学习之外,我也收获了很多,首先,做实验的时候是既有分组又有合作的的,说道合作,我们了解了一个团队协作的重要性,开始的时候,由于和搭档不认识,出现过一些矛盾,但后来,我们明白了,只有协作,才能更好的完成一项工作。所以,这是我的一个很重要的收获。 回归正题,讲讲学习的收获。 首先,实验所使用的软件是:MAX+PLUSII,共完成了数字时钟及其调时,整点报时,秒表和闹钟的应用等,分别应用了文字及图形的编程方法,将所设计的电路功能下载到EPIK30TC144-1器件,以实现我们所需要的功能。 数字时钟可实现的功能 1、时、分、秒六位数码管显示(标准时间23点59分59秒); 2、具有小时、分钟校准功能; 整点报时:55,56,57,58,59低音响,整点高音,间断振铃(嘟--嘟--嘟--嘟--嘟--嘀)。

3、跑表:最大计时99秒99毫秒。独立的跑表功能,不影响数字钟正常工作。 4、定时闹钟:可在00:01到23:59之间由用户设定任一时间,到时报警。 第一课:10进制、6进制计数器 对于以上计数器,采用VHDL代码书写,(截屏如下) 图一:10进制VHDL文本 在书写VHDL文本时,应当注意文字的准确性和无错误,最值得注意的是:保存文本时应注意其文件扩展名一定要为VHD,且要注意前后文件明要保持一致。文本通过调试无错误后,接着要分配管脚, 启动MAX+PLUS~Floorplan Editor菜单命令,分别通过老师所给的管

CPLD实验报告计数器及时序电路

内蒙古工业大学信息工程学院实验报告 课程名称: CPLD/FPGA 应用开发技术 实验名称:组合逻辑电路的设计 实验类型:验证性□ 综合性□ 设计性■ 实验室名称:信息学院机房 班级:电子09-1班学号:200920203061 姓名:张佳兴组别: 同组人:成绩: 实验日期: 2012年5月2日

预习报告成绩:指导教师审核(签名):年月日 预习报告 实验二计数器及时序电路 一、实验目的: 1、了解时序电路的VHDL语言设计方法。 2、了解同步计数器的使用方法。 3、理解时序电路和同步计数器加译码电路的联系,设计任意编码计数器。 二、实验设备: 1、PC机 2、EDA实验箱(主芯片是ALTERA EPM7128SLC84-15)。 三、实验内容: 1、用VHDL语言输入法设计一个同步四位二进制加法计数器和六进制同步计 数器。 2、用74LS161两个宏连接成八位二进制同步计数器。 3、用74LS161宏,同时采用清零和置数法组成六进制和十二进制计数器。 四、实验步骤: 1、采用文本编辑器输入VHDL语言源程序,或采用原理图输入法从MF库中 调用器件74161,生成原理图,之后建立工程。 2、编译。 3、仿真。 4、对芯片进行编程。 5、根据管脚分配情况连线。 (1)根据芯片特点,管脚分配时一般将时钟信号分配给83脚,复位信号分配给1脚。若有使能信号,使能信号分配给84脚。 (2)时钟信号的连接:将实验板上提供的时钟与芯片的83脚相连。 (3)复位信号的连接:将实验板上的某按键开关输出与芯片的1脚相连。 (4)将计数器的输出端分别与LED灯相连。 6、按动复位键,观察实验结果。 7、改变输入时钟信号的频率,观察实验结果。

5分钟学会使用CPLD(FPGA)

5分钟学会使用CPLD 当今社会,随着电子行业的发展,大规模集成电路的运用越来越普遍,用CPLD/FPGA 来开发新产品是当前很多实际情况的需求。在此本人结合到自己的所学,利用业余时间草写了一个简单的使用说明,不要求有丰富经验的大虾来驻足观望,只希望对吾辈刚入门的菜鸟们起到一个抛砖引玉的作用。由于水平有限,文中错误在所难免,望各位提出宝贵的意见。 1.首先请准备一套简单的CPLD原理图。在此我们准备了如下所示的简单一个系统图。晶体用10M的有源晶体,可以在线下载的JTAG接口。电源用5转3.3V的电源模块AS1117。1个1K的排阻。8个发光管在程序运行时轮流点亮。 2.安装XILINX的集成编译软件ISE5.0或6.0。因为ISE在运行时比较消耗计算机的内存,所以要求计算机配置符合相关的要求,高一点的配置,不至于在运行时死机。 3.准备一小段verilog hdl编写一段小代码,主要用来验证系统板的正确。 其中也可以用VHDL来编写,考虑到verilog hdl比较接近C语言,对初级学者来说,相对所花时间较短,上手较快。在此我推荐学verilog hdl。具体的参考书可以看下面的提示:

4.此我们用下面的一小段代码作为范例:其功能是驱动8个发光管轮流点亮,因为是采用了10M频率晶体的边沿触发,所以速度很快,为了使我们肉眼能够看的清楚其工作的流程,我们在里面安放了一个计数器,计数器计每次满一次就点亮一个发光管,依次类推。。。。。。其源程序如下: /* 流水灯的V erilog-HDL描述*/ module LEDWA TER(reset,CLK,LED); input reset, CLK; output [7:0] LED; reg [7:0] LED;//=8'b11111111; reg [17:0] buffer;//=0; reg exchange; always@(posedge CLK) if(reset==0) //如果复位了就熄灭全部的灯 begin LED=8'b1111_1111; buffer=0; exchange=0; end else begin if (exchange==0) begin buffer=(buffer +1); if ( buffer == 17'b111111111111111111111111) begin buffer=0; LED=(LED-1); if(LED==8'b0000_0000) begin LED=8'b1111_1111; exchange=1; end end end if(exchange==1) begin buffer=(buffer +1); if ( buffer == 17'b111111111111111111111111) begin buffer=0; LED=(LED>>1); if(LED==8'b00000000) begin LED=8'b1111_1111;

10-11-2实验报告(答案)

《C程序设计》实验报告 学期:2010--2011学年第二学期 教师姓名: 教研室:

实验1 熟悉C语言程序的运行环境,掌握数据描述 实验目的 1.了解在开发环境中如何编辑、编译、连接和运行一个C语言程序。 2.通过运行简单的C语言程序,初步了解C语言程序的结构特点。 3.掌握C语言数据类型的概念,学会使用C语言的相关运算符构成表达式。 实验预习 1.熟悉Visual C++的启动和退出及Visual C++中的编辑、编译、连接和运行命令。 2.了解下列命令及函数:include<>、main、printf、scanf。 3.熟悉Visual C++环境下每个菜单项的功能及相关命令对应的操作。 4.各种数据类型变量的定义形式及取值范围;熟悉下列标识符的含义。 int、short (int)、long (int)、unsigned (int)、float、double、char、void 5.各类运算符的优先级和结合规则。 6.常量与变量的区别和联系。 运行环境: 1.双击桌面Visual C++快捷方式进入Visual C++,或通过执行“开始——>程序——> Microsoft Visual Studio ——> Microsoft Visual C++6.0”或执行文件"C:\Program Files\Microsoft Visual Studio\COMMON\MSDev98\Bin\"。 2.单击“文件”菜单的“新建”命令。 3.在打开的“新建”对话框中选择“文件”标签。 4.选择C++ Source File,在目录输入栏选择文件保存位置,然后在文件输入栏中输入文件名,扩展名为.c (例如,单击确定按钮。如图所示:

CPLD与FPGA的区别

CPLD/FPGA的区别 CPLD和FPGA是20世纪80年代中后期出现的,Altera公司和Xilinx公司分别推出了类似于PAL结构的扩展型CPLD(Complex Programmable Logic Device)和与标准阵列类似的FPGA(Field Programmable Gate Array),它们都具有体系结构、逻辑单元灵活、集成度高、适用范围宽、用户可编程等特点。 利用CPLD/FPGA芯片,电子系统设计工程师可以在实验室中设计出专用IC,实现系统的集成,从而大大缩短了产品开发上市的时间、降低了开发成本。此外,CPLD/FPGA还具有静态可重复编程或在线动态重构特性,使硬件的功能可像软件一样通过编程来修改,不仅使设计修改和产品升级变得十分方便,而且极大地提高了电子系统的灵活性和通用能力。 CPLD和FPGA都是可编程的,二者有许多相似的地方,但二者也有显著的本质区别,二者之间的区别主要在于: (1)CPLD更适合完成各种算法和组合逻辑,FPGA更适合于完成时序逻辑,例如触发器多的电路结构适合使用FPGA,而CPLD适用于触发器少而乘积项多的电路结构; (2)CPLD的内部组成结构决定了它的时序延迟是均匀和可预测的,而FPGA的组成结构决定了它的延迟是不可预测的; (3)在编程上FPGA比CPLD更具有灵活性,CPLD通过修改具有固定内连电路的逻辑功能来编程,而FPGA主要通过改变内部连线的布线来编程; (4)CPLD比FPGA使用起来更方便。CPLD的编程采用EEPROM或FLASH 技术,掉电可以保存数据和程序,所以无需另外的外部存储器芯片来存放程序和数据,使用起来简单;而FPGA内部使用的是SDRAM,掉电后会丢失编程信息,所以需要外部存储器,使用方法复杂; (5)在编程次数上,CPLD使用EEPROM或FLASH,编程次数可达1万次左右,而FPGA使用SDRAM编程,所以其编程次数为无限次;CPLD的优点是系统掉电编程信息不丢失; (6)CPLD保密性好、FPGA保密性差; (7)一般CPLD的功耗比FPGA要高,集成度越高越明显。

实验九 QPSK调制与解调实验报告

实验九QPSK/OQPSK 调制与解调实验 一、实验目的 1、了解用CPLD 进行电路设计的基本方法。 2、掌握QPSK 调制与解调的原理。 3、通过本实验掌握星座图的概念、星座图的产生原理及方法,了解星座图的作用及工程上的作用。 二、实验内容 1、观察QPSK 调制的各种波形。 2、观察QPSK 解调的各种波形。 三、实验器材 1、信号源模块 一块 2、⑤号模块 一块 3、20M 双踪示波器 一台 4、 连接线 若干 四、实验原理 (一)QPSK 调制解调原理 1、QPSK 调制 QPSK 信号的产生方法可分为调相法和相位选择法。 用调相法产生QPSK 信号的组成方框图如图12-1(a )所示。图中,串/并变换器将输入的二进制序列依次分为两个并行的双极性序列。设两个序列中的二进制数字分别为a 和b ,每一对ab 称为一个双比特码元。双极性的a 和b 脉冲通过两个平衡调制器分别对同相载波及正交载波进行二相调制,得到图12-1(b )中虚线矢量。将两路输出叠加,即得如图12-1(b )中实线所示的四相移相信号,其相位编码逻辑关系如表12-1所示。 (a ) a(0)b(0) b(1) a(1) (b ) 图12-1 QPSK 调制 /并变换。串/并变换器将输入的二进制序列分为两个并行的双极性序列110010*********和

111101*********。双极性的a 和b 脉冲通过两个平衡调制器分别对同相载波及正交载波进行二相调制,然后将两路输出叠加,即得到QPSK 调制信号。 2、QPSK 解调 图12-2 QPSK 相干解调器 由于四相绝对移相信号可以看作是两个正交2PSK 信号的合成,故它可以采用与2PSK 信号类似的解调方法进行解调,即由两个2PSK 信号相干解调器构成,其组成方框图如图12-2所示。图中的并/串变换器的作用与调制器中的串/并变换器相反,它是用来将上、下支路所得到的并行数据恢复成串行数据的。 (二)OQPSK 调制解调原理 OQPSK 又叫偏移四相相移键控,它是基于QPSK 的改进型,为了克服QPSK 中过零点的相位跃变特性,以及由此带来的幅度起伏不恒定和频带的展宽(通过带限系统后)等一系列问题。若将QPSK 中并行的I ,Q 两路码元错开时间(如半个码元),称这类QPSK 为偏移QPSK 或OQPSK 。通过I ,Q 路码元错开半个码元调制之后的波形,其载波相位跃变由180°降至90°,避免了过零点,从而大大降低了峰平比和频带的展宽。 下面通过一个具体的例子说明某个带宽波形序列的I 路,Q 路波形,以及经载波调制以后相位变化情况。 若给定基带信号序列为1 -1 -1 1 1 1 1 -1 -1 1 1 -1 对应的QPSK 与OQPSK 发送波形如图12-3所示。 1-1-11111-1-111-1111-11-111-11-1-111-11-1 基基基基I 基基Q P S K ,O Q P S K Q 基基 Q P S K Q 基基O Q P S K -1 图12-3 QPSK,OQPSK 发送信号波形 图12-3中,I 信道为U (t )的奇数数据单元,Q 信道为U (t )的偶数数据单元,而OQPSK 的Q 信道与其I 信道错开(延时)半个码元。 QPSK ,OQPSK 载波相位变化公式为 {}()33arctan ,,,()44 44j i j i Q t I t ππ?ππ? ????? =--???? ?????? ?@ QPSK 数据码元对应的相位变化如图12-4所示,OQPSK 数据码元对应相位变化如图 12-5所示

实验报告11

大连理工大学本科实验报告实验名称:输入阻抗测量及匹配技术 课程名称:电磁场与微波技术实验 学院(系):电子信息与电气工程学部 专业:电子信息工程 班级:电子1303班 学号:201383097 学生姓名:王英明 同组人:刘阳 完成日期:2016年5月26日

一、实验数据的整理与分析 见数据报告。 二、实验结果的分析 1、整理数据,算出在测量线上测得的器件的阻抗的测量值(归一化值),在smith圆图上标出。 测量H面喇叭天线输入阻抗 归一化阻抗为1.169-j0.55 点TP3即为该归一化值在smith圆图上 的位置 2、实验现象及存在的问题的讨论。 调匹配过程: 从调匹配过程的史密斯圆图(见下图)可以看出调匹配过程曲线逐渐接近匹配点。当 =1.026时,由于近乎匹配,实验精度无法测量,不能计算出其逆时针旋转的角度。但不管转多少角度,其依然是很接近匹配点。 归一化阻抗为1.3072-j0.4558 点TP3即为该归一化值在smith圆图上 的位置

归一化阻抗为1.204+j0.029 点TP3即为该归一化值在smith圆图上 的位置 归一化阻抗为1.0998+j0.0622 点TP3即为该归一化值在smith圆图上 的位置 三、问题与建议、体会 1、测量微波元件阻抗时,为什么首先在测量线上确定“等效负载参考面”? 当确定其相移时,需要有参考位置才能在换上喇叭天线导致行驻波相移之后确定其相移大小。 2、测量dmin时,为什么一定要知道节点的移动方向?如何决定dmin? 只有知道节点的移动方向,在利用smith圆图时才知道应该是往源转动还是往负载方向移动。 利用交叉读数取中值法确定dmin位置,所有的特征点都应该用交叉读数法以证明其正确性。 3、试说明滑动单螺调匹配时,造成匹配频率敏感性的原因,通过实验你能说明滑动单螺调匹配器有哪些特点吗? 正常工作时,工作模式在TE10模,若频率变化可能会出现别的工作模式或全部截止,导致结果有误。故匹配频率敏感性主要是多模传输造成的。 滑动单螺调匹配器是插入矩形波导中的一个穿深度可以调节的螺钉,并可沿矩形波导宽壁中心无辐射缝作纵向移动。 本实验需要耐心和细心,慢慢逼近匹配点。处理数据时学会了利用画smith圆图求归一化阻抗,验证发现smith圆图得出的结果与计算得出的结果一致。Smith圆图确实是很好用的方法。

实验九QPSK调制与解调实验报告

实验九Q P S K/O Q P S K调制与解调实验 一、实验目的 1、了解用CPLD进行电路设计的基本方法。 2、掌握QPSK调制与解调的原理。 3、通过本实验掌握星座图的概念、星座图的产生原理及方法,了解星座图的作用及工程上的作用。 二、实验内容 1、观察QPSK调制的各种波形。 2、观察QPSK解调的各种波形。 三、实验器材 1、信号源模块一块 2、⑤号模块一块 3、20M双踪示波器一台 4、连接线若干 四、实验原理 (一)QPSK调制解调原理 1、QPSK调制 QPSK信号的产生方法可分为调相法和相位选择法。 用调相法产生QPSK信号的组成方框图如图12-1(a)所示。图中,串/并变换器将输入的二进制序列依次分为两个并行的双极性序列。设两个序列中的二进制数字分别为a和b,每一对ab称为一个双比特码元。双极性的a和b脉冲通过两个平衡调制器分别对同相载波及正交载波进行二相调制,得到图12-1(b)中虚线矢量。将两路输出叠加,即得如图12-1(b)中实线所示的四相移相信号,其相位编码逻辑关系如表12-1所示。 (a) (b) 图12-1 QPSK调制 2、QPSK解调 图12-2 QPSK相干解调器 由于四相绝对移相信号可以看作是两个正交2PSK信号的合成,故它可以采用与2PSK信号类似的解调方法进行解调,即由两个2PSK信号相干解调器构成,其组成方框图如图12-2所示。图中的并/串变换器的作用与调制器中的串/并变换器相反,它是用来将上、下支路所得到的并行数据恢复成串行数据的。(二)OQPSK调制解调原理 OQPSK又叫偏移四相相移键控,它是基于QPSK的改进型,为了克服QPSK中过零点的相位跃变特性,以及由此带来的幅度起伏不恒定和频带的展宽(通过带限系统后)等一系列问题。若将QPSK中并行的I,Q两路码元错开时间(如半个码元),称这类QPSK为偏移QPSK或OQPSK。通过I,Q路码元错开半个码元调制之后的波形,其载波相位跃变由180°降至90°,避免了过零点,从而大大降低了峰平比和频带的展宽。 下面通过一个具体的例子说明某个带宽波形序列的I路,Q路波形,以及经载波调制以后相位变化情况。 若给定基带信号序列为1 -1 -1 1 1 1 1 -1 -1 1 1 -1 对应的QPSK与OQPSK发送波形如图12-3所示。 图12-3 QPSK,OQPSK发送信号波形 图12-3中,I信道为U(t)的奇数数据单元,Q信道为U(t)的偶数数据单元,而OQPSK的Q信道

python实验报告

西安交通大学实验报告 课程名称:大学计算机基础 实验名称:实验8 数据查询 学 院:________理学院___ _ 实 验 日 期 2015 年 11 月 04日 班 级:________物理52________ 姓 名:______金诚挚__________ 学 号: 2150900044 诚信承诺:我保证本实验报告中的程序和本实验报告是我自己编写。 一、实验目的 (1)理解查询的概念; (2)掌握使用SQL语言查询数据库中数据的方法; (3)掌握使用SQL语句进行插入、删除和更新的方法。 二、实验环境 操作系统:Windows 应用软件:SQLite 三、实验内容与结果 (若是编程题,请写出题目、源程序和运行结果的截图) 题目 (1)创建borrow数据表,实施参照完整性,插入数据。 (2)完成实验指导书p97-p99的查询。 将实验指导书59-99页由“·”标记的查询语句(包括插入、修改和删除的)按顺序编号,共15个,标号(1)-(15),写出(6)-(15)号的查询语句,执行,将查询语句和查询结果截图粘贴到实验报告(实验报告使用标准模版)中。截图时,标明是哪个题目的图。 (3)完成实验4-2后的练习题(1)、(2)、(3)、(6)、(7)(写语句,对语句和结果截图)。 实验结果

(1)查询20岁以下读者的学号,姓名和年龄 (2)查询“孙嘉”所借书的ISBN号和借阅日期 (3)查询所有学生借书的ISBN和日期 (4)查询在2009年12月1日以后读者的学号和姓名 (5)统计学生人数,平均年龄,查询学生最大年龄最小年龄和年龄差 (6)在读者登记表中添加一个记录,修改一个记录,删除一个记录

认清CPLD和FPGA

认清CPLD和FPGA CPLD和FPGA都是我们经常会用到的器件。有的说有配置芯片的是FPGA,没有的是CPLD;有的说逻辑资源多的是FPGA,少的是CPLD;有的直接就不做区分,把他们都叫做FPGA。那么两者到底有什么区别呢?下面我们就以Altera公司的CPLD和FPGA为例来说说两者的区别。 首先我们看一下CPLD的芯片结构,搞清楚CPLD是由哪几部分组成的。下图是MAX 系列CPLD的芯片结构图: 从图中可以清楚的看出来CPLD主要由三部分组成:Macro cell(宏单元),PIA(可编程连线),和IO Control Block(IO控制块)。每个宏单元都与GCLK(全局时钟)OE(输出使 能)GCLR(清零)等控制信号直接相连,并且延时相同。各宏单元之间也由固定长度的金属线互连,这样保证逻辑电路的延时固定。其中宏单元模块是CPLD的逻辑功能实现单元,是器件的基本单元,我们设计的逻辑电路就是由宏单元具体实现的。下面我们再来看看宏单元的具体结构:

一个宏单元主要包括了LAB Local Array(逻辑阵列),Product-Term Select Matrix(乘积项选择矩阵)和一个可编程D触发器组成。其中逻辑阵列的每一个交叉点都可以通过编程实现导通从而实现与逻辑,乘积项选择矩阵可实现或逻辑。这两部分协同工作,就可以实现一个完整的组合逻辑。输出可以选择通过D触发器,也可以对触发器进行旁路。通过这个结构可以发现,CPLD非常适合实现组合逻辑,再配合后面的触发器也能够实现一定的时序逻辑。 我们再来以cyclone系列为例看看FPGA的内部结构:

光纤通信实验报告

一、实验目的 1.了解数字光发端机平均输出光功率的指标要求 2.掌握数字光发端机平均输出光功率的测试方法 3.了解数字光发端机的消光比的指标要求 4.掌握数字光发端机的消光比的测试方法 二、实验仪器 1.ZYE4301G型光纤通信原理实验箱1台 2.光功率计1台 3.FC/PC-FC/PC单模光跳线1根 4.示波器1台 5.850nm光发端机1个 6.ST/PC-FC/PC多模光跳线1根 三、实验原理 四、实验内容 1.测试数字光发端机的平均光功率 2.测试数字光发端机的消光比 3.比较驱动电流的不同对平均光功率和消光比的影响 五、实验步骤 A、1550nm数字光发端机平均光功率及消光比测试 1.伪随机码的产生:伪随机码由CPLD下载模块产生,请参看系统简介中的CPLD下载模块。将PCM编译码模块的4.096MH Z时钟信号输出端T661与CPLD下载模块的NRZ信号产生电路的信号输入端T983连接,NRZ信号输出端T980将产生4M速率24-1位的伪随机信号,用示波器观测此信号。将此信号与1550nm光发模块输入端T151连接,作为信号源接入1550nm光发端机。 2.用FC-FC光纤跳线将光发端机的输出端1550T与光功率计连接,形成平均光功率测试系统,调整光功率计,使适合测1550nm信号。 3.用K60、K90和K15接通PCM编译码模块、CPLD模块和光发模块的电源。 4.用光功率计测量此时光发端机的光功率,即为光发端机的平均光功率。 5.测消光比用数字信号源模块输出的NRZ码作为信号源。用K60接通电源,用用示波器从T504观测此信号,将K511接1、2或2、3可观测到速率的变化,将此信号接到T151,作为伪随机信号接入光发端机。 6.用数字信号源模块的K501、K502、K503将数字信号拨为全“1”,测得此时光功率为P1,将数字信号拨为全“0”,测得此时光功率为P0。 7.将P1,P0代入公式2-1式即得1550nm数字光纤传输系统消光比。 B、1310nm数字发端机平均光功率及消光比测试 8.信号源仍用4M速率24-1位的伪随机信号,与1310nm光发模块输入端T101连接。 9.用FC-FC光纤跳线将1310nm光发模块输出端1310T与光功率计连接,形成平均光功率测试系统,调整光功率计,使适合测1310nm信号。 10.将BM1拨至数字,BM2拨至1310nm。 11.接通PCM编译码模块、CPLD模块和1310nm光发模块(用K10)的电源。 12.用万用表在T103和T104监控R110(阻值为1Ω)两端电压,调节电位器W101,使半导体激光器驱动电流为额定值25mA。 13.用光功率计测量此时光发端机的光功率,即为光发端机的平均光功率。 14.测消光比用数字信号源模块输出的NRZ码作为信号源,请参看系统简介中的数字信号源模块部分。用示波器从T504观测此信号,连接T504与T101,将数字信号拨为全“1”,测得此时光功率为P1,将数字信号拨为全“0”,测得此时光功率为P0。

可编程逻辑器件、FPGA、CPLD实验报告1

CPLD/FPGA 设计实验报告 实验名称: 组合电路设计基础 实验目的: 掌握Quartus II 软件的基本使用方法,完成基本组合电路设计 学生姓名: 学号: 实验内容: 实验一 半加器 一、 创建工程 工程名称:add_half 顶层实体文件名:add_half 器件:EPM7032SLC44-10 二、 创建文件 创建Block Diagram/Schematic 文件,实现一个半加器功能电路。 三、 编译工程 报告中下列数据是多少 total macrocells:2 total pins:8 装 订 线

四、仿真电路 1、创建VWF文件 2、设定“End Time”为20us 3、在VWF文件中添加Node OR Bus 4、编辑波形 5、仿真 6、画出仿真结果 实验二全加器 一、创建工程 工程名称:add_all 顶层实体文件名:add_all 器件:EPM7032SLC44-10 二、创建文件 创建Block Diagram/Schematic文件,实现一个全加器功能电路。

三、编译工程 报告中下列数据是多少 total macrocells:2 total pins:9 四、仿真电路 1.创建VWF文件 2.设定“End Time”为20us 3.在VWF文件中添加Node OR Bus 4.编辑波形 5.仿真 6.画出仿真结果 实验三模十计数器 一、创建工程 工程名称:count10 顶层实体文件名:count10 器件:EP1C3T100C8 二、创建文件 创建Block Diagram/Schematic文件,实现一个模十计数器功能电路。

操作系统课程实验报告(完整版)

. . 中南大学 《操作系统》实验报告 姓名:福星 专业班级:软件 1006班 学号: 完成日期: 2011.11.22

进程调度与存管理 一、实验目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就续进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。实验模拟实现处理机调度,以加深了解处理机调度的工作,并体会优先级和时间片轮转调度算法的具体实施方法。帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收。 二、实验要求 1、可随机输入若干进程,并按优先权排序; 2、从就绪队首选进程运行:优先权-1/要求运行时间-1 要求运行时间=0时,撤销该进程 3、重新排序,进行下轮调度。 4、可随时增加进程; 5、规定道数,设置后备队列和挂起状态。若存中进程少于规定道数,可自动从后备队 列调度一作业进入。被挂起进程入挂起队列,设置解挂功能用于将指定挂起进程解挂入就绪队列。 6、每次调度后,显示各进程状态。 7、自行假设主存空间大小,预设操作系统所占大小并构造未分分区表; 表目容:起址、长度、状态(未分/空表目) 8、结合以上实验,PCB增加为: {PID,要求运行时间,优先权,状态,所需主存大小,主存起始位置, PCB指针} 9、采用最先适应算法分配主存空间; 10、进程完成后,回收主存,并与相邻空闲分区合并。 11、采用图形界面;

三、实验容 选择一个调度算法,实现处理机调度。 1、设计一个按优先权调度算法实现处理机调度的程序; 2、设计按时间片轮转实现处理机调度的程序。 3、主存储器空间的分配和回收。在可变分区管理方式下,采用最先适应算法实现主存空间的分配和回收。 四、实验原理 该模拟系统采用java语言实现,要实现的功能有新建进程、进程调度、挂起进程、解挂进程、删除进程,道数和时间片大小可以由用户自己调整,有两种调度策略:按优先权调度和按时间片轮转调度。每个进程可能有5种状态:新建(new)、就绪(ready)、运行(running)、阻塞(waiting)、挂起(suspend)。每个状态都有一个队列用来存放处于该状态的进程,不同的调度策略采用不同的队列实现。当创建进程时,如果存中的进程数还没达到规定道数,则将新建进程插入就绪队列,如果存中进程数已经达到规定道数,则插到后备队列,后备队列中的进程的状态为new。CPU每次调度时都从就绪队列中取进程,在进程执行过程中如果下一个操作时IO操作,则将进程插入到waiting队列。在系统运行过程中可以执行进程挂起操作,但执行的挂起操作时系统自动暂停运行,在弹出窗口选择要挂起的进程后,将选中的进程从原来的队列中删除并插入到挂起队列。进行解挂操作时将选中的进程从挂起队列中删除并插入该进程原来所处的队列。 ?按优先级调度: 当选择按优先权调度时,所有队列都采用优先队列,优先队列采用一个有序链表实现,进程的优先权值越大代表优先级越高,优先队列中的进程按优先权从大到小排列,当新进程插入时根据该进程的优先权插入到队列中的合适位置,插入后保持队列按优先权从大到小排列,如果新进程与队列中某个进程优先权值相等,则该新进程插到那个进程后面,以遵循先来先服务的规则。当要从队列中取出进程时总是取队列中第一个进程,因为该进程的优先级最高。 ?按时间片轮转调度: 当选择按时间片轮转调度时,所有队列都采用先进先出队列,先进先出队列采用一个普通单向链表实现,当新进程插入时插入到队列的末尾,当要取进程时取队首进程,这样就实现了先进先出。

相关文档
最新文档