组合逻辑电路实验(一)实验报告一.实验名称:3-8译码器设计 二.实验目的1.掌握ISE 开发工具的使用,掌握FPGA 开发的基本步骤;2.掌握组合逻辑电路设计的一般方法;3.掌握程序下载方法,了解UCF 文件的格式;4.初步了解开发板资源,掌握开发板使用方法。
重点了解滑动开关和LED 显示灯的使用方法。
三.实验内容1.用VHDL 实现3-8译码器模块译码器电路如图2-1所示。
其功能如表2-1所示。
试用VHDL 实现该译码器,并在开发板上进行检验。
表2-1 译码器功能表 EN A B C Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 1 X X X 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 01113-8 译码器A B CENY0 Y1 Y2 Y3 Y4 Y5 Y6 Y7图2-1 3-8译码器0 1 1 0 0 1 0 0 0 0 0 00 1 1 1 1 0 0 0 0 0 0 0 2.将程序下载到FPGA并进行检验(1)资源使用要求:用滑动开关SW3~SW1作为输入A,B,C;滑动开关SW0控制EN;8个LED灯表示8个输出。
(2)检验方法:当SW0处于ON(EN=1)位置时,所有LED灯灭;当SW0处于OFF(EN=0),反映当前输入的译码输出在LED灯上显示,即当输入为000(滑动开关SW3-SW1处于OFF状态),LED0亮,其它灯灭,等等。
四.实验步骤1.启动ISE,新建工程文件,编写3-8译码器的VHDL模块;2.新建UCF文件,输入位置约束;3.完成综合、实现,生成下载文件;4.连接开发板USB下载线,开启开发板电源;5.下载到FPGA;6.拨动开关,验证结果是否正确。
五.主要vhdl代码architecture Behavioral of coder_38 is --3-8译码器行为级描述signal x:STD_LOGIC_VECTOR (2 downto 0);beginx <= A&B&C;process(en,x)beginif(en='0')thencase x iswhen "000" => Y<="00000001";when "001" => Y<="00000010";when "010" => Y<="00000100";when "011" => Y<="00001000";when "100" => Y<="00010000";when "101" => Y<="00100000";when "110" => Y<="01000000";when "111" => Y<="10000000";when others => NULL;end case;else Y<="00000000";end if;end process;end Behavioral;六.心得体会这次实验内容比较简单,主要是为了熟悉Xilinx ISE及FPGA实验板的使用方法,了解整个开发流程。
ISE是一款功能强大的FPGA设计软件,在实际的设计过程中要注意工程中的FPGA开发板型号等参数的选择应与实际硬件一致,并保证UCF位置约束的正确性,要在头脑中将整个过程无缝衔接,避免细节处错误的发生。
时序逻辑电路实验(一)实验报告一.实验名称:可逆计数器设计二.实验目的1.进一步熟练ISE开发工具,巩固FPGA开发的基本步骤,掌握功能仿真方法;2.掌握时序逻辑电路设计的一般方法,掌握时钟分频程序设计方法;3.理解VHDL的层次结构设计;4.巩固程序下载方法;5.了解开发板时钟资源,以及时钟分频方法。
三.实验内容1.基本可逆计数器模块可逆计数器电路图及功能表如图3-1和表3-1所示。
根据真值表易写出可逆计数器的vhdl模块,要注意的是:由于其中涉及向量类型的算术运算,所以在库中要添加STD_LOGIC_UNSIGNED.ALL;由于Y[0..7]为out类型,不能获取其值进行操作,应当添加一个信号comb,进行算术运算。
表3-1 可逆计数器功能表 clr en Up/Dn clk Y7 ~ Y0 1 X X X 00000000 0 0 X X 停止计数0 1 1 ↑ 计数器+1操作 01↑计数器-1操作2.1/50000000分频器模块可逆计数器电路图如图3-2所示。
在实验板上提供了50MHz 的系统时钟频率,为获取1Hz 的计数时钟频率,需要对其进行分频,即输入端输入50MHz 的系统时钟频率,然后输出端每过25M 个频率输出信号跳变一次,即可得到1Hz 的频率输出。
3.二选一电路模块二选一电路电路图如图3-3所示。
通过滑动开关即可选择是通过1Hz 时钟输入还是通过外部按键输入。
4.综合原理图(顶层原理图)选择原理图模式,将生成的(已封装)各模块器件组合成最终形式。
如图3-4所示。
clren clkY0 Y1 Y2 Y3 Y4 Y5 Y6 Y7Up/Dn 图3-1 可逆计数器原理图四.实验步骤1.建立工程文件,顶层文件为原理图;2.编写分频模块程序,要求输入为50MHz 系统时钟,输出为1Hz 计数时钟;3.编写2选1模块,输入为按键、1Hz 时钟和开关SW2,输出为计数源;4.编写计数器模块主程序模块;5.在原理图中,将各个模块连接,使用pinhead 分配引脚资源;6.对程序进行功能仿真;1/5000000050M clock1Hz clock图3-2 1/50000000分频器2选1 In1 Dout图3-3 二选一电路In2 SEn(SW1) clkY0(LED0)Y3(LED3) Y4(LED4) Y5(LED5) Y6(LED6) Y7(LED7)Up/Dn(SW0)2选1SW2clr(BTN_EAST)BTN_SOUTH1/50M图3-4 完整的可逆计数器7.下载程序,进行验证。
五.主要vhdl代码--1/50000000分频模块architecture Behavioral of fdiv is signal tmp :std_logic := '0';beginprocess(cin)variable fd:INTEGER:=0;beginif(cin'event and cin= '1') thenfd := fd + 1;if(fd = 25000000) thentmp <= not tmp;fd := 0;cout <= tmp;end if;end if;end process;end Behavioral;--二选一电路模块architecture Behavioral of mux21 is beginprocess(in1,in2,s)beginif(s='0')thendout <= in1;elsedout <= in2;end if;end process;end Behavioral;--基本可逆计数器模块architecture Behavioral of counter issignal comb: STD_LOGIC_VECTOR(7 downto 0):= "00000000"; beginprocess(clr,en,sel,clk)beginif(clr='1')thencomb <= "00000000";elsif(en='1')thenif(clk'event and clk='1')thenif(sel='1')thencomb <= comb + 1;elsif(sel='0')thencomb <= comb - 1;end if;end if;end if;end process;Y <= comb;end Behavioral;六、心得体会这次的实验比较综合,共分为三个模块,通过三个模块的组合完成最终设计。
通过这次实验,我不仅对于vhdl程序的编写更加熟悉,也初步构建起了硬件设计的模块化思想,学习了自顶向下的设计方法,学会了利用ise软件进行电路仿真的方法,并掌握了一些常用的硬件描述方式,大大加深了对于使用vhdl语言描述硬件方式的印象。
状态机电路实验(一)实验报告一.实验名称:按键抖动消除及验证电路设计二.实验目的1.进一步熟练ISE开发工具,巩固FPGA开发的基本步骤,掌握功能仿真方法;2.了解按键抖动的原因,抖动消除方法3.掌握状态机的设计方法;4.掌握消除抖动的状态机设计方法5.巩固程序下载方法。
三.实验内容1.原理简介按键动作发生时,按键的输出会出现不稳定的逻辑’0’和逻辑’1’的跳变。
该信号直接输入到计数器之类电路,会发生计数错误。
如图3-5所示。
图3-5 信号抖动2.状态分析设置五个状态:S0,S1,S2,S3,S4,S5。
电路的复位信号RST有效时,电路进入复位状态S0,在S0状态下,时钟信号CLK以一定频率采样按键输入信号Key_in,如果采样到Key_in = ‘0’,则停留在S0状态,并继续采样,一旦采样到Key_in=’1’,则转入S1延时状态,进行消抖延时,当延时结束时,Delay_end=’1’,则转入S2状态,在此状态下,时钟信号CLK以一定频率采样按键输入Key_in,如果Key_in = ‘0’则转入S0,否则转入S3;状态S3,S4的转换过程和条件与S2相同,在状态S4下,如果Key_in=’1’,则转入S5状态,当进入S5时,表示经过S2,S3,S4三个连续状态检测按键输入Key_in都为‘1’,则认为按键处于稳定状态,在S5输出按键确认信号Key_confirm=’1’。
同时在状态S5下,时钟信号CLK检测按键输入Key_in,如果Key_in = ‘1’,表示按键未释放,继续停留在S5,检测输入信号,如果检测到Key_in = ‘1’,表示按键已经释放,输出Key_confirm = ‘0’, 返回到状态S0,等待下一次按键操作。