米勒型状态机和fifo存储器由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“第四章有限状态机要点”。
一、课程设计任务和目的设计目的:本次课程设计是在学生学习完数字电路、模拟电路、电子设计自动化的相关课程之后进行的,通过对数字电路或模拟电路的模拟与仿真等,熟练使用相关软件设计具有较强功能的电路,提高实际动手,为将来设计大规模集成电路打下基础。
课程任务:(1)设计一个存储器。
(2)设计一个米勒型状态机。
二、分析与设计
FIFO设计部分: 1.设计任务分析:
FIFO(First In First Out)是先进先出存储器的缩写,它是一种实现数据先进先出的存储器件,通常用作数据缓冲器。FIFO的接口信号包括写时钟和读时钟、与写时钟同步的写有效和写数据、与读时钟同步的读有效和读数据。写地址产生模块一般还根据读地址和写地址来产生FIFO的满标志;读地址产生模块一般根据读地址和写地址来产生FIFO的空标志。为了实现正确的读写和避免FIFO的上溢或下溢,通常还应给出与读时钟和写时钟同步的FIFO的空标志(empty)和满标志(ful1),以禁止读写操作。写地址产生模块通常根据写时钟和写有效信号来产生递增的写地址,而读地址产生模块则根据读时钟和读有效信号来产生递增的读地址。
2.设计方案论证:
以同步FIFO设计为例,FIFO的原理结构框图如图1所示,FIFO由5个模块构成,它们是双口RA M、写地址计数器、读地址计数器、数据满标志、数据空标志。双口RA M属于随机存储器,但它的读地址总线和写地址总线分开的,同时其读数据总线和写数据总线也是分开的,读写数据可同时进行的;写地址计数器输出的是写地址信号,当写地址信号Wr=1且full=0时。Data_in数据被写入写地址所指向的存储单元,同时地址计数器值加1;读地址计数器输出的是读地址信号,当读地址信号rd=1且empty=0时,输出数据更新为当前读地址计数器所指的值,并且读地址计数器值加1;数据空、满标志是来抑制下溢、上溢的产生。
图1
3.详细设计:
FIFO存储器是环形结构,读地址计数器和写地址计数器分别代表下一次读数据操作时的读指针和下一次写数据操作时的写指针。由读指针和写指针与FIFO状态之间的关系可以看出,当wraddr=rdaddr时,FIFO数据为空;当wraddr-rdaddr=M-l或rdaddr-wraddr=l时,FIFO数据为满;当wraddr>=rdaddr时,wraddr-rdaddr为FIFO内数据个数;当wraddr
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY FIFO IS PORT
(clk
: IN STD_LOGIC;
--FIFO的时钟输入
write_en : IN STD_LOGIC;
--FIFO的写使能信号;
read_en
: IN STD_LOGIC;
--FIFO的读使能信号;
rst
: IN STD_LOGIC;
--FIFO的复位信号;
din
: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
dout
: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
empty
: OUT STD_LOGIC;
full
: OUT STD_LOGIC);END FIFO;ARCHITECTURE Behavioral OF FIFO IS
TYPE fifo_array IS ARRAY(0 TO 63)OF STD_LOGIC_VECTOR(7
DOWNTO 0);--定义长为64的一维数组
SIGNAL fifo_memory :
fifo_array;
--定义FIFO的储存介质;
SIGNAL full_flag
:
STD_LOGIC;
--内部满标志信号;
SIGNAL empty_flag
:
STD_LOGIC;
--内部空标志信号 SIGNAL read_addr
: STD_LOGIC_VECTOR(5 DOWNTO 0);--读地址
SIGNAL write_addr
:
STD_LOGIC_VECTOR(5 DOWNTO 0);--写地址
SIGNAL
counter
:
STD_LOGIC_VECTOR(5 DOWNTO 0);--计数器
BEGIN
PROCESS(rst,clk)
BEGIN
IF(rst='0')THEN
--复位高电平有效;
dout
--时钟上升沿来临;
IF(read_en='1' AND empty_flag='0')THEN
--读时能信号高电平有效且非空条件下
dout
IF(clk'EVENT AND clk='1')THEN
--上升沿有效
IF(rst='1' AND write_en='1' AND full_flag='0')THEN--写使能信号有效且非满
fifo_memory(CONV_INTEGER(write_addr))
END IF;
END IF;END PROCESS;PROCESS(rst,clk)BEGIN
IF(rst='0')THEN
write_addr
ELSIF(clk'event AND clk='1' AND full_flag='0')THEN
write_addr
END IF;END PROCESS;PROCESS(rst,clk)
BEGIN
IF(rst='0')THEN
read_addr
ELSIF(clk'event AND clk='1')THEN
read_addr
END IF;END PROCESS;PROCESS(clk,rst)
VARIABLE temp:STD_LOGIC_VECTOR(1 DOWNTO 0);--定义变量 BEGIN
IF(rst='0')THEN
counter
ELSIF(clk'event AND clk='1')THEN
temp :=read_en & write_en;CASE temp IS
WHEN “00”=>
counter
WHEN “01”=>
IF(counter/=“111111”)THEN
counter
--地址加1
END IF;
WHEN“10”=>
IF(counter/=“000000”)THEN
counter
--地址减1
END IF;
WHEN“11”=>
counter
WHEN OTHERS=>
counter
END CASE;
END IF;END PROCESS;PROCESS(counter)
BEGIN
IF(counter=“000000”)THEN empty_flag
BEGIN
IF(counter=“111111”)THEN
full_flag
ELSE
full_flag
END IF;END PROCESS;--输入满标志信号
full
米勒型状态机设计部分:
1、设计任务分析:
米勒型(Mealy)状态机的输出逻辑不仅与当前状态有关,还与当前的输入 量有关,输入变量的作用不仅是与当前状态一起决定当前状态的下一状态是什么,还决定当前状态的输出变量的逻辑值。
2、设计方案论证:
Mealy状态机的VHDL结构要求至少有两个进程,或者是一个状态机进程加一个独立的并行贩值语句。
3、代码及分析:
LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.ALL;ENTITY mealy IS PORT(clk, datain, reset : IN std_logic;dataout : OUT std_logic_vector(3 DOWNTO 0));END ENTITY mealy;ARCHITECTURE arc OF mealy IS TYPE state_type IS(s1, s2, s3, s4);SIGNAL state : state_type;BEGIN state_proce : PROCESS(clk, reset)--时序逻辑进程 BEGIN IF reset='1' THEN--异步复位 state
CASE state IS WHEN S1=>IF datain='1' THEN stateIF datain='0' THEN stateIF datain='1' THEN state IF datain='0' THEN state IF datain='1' THEN dataout IF datain='0' THEN dataout IF datain='1' THEN dataout IF datain='0' THEN dataout0,输出dataout随即发生变化,由0000->0001,反映了Mealy状态机属于异步输出状态机而它不依赖于时钟的鲜明特点。
图2
三、系统实施
FIFO存储器部分:
下面是同步FIFO的仿真图,时钟周期是100ns,写使能信号固定在高电平,读使能信号先在低电平,而后到高电平。如图3
图3
从图3中可以看出,复位后,开始往同步FIFO写数,空标志信号转为非空,写读使能信号有效后,开始读数,但是由于写进存储器仍未满,所以输出”000000”。符合设计要求。
图4
图4可以看出,经过大概64个时钟周期后,FIFO储存器内数据已经写满。开始往外依次读数,当每个时钟上升沿到来时,边写边读。实现了FIFO同步读写和缓冲的作用。
图5(时钟为200ns)
同样由图5可以看出,由于时钟周期为200ns,增加一倍。所以到经历了大概12多微秒即写入64个数据后开始往外读数。仍然实现了先进先出的功能。
米勒型状态机部分:
由图可见,状态机在异步复位信号来到时,datain=1,输出dataout=0001,在clk的有效上升沿来到前,datain发生了变化,由1->0,输出dataout随即发生变化,由0000->0001,反映了Mealy状态机属于异步输出状态机而它不依赖于时钟的鲜明特点。
四、总结与体会
本次实习最重要的一点是学会使用Quarters软件。QuartersⅡ是目前应用非常广泛的一款CPLD/FPGA开发系统。它是一个完整的多平台设计环境。它可以轻松满足特定设计的需要,并且提供可编程片上系统(SOPC)设计的综合开发平台,是SOPC设计的基础。QuartersⅡ 将设计、综合、布局、仿真验证、和编程下载以及第三方EDA工具集成在一个无缝的环境中,可以进行系统级设计、嵌入式系统级设计和可编程逻辑器件设计。
然后是对数电、VHDL语言的复习及运用。在QuartersⅡ环境中,以VHDL作为描述语言,遵循EDA标准设计的开发流程,实现了用FPGA器件对FIFO(先进先出)存储器进的设计。另一个米勒型状态机,知道了建立有限状态机主要有两种方法:状态转移图(状态图)和状态转移表(状态表)。它们是等价的,相互之间可以转换。通过列出他的状态转换图,进行分析,提高效率。
这次实习通过简单的设计运用打下基础,为今后真正遇到复杂的电路设计做准备,收获颇多。
五、参考文献
(1)潘松《VHDL实用教程》,电子科技大学出版社,2001年2月。(2)黄正瑾《计算机结构与逻辑设计》,高等教育出版社,2001年6月。(3)江晓安《数字电子技术》,西安电子科技大学出版社,2002年3月。