实验四序列发生器.docx

上传人:b****4 文档编号:26904061 上传时间:2023-06-23 格式:DOCX 页数:26 大小:512.38KB
下载 相关 举报
实验四序列发生器.docx_第1页
第1页 / 共26页
实验四序列发生器.docx_第2页
第2页 / 共26页
实验四序列发生器.docx_第3页
第3页 / 共26页
实验四序列发生器.docx_第4页
第4页 / 共26页
实验四序列发生器.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

实验四序列发生器.docx

《实验四序列发生器.docx》由会员分享,可在线阅读,更多相关《实验四序列发生器.docx(26页珍藏版)》请在冰豆网上搜索。

实验四序列发生器.docx

实验四序列发生器

南昌大学实验报告

学生姓名:

学号:

专业班级:

中兴101班

实验类型:

□验证□综合■设计□创新实验日期:

2012、11、16成绩:

实验四序列信号发生器与检测器设计

一、实验目的

1、学习VHDL文本输入法

2、学习有限状态机的设计

3、利用状态机实现串行序列的输出与序列的检测

4、继续学习优化设计

二.实验内容与要求

1.设计序列发生器,完成序列为0111010011011010的序列生成器

2.用有限状态机设计序列检测器,实现串行序列11010的检测器

3.若检测到符合要求的序列,则输出显示位为“1”,否则为“0”

4.对检测到的次数计数

5.整个工程采用顶层文件+底层模块的原理图或文本的设计思路

三、实验仪器

PC机、QuartusII软件、EDA实验箱

四、实验思路

1.设计序列发生器

基本思想为一个信号CQ1计数,给另一个信号CO(代表序列的每一位)赋值的方法:

先设定端口CQ1用于产生序列时计数,因为序列共16位,因此端口CQ1为标准逻辑矢量,位宽为4,设另一个端口M代表序列的每一位,CQ1每计一个数,就给M赋一个值,这样产生一个16位的序列。

由于端口不能参与相关运算,因此在结构体中我分别定义了信号CQ1(标准逻辑矢量,位宽4),信号Q与相应的端口CQ1CO对应,在进程中参与相应的运算,在程序的最后再用端口接收信号:

CO<=Q;

在进程中我采用case–when语句,如当CQ1为“0000”的时候,给另一信号Q赋‘0’,当CQ1为“0001”时,为Q赋‘1’以此类推,且让CQ1产生循环,即可源源不断的产生所需序列了,如下表

CQ1

0000

0001

0010

0011

0100

0101

0110

0111

Q

0

1

1

1

0

1

0

0

CQ1

1000

1001

1010

1011

1100

1101

1110

1111

Q

1

1

0

1

1

0

1

0

2.序列检测器

序列检测器设计的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及序列,直到在连续的检测中收到的每一位码都与实验要求相同。

在此,必须利用状态转移图。

电路需要分别不间断记忆:

初始状态、1、11、110、1101、11010共六种状态,状态转移如图:

11010

S0S1S2S3S4S5

0

01

1

1

 

若检测到“11010”序列,则输出信号N为1,定义VARIABLEX:

STD_LOGIC_VECTOR(3DOWNTO0)进行计数,最后把变量X赋给输出SS,在数码管上显示检测到序列“11010”的次数。

3.时钟脉冲的选择

数码管显示的扫描时钟需要很快的速度,因此采用1KHz频率的时钟;而序列发生器,为了能够人眼识别亮灭,则我选择采用2000分频之后得到的0.5Hz频率

五.原理图输入法设计(程序来源:

基本上独立完成)

1.建立文件夹

建立自己的文件夹(目录),如c:

\myeda,进入Windows操作系统

●QuartusII不能识别中文,文件及文件夹名不能用中文。

2.原理图设计输入

打开QuartusII,选菜单File→New,选择“DeviceDesignFile->BlockDiagram->SchematicFile”项。

点击“OK”,在主界面中将打开“BlockEditor”窗口。

(1)分频器模块:

(实体名为DIV)

本设计使用的FPGA开发板中使用的芯片是CycloneIIEP2C35F672C8,使用的是10kHz的时钟脉冲输入,根据电路的具体设计需要,对其进行分频设计。

如图1所示为系统的分频模块,其中模块Clockout管脚输出为0.5hz的时钟脉冲,得出序列发生器和序列检测器模块正常工作的时钟信号,在Clockin管脚输出为一个1khz的时钟脉冲,作用与动态扫描模块的正常工作。

输入管脚:

Clockin为1khz脉冲输入;

输出管脚:

Clockout为0.5hz脉冲输出;

图1

--时间:

2012年11月10号

--版本:

7.2

--功能:

分频器(2000分频)

分频模块DIV源代码div.vhd如下:

-------分频程序,从1KHZ中得到0.5HZ的计数频率,2000分频----------

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;--这3个程序包足发应付大部分的VHDL程序设计

USEIEEE.STD_LOGIC_Arith.ALL;

USEIEEE.STD_LOGIC_Unsigned.ALL;

ENTITYDIVIS

GENERIC(N:

Integer:

=20000);--此处定义了一个默认值N=10000,即电路为10000分频电路;

Port(Clockin:

INSTD_LOGIC;

ClockOut:

OUTSTD_LOGIC);

END;

ARCHITECTUREDeviderOFDIVIS

SIGNALCounter:

IntegerRANGE0TON-1;

SIGNALTemp1:

STD_LOGIC;--信号的声明在结构体内,进程外部

BEGIN

PROCESS(Clockin)

BEGIN

IFRISING_EDGE(Clockin)THEN

IFCounter=N-1THEN

counter<=0;

Temp1<=NotTemp1;

ELSE

Counter<=Counter+1;

IFCounter=(N/2-1)THEN

Temp1<=NOTTemp1;

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;

ClockOut<=Temp1;

END;

(2)序列发生器模块:

(实体名为C_OUT)

序列发生器模块如图2所示,其中:

输入管脚:

CLK为0.5hz的时钟脉冲;

RST为复位信号;

输出管脚:

CO序列发生器设计时用于计数,实现模16计数,以产生16位的序列

图2

--时间:

2012年11月10号

--版本:

7.2

--功能:

产生一个十六位的指定序列

-----------------C_OUT------------------------------------------------------------------

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;--为了重载

ENTITYC_OUTIS

PORT(CLK,RST:

INSTD_LOGIC;--定义时钟和复位信号

CO:

OUTSTD_LOGIC);--序列发生器设计时用于计数,实现模16计数,以产生16位的序列

ENDC_OUT;

----------------------------------------------------------------------------------------

ARCHITECTUREbehavOFC_OUTIS

SIGNALCQ1:

STD_LOGIC_VECTOR(3DOWNTO0);--定义信号进行计数.实现模16计数,对应依次产生序列的位0到位15;

SIGNALQ:

STD_LOGIC;

BEGIN

PROCESS(CLK,RST,Q)

BEGIN

IFRST='1'THENCQ1<="0000";Q<='0';--如果复位,则计数器清0,M也清0

ELSIFCLK'EVENTANDCLK='1'THEN

CQ1<=CQ1+1;--时钟上升沿到来,Q开始计数,产生序列

CASECQ1IS

WHEN"0000"=>Q<='0';

WHEN"0001"=>Q<='1';

WHEN"0010"=>Q<='1';

WHEN"0011"=>Q<='1';

WHEN"0100"=>Q<='0';

WHEN"0101"=>Q<='1';

WHEN"0110"=>Q<='0';

WHEN"0111"=>Q<='0';

WHEN"1000"=>Q<='1';

WHEN"1001"=>Q<='1';

WHEN"1010"=>Q<='0';

WHEN"1011"=>Q<='1';

WHEN"1100"=>Q<='1';

WHEN"1101"=>Q<='0';

WHEN"1110"=>Q<='1';

WHEN"1111"=>Q<='0';

ENDCASE;

ENDIF;

ENDPROCESS;--序列发生器到此结束

CO<=Q;

ENDbehav;

(3)序列检测模块:

(实体名为SCHK)

序列检测模块如图3所示,其中:

输入管脚:

CLK为0.5hz的时钟脉冲;

EN为使能端,为1才正常工作;

M为显示当前产生的位;

输出管脚:

N为显示满足序列要求时,产生‘1’,即为标志位。

图3

--时间:

2012年11月10号

--版本:

7.2

--功能:

检测指定的序列

----------SCHK------------------------------------------------------------------------------

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;--为了重载

ENTITYSCHKIS

PORT(CLK,EN,M:

INSTD_LOGIC;--EN为使能端,为1才正常工作;M为显示当前产生的位

N:

OUTSTD_LOGIC);-N为显示满足序列要求时,产生‘1’,即为标志位

ENDSCHK;

----------------------------------------------------------------------------------------

ARCHITECTUREbehavOFSCHKIS

TYPESTATEIS(S0,S1,S2,S3,S4,S5);---状态机的定义,5个状态

SIGNALS:

STATE;

SIGNALA1,A2,A3,A4,A5:

STD_LOGIC;

--SIGNALQ:

INTEGERRANGE0TO5;

--SIGNALD:

STD_LOGIC_VECTOR(4DOWNTO0);

SIGNALN1:

STD_LOGIC;

BEGIN

 

PROCESS(CLK,S,N1,EN)---序列检测器进程

BEGIN

IFEN='0'THEN

S<=S0;N1<='0';

A5<='0';A4<='0';A3<='0';A2<='0';A1<='0';

ELSIFCLK'EVENTANDCLK='0'THEN

N1<='0';

CASESIS

WHENS0=>ifM='1'thenS<=S1;elseS<=S0;endif;

WHENS1=>ifM='1'thenS<=S2;elseS<=S0;endif;

WHENS2=>ifM='0'thenS<=S3;elseS<=S2;endif;

WHENS3=>ifM='1'thenS<=S4;elseS<=S0;endif;

WHENS4=>ifM='0'thenS<=S5;----生成一个11010序列

N1<='1';

elseS<=S2;

endif;--11011010里有一个,同时计数

WHENothers=>S<=S0;

ENDCASE;

A5<=A4;---移位输出显示在led上以便观看

A4<=A3;

A3<=A2;

A2<=A1;

A1<=M;--将最近生产的序列赋给最前端的A1位

endif;

N<=N1;--显示检测到11010,检测到时它为高电平,它所对应二极管亮,否则二极管灭

ENDPROCESS;

ENDbehav;

(4)16进制计数模块(实体名:

COUNT)

16进制计数模块如图4所示,其中:

输入管脚:

CLK为检测到一个序列产生一个脉冲;

RST为计数复位信号;

EN为使能端;

输出管脚:

Q[3..0]为计数的个位;

COUNT计数达到15时,产生标志信号

图4

--时间:

2012年11月10号

--版本:

7.2

--功能:

16进制计数模块

-------------COUNT-----------------------------------------------

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYCOUNTIS

PORT(CLK,RST,EN:

INSTD_LOGIC;

Q:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

COUT:

OUTSTD_LOGIC);

ENDENTITYCOUNT;

----------------------------------------------------------------------------------------

ARCHITECTUREONEOFCOUNTIS

BEGIN

PROCESS(CLK,EN,RST)

VARIABLECQI:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

IFRST='1'THENCQI:

=(OTHERS=>'0');

ELSIFCLK'EVENTANDCLK='1'THEN

IFEN='1'THEN

IFCQI<15THEN

CQI:

=CQI+1;

ELSECQI:

="0000";

ENDIF;

ENDIF;

ENDIF;

IFCQI=15THENCOUT<='1';

ELSECOUT<='0';

ENDIF;

Q<=CQI;

ENDPROCESSCOUNT;

ENDARCHITECTUREONE;

(5)数码管显示模块(实体名:

scan_led)

数码管显示模块如图5所示,其中:

输入管脚:

CLK为1khz的时钟脉冲;

data1[3..0]为要显示的数的个位;

data2[3..0]为要显示的数的十位;

输出管脚:

scan数码管显示码

choose数码管位选信号

图5

--时间:

2012年11月10号

--版本:

7.2

--功能:

将计数结果在数码管显示

---------------scan_led---------------------------------

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYscan_ledIS

PORT(clk:

INSTD_LOGIC;

data1,data2

:

INSTD_LOGIC_VECTOR(3DOWNTO0);

scan:

OUTSTD_LOGIC_VECTOR(6DOWNTO0);--scan数码管显示码

choose:

OUTSTD_LOGIC_VECTOR(2DOWNTO0));--choose数码管位选信号

ENDENTITY;

ARCHITECTUREoneOFscan_ledIS

SIGNALcout8:

STD_LOGIC_VECTOR(2DOWNTO0);

SIGNALA:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

P1:

PROCESS(cout8)—片选

BEGIN

CASEcout8IS

WHEN"000"=>choose<="000";A<=data1;

WHEN"001"=>choose<="001";A<=data2;

WHEN"010"=>choose<="010";A<="0000";

WHEN"011"=>choose<="011";A<="0000";

WHEN"100"=>choose<="100";A<="0000";

WHEN"101"=>choose<="101";A<="0000";

WHEN"110"=>choose<="110";A<="0000";

WHEN"111"=>choose<="111";A<="0000";

WHENOTHERS=>NULL;

ENDCASE;

ENDPROCESSP1;

P2:

PROCESS(clk)

BEGIN

IFclk'EVENTANDclk='1'THENcout8<=cout8+1;

ENDIF;

ENDPROCESSP2;

P3:

PROCESS(A)—译码

BEGIN

CASEAIS

WHEN"0000"=>scan<="0111111";--0

WHEN"0001"=>scan<="0000110";--1

WHEN"0010"=>scan<="1011011";--2

WHEN"0011"=>scan<="1001111";--3

WHEN"0100"=>scan<="1100110";--4

WHEN"0101"=>scan<="1101101";--5

WHEN"0110"=>scan<="1111101";--6

WHEN"0111"=>scan<="0000111";--7

WHEN"1000"=>scan<="1111111";--8

WHEN"1001"=>scan<="1101111";--9

WHEN"1010"=>scan<="1110111";--A

WHEN"1011"=>scan<="1111100";--B

WHEN"1100"=>scan<="0111001";--C

WHEN"1101"=>scan<="1011110";--D

WHEN"1110"=>scan<="1111001";--E

WHEN"1111"=>scan<="1110001";--F

WHENOTHERS=>NULL;

ENDCASE;

ENDPROCESSP3;

END;

2.包装元件入库。

编译通过后,单击File→CreateDefaultSymbol,当前文件变成了一个包装好的自己的单一元件,并被放置在工程路径指定的目录中以备后用。

3.保存各个模块的原理图

单击File→Saveas…按扭,出现对话框,选择自己的目录(如c:

\myeda),合适名称保存刚才输入的原理图,原理图的扩展名为.bdf。

4.设置工程文件(Project)

以EXP4为工程名命名

5.选择目标器件

6.放置元件

7.添加连线

将以上各器件连接成实验原理图如下:

图6原理图设计

8.编译(Compiler)

单击→QuartusIICompiler,跳出Compiler窗口,此编译器的功能包括网表文件的提取、设计文件的排错、逻辑综合、逻辑分配、适配(结构综合)、时序仿真文件提取和编程下载文件装配等。

单击Start,开始编译!

如果发现有错,排除错误后再次编译。

7.仿真,测试项目的正确性(仅对计数模块进行仿真测试)

1)建立新的波形激励文件

2)在波形编辑器窗口添加节点

3)通过Edit->EndTime来设定仿真结束时间为1ms

4)在CLOCK窗口中设置clk的时钟周期为10ns

时间设置如下:

5)点击save保存,输入波形如下:

6)通过Tools下的SimulatorTools项进行仿真,然后观察输出波形。

仿真波形以及分析如下:

初步检验:

对上述问题进行调整

对序列发生器的考察:

对检测器进行考察:

对序列发生器清零端进行考察:

 

对计数器的考察:

 

对计数清零端进行考察:

对状态图的考察

由上可知,仿真结果与要求一致!

六、引脚锁定和编程下载

1.Assignments-.>device->

引脚锁定,参照下载实验板1K100的引脚号说明书,选择适当的引脚

2.引脚锁定后,保存,必须重新进行一次全程编译,编译通过后才能编程下载。

3、编程下载,用下载线将计算机并口和试验箱上的JTAG口接起来,接通电源。

选择Tools—>Programmer菜单,打开programmer窗口。

在mode中选中JTAG,将Program/Configure下的笑方框选中

4在开始编程之前,必须正确设置编程硬件。

点击“HardwareSetup”按钮,打开硬件设置口。

点击“AddHardware”打开硬件添加窗口,在“Hardwaretype”下拉框中选择“ByteBlasterMVorByteBlasterII”,“Port”下拉框中选择“LPT1”,点击OK按钮确认,关闭HardwareSetup窗口,完成硬件设置。

5、点击“Start”按钮,开始编程下载

图(14)下载成功

 

七、硬件测试结果

(1)序列发生器测试结果,实验中产生了序列0111010011011010

CQ1

0000

0001

0010

0011

0100

0101

0110

0111

Q

0

1

1

1

0

1

0

0

CQ1

1000

1001

1010

1011

1100

1101

1110

1111

Q

1

1

0

1

1

0

1

0

而且产生的原理即为:

看到的现象即为Q连接的数码管从0到15计数时,co连接的二极管会依次出现:

灭、亮、亮、亮、灭、亮、灭、灭、亮、亮、灭、亮、亮、灭、亮、灭

即产生了序列0111010011

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1