EDA技术与应用课后习题答案(3)

时间:2022-06-17 18:16:09 EDA技术培训 我要投稿
  • 相关推荐

EDA技术与应用课后习题答案大全

  6-8 判断下面三个程序中是否有错误,若有则指出错误所在,并给出完整程序。

  程序1:

  Signal A,EN : std_logic;

  …………………

  Process(A, EN)

  Variable B: std_log ic;

  Begin

  if EN=l then B<=A; end if; --将“B<=A”改成“B:=A”

  end process;

  程序2:

  Architecture one of sample is

  variable a,b,c:integer;

  begin

  c<=a+b; --将“c<=a+b”改成“c:=a+b”

  end;

  程序3:

  library ieee;

  use ieee.std_logic_1164.all;

  entity mux21 is

  PORT(a,b:in std_logic; sel:in std_loglc;c:out std_logle;); --将“;)”改成“)”

  end sam2; --将“sam2”改成“entity mux21”

  architecture one of mux2l is

  begin

  --增加“process(a,b,sel) begin”

  if sel= '0' then c:=a; else c:=b; end if; --应改成“if sel= '0' then c<=a; else c<=b; end if;”

  --增加“end process;”

  end two; --将“two”改成“architecture one”

  7-2 LPM_ROM、LPM_RAM、LPM_FIFO等模块与FPGA中嵌入的EAB、ESB、M4K有怎样的联系?

  答:ACEXlK系列为EAB;APEX20K系列为ESB;Cyclone系列为M4K

  第八章

  8-1仿照例8-1,将例8-4单进程用两个进程,即一个时序进程,一个组合进程表达出来。

  --解:【例8-4】的改写如下:

  LIBRARY IEEE;

  USE IEEE.STD_LOGIC_1164.ALL;

  ENTITY MOORE1 IS

  PORT(DATAIN: IN STD_LOGIC_VECTOR(1 DOWNTO 0);

  CLK,RST: IN STD_LOGIC;

  Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));

  END MOORE1;

  ARCHITECTURE behav OF MOORE1 IS

  TYPE ST_TYPE IS (ST0,ST1,ST2,ST3,ST4);

  SIGNAL C_ST,N_ST: ST_TYPE;

  BEGIN

  REG: PROCESS(CLK,RST)

  BEGIN

  IF RST='1' THEN C_ST<=ST0; -- Q<="0000";

  ELSIF CLK'EVENT AND CLK='1' THEN

  C_ST<=N_ST;

  END IF;

  END PROCESS REG;

  COM: PROCESS(C_ST,DATAIN)

  BEGIN

  CASE C_ST IS

  WHEN ST0=> IF DATAIN="10" THEN N_ST<=ST1;

  ELSE N_ST<=ST0; END IF;

  Q<="1001";

  WHEN ST1=> IF DATAIN="11" THEN N_ST<=ST2;

  ELSE N_ST<=ST1 ;END IF;

  Q<="0101";

  WHEN ST2=> IF DATAIN="01" THEN N_ST<=ST3;

  ELSE N_ST<=ST0 ;END IF;

  Q<="1100";

  WHEN ST3=> IF DATAIN="00" THEN N_ST<=ST4;

  ELSE N_ST<=ST2; END IF;

  Q<="0010";

  WHEN ST4=>IF DATAIN="11" THEN N_ST<=ST0;

  ELSE N_ST<=ST3 ;END IF;

  Q<="1001" ;

  WHEN OTHERS=> N_ST<=ST0;

  END CASE;

  END PROCESS COM;

  END behav;

  8-2为确保例8-5(2进程Mealy型状态机)的状态机输出信号没有毛刺,试用例8-4的方式构成一个单进程状态,使输出信号得到可靠锁存,在相同输入信号条件下,给出两程序的仿真波形。

  --解:【例8-5】改写如下:

  LIBRARY IEEE;

  USE IEEE.STD_LOGIC_1164.ALL;

  ENTITY MEALY1 IS

  PORT(CLK,DATAIN,RESET: IN STD_LOGIC;

  Q:OUT STD_LOGIC_VECTOR(4 DOWNTO 0));

  END MEALY1;

  ARCHITECTURE behav OF MEALY1 IS

  TYPE states IS (st0,st1,st2,st3,st4);

  SIGNAL STX: states;

  BEGIN

  PROCESS(CLK,RESET) --单一进程

  BEGIN

  IF RESET='1' THEN STX<=ST0;

  ELSIF CLK'EVENT AND CLK='1' THEN

  CASE STX IS

  WHEN st0=> IF DATAIN='1' THEN STX<=st1; END IF;

  IF DATAIN='1' THEN Q<="10000";

  ELSE Q<="01010" ; END IF;

  WHEN st1=> IF DATAIN='0' THEN STX<=st2; END IF;

  IF DATAIN='0' THEN Q<="10111";

  ELSE Q<="10100" ; END IF;

  WHEN st2=> IF DATAIN='1' THEN STX<=st3; END IF;

  IF DATAIN='1' THEN Q<="10101";

  ELSE Q<="10011" ; END IF;

  WHEN st3=> IF DATAIN='0' THEN STX<=st4; END IF;

  IF DATAIN='0' THEN Q<="11011";

  ELSE Q<="01001"; END IF ;

  WHEN st4=> IF DATAIN='1' THEN STX<=st0; END IF;

  IF DATAIN='1' THEN Q<="11101";

  ELSE Q<="01101"; END IF;

  WHEN OTHERS=> STX<=st0; Q<="00000";

  END CASE;

  END IF;

  END PROCESS;

  END behav;

  图8-6控制ADC0809采样状态图

  -- 【例8-2】根据图8-6状态图,采用Moore型状态机,设计ADC0809采样控制器。

  LIBRARY IEEE;

  USE IEEE.STD_LOGIC_1164.ALL;

  ENTITY ADCINT IS

  PORT(D: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --来自0809转换好的8位数据

  CLK: IN STD_LOGIC; --状态机工作时钟

  EOC: IN STD_LOGIC; --转换状态指示,低电平表示正在转换

  ALE:OUT STD_LOGIC; --8个模拟信号通道地址锁存信号

  START:OUT STD_LOGIC; --转换开始信号

  OE:OUT STD_LOGIC; --数据输出三态控制信号

  ADDA:OUT STD_LOGIC; --信号通道最低位控制信号

  LOCK0:OUT STD_LOGIC; --观察数据锁存时钟

  Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --8位数据输出

  END ADCINT;

  ARCHITECTURE behav OF ADCINT IS

  TYPE states IS(st0,st1,St2,st3,st4); --定义各状态子类型

  SIGNAL current_state,next_state: states:=st0;

  SIGNAL REGL: STD_LOGIC_VECTOR(7 DOWNTO 0);

  SIGNAL LOCK: STD_LOGIC;--转换后数据输出锁存时钟信号

  BEGIN

  ADDA<='1';--当ADDA<='0',模拟信号进入通道IN0;当ADDA<='1',则进入通道INI

  Q<=REGL;LOCK0<=LOCK;

  COM: PROCESS(current_state,EOC) BEGIN --规定各状态转换方式

  CASE current_state IS

  WHEN st0=> ALE<='0';START<='0';LOCK<='0';OE<='0';

  next_state<=st1; --0809初始化

  WHEN st1=> ALE<='1';START<='1';LOCK<='0';OE<='0';

  next_state<=st2 ;--启动采样

  WHEN st2=> ALE<='0';START<='0';LOCK<='0'; OE<='0';

  IF(EOC='1') THEN next_state<=st3;--EOC=1表明转换结束

  ELSE next_state<=st2; END IF; --转换未结束,继续等待

  WHEN st3=> ALE<='0';START<='0';LOCK<='0';OE<='1';

  next_state<=st4;--开启OE,输出转换好的数据

  WHEN st4=> ALE<='0';START<='0';LOCK<='1';OE<='1';next_state<=st0;

  WHEN OTHERS=>next_state<=st0;

  END CASE;

  END PROCESS COM;

  REG:PROCESS(CLK)

  BEGIN

  IF(CLK'EVENT AND CLK='1') THEN current_state<=next_state; END IF;

  END PROCESS REG; --由信号current_state将当前状态值带出此进程:REG

  LATCH1: PROCESS(LOCK) --此进程中,在LOCK的上升沿,将转换好的数据锁入

  BEGIN

  IF LOCK='1' AND LOCK'EVENT THEN REGL<=D; END IF;

  END PROCESS LATCH1;

  END behav;

  8-5在不改变原代码功能的条件下用两种方法改写例8-2,使其输出的控制信号(ALE、START、OE、LOCK)没有毛刺。方法1:将输出信号锁存后输出;方法2:使用状态码直接输出型状态机,并比较这三种状态机的特点。

  -- 解:"【例8-2】根据图8-6状态图,采用Moore型状态机,设计ADC0809采样控制器" 方法1(将输出控制信号锁存后输出)的VHDL程序代码如下:

  LIBRARY IEEE;

  USE IEEE.STD_LOGIC_1164.ALL;

  ENTITY ADCINT IS

  PORT(D: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --来自0809转换好的8位数据

  CLK: IN STD_LOGIC; --状态机工作时钟

  EOC: IN STD_LOGIC; --转换状态指示,低电平表示正在转换

  ALE: OUT STD_LOGIC; --8个模拟信号通道地址锁存信号

  START: OUT STD_LOGIC; --转换开始信号

  OE: OUT STD_LOGIC; --数据输出三态控制信号

  ADDA: OUT STD_LOGIC; --信号通道最低位控制信号

  LOCK0: OUT STD_LOGIC; --观察数据锁存时钟

  Q: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --8位数据输出

  END ADCINT;

  ARCHITECTURE behav OF ADCINT IS

  TYPE states IS(st0,st1,St2,st3,st4); --定义各状态子类型

  SIGNAL current_state,next_state: states:=st0;

  SIGNAL REGL: STD_LOGIC_VECTOR(7 DOWNTO 0);

  SIGNAL LOCK: STD_LOGIC;--转换后数据输出锁存时钟信号

  SIGNAL ALE0: STD_LOGIC; --8个模拟信号通道地址锁存信号

  SIGNAL START0: STD_LOGIC; --转换开始信号

  SIGNAL OE0: STD_LOGIC; --数据输出三态控制信号

  BEGIN

  ADDA<='1';--当ADDA<='0',模拟信号进入通道IN0;当ADDA<='1',则进入通道INI

  Q<=REGL; --LOCK0<=LOCK;

  COM: PROCESS(current_state,EOC,CLK) BEGIN --规定各状态转换方式

  CASE current_state IS

  WHEN st0=> ALE0<='0';START0<='0';LOCK<='0';OE0<='0';