signal reg:std_logic_vector(4 downto 0); begin process(clk)
variable t1:std_logic_vector (4 downto 0); begin
if clk'event and clk='1' then reg(0)<=datain;
reg(4 downto 1)<=reg(3 downto 0) ; end if; t1:=t;
if reg=t1 then q<='1' ; else q<='0'; cq<=reg; end if; end process; end rt1;
基于实验发现序列一个一个输入比较麻烦所以设计如下任意十六位循环系列: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY jc IS
PORT(CLK,CLR,RESET:IN STD_LOGIC; B: in std_logic_vector (15 downto 0) ;
q:out std_logic); END ENTITY;
ARCHITECTURE ONE OF jc IS SIGNAL A:STD_LOGIC;
BEGIN
PROCESS(CLK,CLR)
VARIABLE N:INTEGER RANGE 16 DOWNTO 1; BEGIN
IF RESET='1' THEN N:=1; ELSIF CLK'EVENT AND CLK='1' THEN CASE N IS
WHEN 1=>A<=B(0);N:=N+1; WHEN 2=>A<=B(1);N:=N+1; WHEN 3=>A<=B(2);N:=N+1; WHEN 4=>A<=B(3);N:=N+1; WHEN 5=>A<=B(4);N:=N+1; WHEN 6=>A<=B(5);N:=N+1; WHEN 7=>A<=B(6);N:=N+1; WHEN 8=>A<=B(7);N:=N+1; WHEN 9=>A<=B(8);N:=N+1; WHEN 10=>A<=B(9);N:=N+1; WHEN 11=>A<=B(10);N:=N+1; WHEN 12=>A<=B(11);N:=N+1; WHEN 13=>A<=B(12);N:=N+1; WHEN 14=>A<=B(13);N:=N+1; WHEN 15=>A<=B(14);N:=N+1; WHEN 16=>A<=B(15);N:=1; WHEN OTHERS=>NULL; END CASE; END IF; Q<=A;
END PROCESS;
END ARCHITECTURE; 五、实验步骤
1.建立工作库文件夹和编辑模块设计文件
(1)在D盘下建立一个文件夹保存工程文件;
(2)打开QuartusII,建立新的VHDL文件,在设计有顶层和底层文件时,
在打开的页面下输入模块设计程序。并且生成可调用文件,输入完程序之后逐个编译,注意必须先设为顶层文件,逐个编译无错之后将模块转换为可调用元件。顶层原理图设计和工程编译,新建原理图文件,调用模块文件连接电路,完成顶层设计。新建工程并对工程进行全程编译。 4.系统仿真
(1)建立新的波形文件; (2)在波形编辑器窗口添加节点,通过Edit->End Time 来设定仿真结束时间,点击save保存;
(3)通过Tools下的Simulator Tools项进行仿真,然后观察和分析输出波形。
六、实验仿真波形图如下:
A
程序I仿真波形:
1.根据aq右移变化可以看出序列发生器产生输出序列0111010011011010; 2.A点可以看出,检测器检测串行信号11010,若检测到11010信号,ss则输出“1”;没有检测到,ss则输出“0”; 程序II仿真波形:
A B
C D E
1、由cq输出和datain不难看出,datain输入就是序列的输入,从而实现了任意模的输入。
2、由ABCDE五点可以发现当t为不同序列时,程序检测的的系列也不同。程序可以检测不同的输入序列t。从而实现了不同系列的检测。
程序III仿真波形:
(1)
(2)
从仿真图(1)可知,当B输入不同序列时,产生的序列也不同
从仿真图(2)可知,当B输入一个序列时,输出q无限循环右移输出这个序列
5.引脚锁定和下载测试 1、引脚锁定
在Assigments菜单中选择Pins,打开界面后,在Location栏空白处双击鼠标,依次加入端口,引脚设置参照实验书。
确定好引脚后,保存这些信息,然后再进行编译。
七、 硬件测试
程序一、根据电路设计,EN置1,RST(电平2)和RST1置1,对各输入信号复位后,再置0。按CLK脉冲,每按一个CLK脉冲,LED8根据输出一个值,记录LED8的亮暗情况(1:灯亮,0:灯灭),对照与实验要求的序列:0111010011011010是否一致。且在按下第八个脉冲信号时,LED7灯亮,表示检测到串行序列。
测试结果与电路设计功能符合,证明设计是正确的,稳定的。
程序二:先设定一个检测序列,然后当给一个手动脉冲时,给一个信号。当连续输入的信号为检测序列时,接q的LED发亮,其他情况不发亮。改变检测序列,连续输入原来序列,LED等不亮。硬件测试和程序设计结果相同。 八、 实验小结
通过本次实验我学会了利用状态机实现串行序列发生器和检测器的设计,关键是在画出状态图后设计时序进程和组合进程,例如在设计序列发生器时,源程序首先用一个进程对CLK输入脉冲个数进行统计,统计结果存放信号CNT中。然后用另一个进程根据输入脉冲的统计结果,控制序列信号的输出,当第0个CLK脉冲到来时,输出ZOUT=“1”,当第1个CLK脉冲到来时,ZOUT=“1”,当第2个CLK脉冲到来时,ZOUT=“0”;
以此类推,每十六个脉冲为一次循环使输出序列信号为“1101001111011011”。
在设计任意输入任意序列检测时,充分利用软件的特性,只要思路方向正确,也不是什么很复杂的问题。EDA重在思考,发现,和不断的探索。
九、 实验心得
本次实验的目的在于学习一般有限状态机的设计。状态机包括时序逻辑部分(存储部分)和组合逻辑部分(控制部分),其内部和输出经过一可预测的状态序列。因此设计状态机一般先根据具体问题明确控制输入、条件转换,再画出状态图,做出状态列表。
利用VHDL设计状态机一般包括时序进程和组合进程两个主要部分常常使用CASE语句,条件的转换则可用CASE中的IF语句。