完整word版实验四序列发生器.docx
- 文档编号:10133886
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:25
- 大小:506.34KB
完整word版实验四序列发生器.docx
《完整word版实验四序列发生器.docx》由会员分享,可在线阅读,更多相关《完整word版实验四序列发生器.docx(25页珍藏版)》请在冰豆网上搜索。
完整word版实验四序列发生器
南昌大学实验报告
学生姓名:
学号:
专业班级:
中兴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连接的二极管会依次出现:
灭、亮、亮、亮、灭、亮、灭、灭、亮、亮、灭、亮、亮、灭、亮、灭
即产生了序列0111010011011010
(2)序列检测器测试结果
当产生的序列为11010时,与N相连的l
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 word 实验 序列 发生器