资源描述
实验三 序列信号发生器与检测器设计
一、实验目的
实验八 序列信号发生器和序列信号检测器
实验八 序列信号发生器和序列信号检测器
实验八 序列信号发生器和序列信号检测器
实验八 序列信号发生器和序列信号检测器
1.熟悉EDA技术开发流程;
2.熟悉Quartes II集成开发软件的使用;
3.初步熟悉PH-1V型实验装置的使用;
二、实验要求
用状态机设计实现串序列检测器设计,可以用原理图输入法设计序列信号发生器,要求产生序列:0111010011011010;再进行检测设计,若检测到序列:11010则输出为“1”,否则输出为“0”。并对其进行仿真和硬件测试。
三、实验设计思路
本实验可以分为两部分来设计,第一步设计序列信号发生器,在这里可以采用模16的计数器74LS161来产生模16的计数,并由它的4位输出可以产生16种状态,由此可以用来设计序列产生器,也可以采用状态机产生序列,本实验用状态机产生序列。
第二步设计序列检测器,这里用状态机设计,如果为真输出1,为假输出为0;
第三步设计串行转并行输出,将序列并行输出在LED管上显示。
第四步是设计一个计数脉冲,记录出现所需要的序列的次数。
第五步是将所有模块连接起来,构成一个完整的序列发生和检测设计器。
四、实验程序
1、序列发生器
library ieee;
use ieee.std_logic_1164.all;
entity xulie_produce is—序列产生电路
port(clk,reset:in std_logic;
comb_outputs:out std_logic);--序列输出
end xulie_produce;
architecture behav of xulie_produce is
type fsm_st is (s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15);--状态设计
signal current_state,next_state:fsm_st;
begin
reg:process(reset,clk)—主控时序进程
begin
if reset ='1'then current_state<=s0;
elsif clk='1'and clk'event then
current_state<=next_state;
end if;
end process;
com:process(current_state)—主控组合进程
begin
case current_state is
when s0 => comb_outputs<='0';next_state<=s1;
when s1 => comb_outputs<='1';next_state<=s2;
when s2 => comb_outputs<='1';next_state<=s3;
when s3 => comb_outputs<='1';next_state<=s4;
when s4 => comb_outputs<='0';next_state<=s5;
when s5 => comb_outputs<='1';next_state<=s6;
when s6 => comb_outputs<='0';next_state<=s7;
when s7 => comb_outputs<='0';next_state<=s8;
when s8 => comb_outputs<='1';next_state<=s9;
when s9 => comb_outputs<='1';next_state<=s10;
when s10 => comb_outputs<='0';next_state<=s11;
when s11 => comb_outputs<='1';next_state<=s12;
when s12 => comb_outputs<='1';next_state<=s13;
when s13 => comb_outputs<='0';next_state<=s14;
when s14 => comb_outputs<='1';next_state<=s15;
when s15 => comb_outputs<='0';next_state<=s0;
end case;
end process;
end behav;
2、序列检测器
library ieee;
use ieee.std_logic_1164.all;
entity s_machine is—序列检测电路
port(clk,reset:in std_logic;
state_inputs:in std_logic;--状态转移控制
comb_outputs:out std_logic);检测结果输出
end s_machine;
architecture behav of s_machine is
type fsm_st is (s0,s1,s2,s3,s4,s5);
signal current_state,next_state:fsm_st;
begin
reg:process(reset,clk)主控时序进程
begin
if reset ='1'then current_state<=s0;
elsif clk='1'and clk'event then
current_state<=next_state;
end if;
end process;
com:process(current_state,state_inputs)—主控组合进程
begin
case current_state is
when s0 => comb_outputs<='0';
if state_inputs='1' then next_state<=s1;
else next_state<=s0;
end if;
when s1 => comb_outputs<='0';
if state_inputs='1' then next_state<=s2;
else next_state<=s0;
end if;
when s2 => comb_outputs<='0';
if state_inputs='0' then next_state<=s3;
else next_state<=s2;
end if;
when s3 => comb_outputs<='0';
if state_inputs='1' then next_state<=s4;
else next_state<=s0;
end if;
when s4 => comb_outputs<='0';
if state_inputs='0' then next_state<=s5;
else next_state<=s2;
end if;
when s5 => comb_outputs<='1';--检测到11010输出1
if state_inputs='0' then next_state<=s0;
else next_state<=s1;
end if;
end case;
end process;
end behav;
3、串行输出变并行输出
library ieee;
use ieee.std_logic_1164.all;
entity shift is –串行变并行电路
port(clk,load,a:in std_logic;
din :out std_logic_vector(7 downto 0));--并行输出
end shift;
architecture behav of shift is
begin
process(clk,load,a)
variable reg8 :std_logic_vector(7 downto 0);
begin
if clk'event and clk='1'then
if load='1'then reg8(7 downto 1):=reg8(6 downto 0);--load为1时开始装载
reg8(0):=a;
end if;
end if;
din<=reg8;
end process;
end behav;
4、计数器设计
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY CNTM IS –计数电路
PORT (CLK,RST,EN:IN STD_LOGIC;
a,b,c:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END CNTM;
ARCHITECTURE behav OF CNTM IS
signal a1,b1,c1:std_logic_vector(3 downto 0);
BEGIN
PROCESS (CLK,RST,EN)
VARIABLE N :INTEGER RANGE 0 TO 1000;
BEGIN
IF RST ='1' THEN N:=0;
ELSIF CLK 'EVENT AND CLK='1' THEN
IF EN = '1' THEN
IF N<100 THEN N:=N+1;--设计为100计数
ELSE N:=0;
END IF;
END IF;
END IF;
a1<=conv_std_logic_vector((N/100),4);
b1<=conv_std_logic_vector(((N/10)mod 10),4);
c1<=conv_std_logic_vector((N mod 10),4);
a<=a1;b<=b1;c<=c1;
END PROCESS;
5、序列发生和检测检测器电路
五、实验步骤
1、建立工作库文件和编辑设计文件
(1)在D盘新建一个文件夹用来保存工程文件
(2)打开QuartusⅡ8.0软件,选择菜单File->New->VHDL File,点击OK后在打开的界面下输入已经设计好的程序。
(3)输入完程序后,保存文件选择菜单File->Save as,将文件保存到工程文件夹中,文件名不能含有中文字符,最好与程序实体名一样。
(4)保存好文件后,一般会提示是否新建一个工程,选择是,如果没有就在菜单打开File->New project Wizard项,将出现工程项目建立向导。
(5)按照工程项目向导提示设计好工程中要用到的文件放到同一个工程文件夹中,选择实验中用到的芯片和第三方工具(一般默认EDA自带的工具箱,在这里不做任何选择)。
(6)完成工程项目建立后选择processing->start compilation或选择 按钮开始全程编译,如果编译过程中出现错误或警告提示,则双击错误或警告提示就可以找到该错误或警告在设计文件的位置。
(7)在完成设计输入和综合编译以后,可以通过时序仿真来检查设计是否符合要求,这里我们可以通过建立波形文件(.vmf)。在选择File->New->Vetor Waveform File项后选择OK。
(8)设计Edit栏选择End Time设计时间为50 us ,在View->ulitity windows中选择Node Finder或按Alt+1,然后将所有的输入输出拖到波形文件中,设计好输入时序和输出方式后保存文件。选择processing栏中的Start simulation或选择 按钮开始波形仿真。
(9)仿真成功后得到了预期的设计效果后,将引脚锁定。方法如下:选择assignment中的pins,将To栏的信号锁定到相应的Location引脚列中。引脚号对应关系可以从实验手册中查找,将引脚锁定如下:
六、仿真波形分析
检测到第一个序列
下图为实验所得的波形图
计数输出显示
序列移位并行输出
检测到第二个序列
续波形图如下
第一个序列产生完成,开始下一个序列
七、硬件测试结果
由波形文件可知,在LED灯上可以看到移位输出,在数码管上可以看到检测结果输出。时钟clk可以设成手动控制,这样可以更好观察序列产生和检测。先让计数器清零和让状态机调为初始状态,然后让rest和RET为低电平,EN和load为高电平。按下clk控制键脉冲键,可以看到LED灯上产生移位输出序列,当出现了11010时,数码管上显示1,表示检测到了一个序列,继续按下脉冲键,可以看到序列移出,当下一个11010出现时,可以看到数码管显示加1。当产生完一个完整序列,又开始下一个序列产生。因此实验结果与预期的效果相符,实验成功。
八、实验心得
通过本次实验我更加熟悉状态机的使用,还有移位显示输出的设计。我发现每个实验都有很多种方式来实现,不同的人,有不同的思路。这让我们有可以互相学习的机会,学习别人的好的想法。同时这也是这门课最有趣的地方,不同的方式,同样的目的,殊途同归。
展开阅读全文