当前位置:文档之家› EDA实验报告--序列信号发生器

EDA实验报告--序列信号发生器

南昌大学实验报告
学生姓名:林聪学号:5801209051 专业班级:中兴091班
实验类型:□验证□综合□设计□创新实验日期:2011/10/19实验成绩:
实验三序列信号发生和检测器
一、实验目的
1、进一步熟悉EDA实验装置和QuartusⅡ软件的使用方法;
2、学习有限状态机法进行数字系统设计;
二、设计要求
完成设计、仿真、调试、下载、硬件测试等环节,在EDA实验装置上实现一个串行序列信号发生器和一个序列信号检测器的功能,具体要求如下:
1、先设计0111 0100 1101 1010序列信号发生器,其最后8BIT数据用LED显示出来;
2、再设计一个序列信号检测器,检测上述序列信号,若检测到串行序列“11010”则输出为“1”,
否则输出为“0”;
三、主要仪器设备
1、微机1台
2、QuartusII集成开发软件1套
3、EDA实验装置1套
四、实验步骤
1、分析实验,由于实验需要产生具备序列发生器和序列检测器的功能,根据分模块处理的
思想,可以把实验分为两个模块,通过顶层元件建立输入输出的连接。

2、建立模块使用VHDL编程,首先,建立序列发生器的模块,名为xlfsq,VHDL代码如下:
libraryieee;
use ieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityxlfsq is
port(clk,rst:instd_logic;
cout,e1,e2,e3,e4,e5,e6,e7,e8:out std_logic);
endxlfsq;
architecture one of xlfsq is
signalcq:std_logic;
signal f1,f2,f3,f4,f5,f6,f7:std_logic;
begin
P1:process(clk,rst)
variablecount:std_logic_vector(3 downto 0);
begin
if(rst='0')then count:="0000";
elsif(clk'event and clk='1')then
count:=count+1;
end if;
case count is
when"0000"=>cq<='0';
when"0001"=>cq<='1';
when"0010"=>cq<='1';
when"0011"=>cq<='1';
when"0100"=>cq<='0';
when"0101"=>cq<='1';
when"0110"=>cq<='0';
when"0111"=>cq<='0';
when"1000"=>cq<='1';
when"1001"=>cq<='1';
when"1010"=>cq<='0';
when"1011"=>cq<='1';
when"1100"=>cq<='1';
when"1101"=>cq<='0';
when"1110"=>cq<='1';
when"1111"=>cq<='0';
when others=>cq<='0';
end case;
ifclk'event and clk='1' then
if count>"0111" then
f1<=cq;f2<=f1;f3<=f2;f4<=f3;f5<=f4;f6<=f5;f7<=f6;
else f1<='0';f2<='0';f3<='0';f4<='0';f5<='0';f6<='0';f7<='0';
end if;
end if;
end process;
cout<=cq;
e1<=cq;e2<=f1;e3<=f2;e4<=f3;e5<=f4;e6<=f5;e7<=f6;e8<=f7;
end architecture one;
再将该文件建立名为xlfsq的工程,对代码例化为元件:
图1 序列发生器
建立名为xlfsq的工程文件,编译后对该功能进行时序仿真,得到仿真图如下:
图2 序列发生器的仿真图
当rst=0无效时,不产生序列,当rst=1有效时,正常产生系列0111 0100 1101 1010。

3、同理,建立序列检测器的模块,注意需要使用状态机来判断是否有与待检测序列相同的
序列出现,建立名为xljcq的VHDL文件,代码如下:
libraryieee;
use ieee.std_logic_1164.all;
entityxljcq is
port(cin,clk,rst:instd_logic;
c:out std_logic);
endxljcq;
architecturebhv of xljcq is
type state is (s0,s1,s2,s3,s4,s5);
signal s:state;
signal D:std_logic_vector(4 downto 0);
begin
D<="11010";
P1:process(clk,rst)
begin
ifrst='0' then s<=s0;
elsifclk'event and clk='1' then
case s is
when s0=>if cin=D(4) then s<=s1;else s<=s0;end if;
when s1=>if cin=D(3) then s<=s2;else s<=s0;end if;
when s2=>if cin=D(2) then s<=s3;else s<=s2;end if;
when s3=>if cin=D(1) then s<=s4;else s<=s0;end if;
when s4=>if cin=D(0) then s<=s5;else s<=s2;end if;
when others=>s<=s0;
end case;
end if;
end process;
P2:process(s)
begin
if s=s5 then c<='1';
else c<='0';
end if;
end process;
end architecture bhv;
对该段代码例化为元件,例化元件如下:
图3
序列检测器
建立名为xljcq的工程文件,编译后对该模块进行仿真,仿真结果如下:
图4 序列检测器的仿真图
只要检测到序列“11010”,则在下一个脉冲的上升沿时产生为时一个时钟周期的高电平。

4、建立顶层模块,运用上面例化好的元件绘制原理图,保存为名为xlfsjcq的文件:
图5 顶层文件原理图(已经绑定好引脚)
再建立名为xlfsjcq的工程文件,编译后进行时序仿真,波形如下:
图6 序列发生检测器的仿真图
当rst=0无效时,不产生序列,输出恒为0,即使产生了序列“11010”之后,如果rst无效仍然检测输出为0;当rst=1有效时,正常产生系列0111 0100 1101 1010,当检测到序列11010时,则输出为1。

5、引脚绑定如下:
图7 引脚绑定图
6、编译后下载到试验箱上观察实验现象。

五、实验现象
把试验箱上的clk接到1HZ,高低电平通过LED等的亮灭来显示,则现象:
垂直方向的交通灯绿灯每个1s亮一次,水平方向的交通灯黄灯产生序列0111 0100 1101 1010;
产生的序列后八位显示在8个用户LED上,当出现11010时,水平方向的交通灯绿灯亮1s,如此循环工作。

六、实验总结
该实验的主要思想是实现序列发生器和序列检测器,前者的实现可以使用case语句来实现,后者的实现需要状态机来检测序列。

该实验主要是让我们体会到了分模块编程的思想,这是一个化简为易的方法,条理清晰,思路明朗,而且便于查错,可以很快的缩小出错的范围找到产生错误的根源。

倘若一股脑的把所有功能写到一个VHDL文件下,则很容易混淆,不便于理解。

所以,今后的编程中,借鉴该种方法来编程,可以达到事半功倍的效果。

相关主题