问题主要出在如下语句上:
--#20100403#问题:不知怎么回事?若下面三语句不屏蔽,则ADclk信号不正确,为乱码;而下面3语句屏蔽后,ADclk信号就没有问题了,但就无法分频了???
if Cs='0' AND RD='1' AND Addr=11 then
FrqDivReg = FRQ; --从SCM读入AD数采芯片时钟分频系数FrqDivReg到EPM7032中
end if;
Library ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;
--实体,规定了设计的输入、输出信号和引脚
Entity DAQ2_EPM7032 is
Port(GCLK: in std_logic; --系统时钟输入管脚
BJ: in std_logic_vector(1 downto 0);--:= "00"; --9698比较信号输入到EPM7032,高有效
Cs: in std_logic;--:= '1'; --Y1-->Cs, EPM7032-Cs片选控制信号输入,低有效
RD: in std_logic;--:= '1'; --EPM7032-R读控制信号输入,低有效
Addr: in std_logic_vector(1 downto 0);--:= "11"; --EPM7032地址输入
StopIn:in std_logic;--:= '1'; --P3_3-->StopIn,ADuC输入到EPM7032-CPLD的D触发器输出控制IDT7204--/WR信号:0,停止写入;1,正常,低有效; P3^3 <---> EPM7032
FifoFF:in std_logic;--:= '1'; --P1_6-->FifoFF,IDT7204-/FF输入到EPM7032, Fifo满控制信号输入,低有效
FRQ: in std_logic_vector(2 downto 0);--:= "111"; --AD数采芯片时钟频率细分数 控制输入
ADclk: out std_logic_vector(1 downto 0):= "00"; --EPM7032时钟输出,用于AD数采芯片时钟
Qin: out std_logic_vector(2 downto 0):= "111"; --EPM7032控制数据输出,用于IDT7204-WR输入
Qout: out std_logic_vector(2 downto 0):= "111"); --EPM7032控制数据输出,用于IDT7204-R输入
End DAQ2_EPM7032;
--结构体,定义了设计的具体结构和操作(行为)
Architecture Behavioral of DAQ2_EPM7032 is
SIGNAL FrqDivClk: std_logic:='0'; --按分频系数分频后得到的时钟
SIGNAL FrqDivReg: std_logic_vector(2 downto 0):="001"; --AD数采芯片时钟分频系数 寄存器
SIGNAL DivCounter: std_logic_vector(2 downto 0):="001"; --分频时钟用到的计数器向量
SIGNAL ScanCounter:std_logic_vector(2 downto 0):="000"; --计数时钟用到的计数器向量
SIGNAL TriggerClk: std_logic:='0'; --触发器用到的时钟信号
SIGNAL EnQin: std_logic:='0'; --EPM7032控制数据输出使能信号,用于使能IDT7204-WR输入,高有效
Begin
--分频, 获取AD采样时钟ADclk: 分频系数由FrqDivReg(2 downto 0)决定
AD_CLOCK: Process(FrqDivReg,GCLK) -- 分频, 获取AD采样时钟ADclk
Begin
if FrqDivReg="000" then --OR FrqDivReg="ZZZ"
--ADclk(0) <= GCLK;
--ADclk(1) <= GCLK;
--ADclk <= (OTHERS=>GCLK);
FrqDivClk <= GCLK;
--end if;
elsif GCLK='1' and GCLK'event then
if(DivCounter>=FrqDivReg) then --计数器加到FrqDivReg(2 downto 0)时取反
--ADclk <= NOT ADclk; --ADclk(1 downto 0) <= NOT ADclk(1 downto 0);
--ADclk(0) <= NOT ADclk(0);
--ADclk(1) <= NOT ADclk(1);
FrqDivClk <= NOT FrqDivClk;
DivCounter<="001";
else
DivCounter<=DivCounter+'1';
end if;
end if;
end Process AD_CLOCK;
if RD='0' AND Cs='0' then --读有效
--signal SS: std_logic_vector(2 downto 0);
--SS <= Y & S1 & S2 & C;
--if(Cs='0') then --片选EPM7032
--if(Addr="11") then --选择FRQ部分,读部分
--Qout<= "111";
--FRQ <= FrqDivReg; --读出AD数采芯片时钟分频系数FrqDivReg到SCM中
--else
--FRQ <= "ZZZ"; --'Z',高阻态
if(Addr="00") then --选择IDT7204_1
Qout<="110"; --选择IDT7204_1
elsif(Addr="01") then --选择IDT7204_2
Qout<="101"; --选择IDT7204_2
elsif(Addr="10") then --选择IDT7204_3
Qout<="011"; --选择IDT7204_3
else
Qout<="111"; --都不选择IDT7204
end if;
--end if;
--else --RD/='0'
--Qout<="111"; --都不选择IDT7204
--end if;
--else
--Qout<="111"; --都不选择IDT7204
--FRQ <="ZZZ"; --'Z',高阻态
end if;
--#20100403#问题:不知怎么回事?若下面三语句不屏蔽,则ADclk信号不正确,为乱码;而下面3语句屏蔽后,ADclk信号就没有问题了,但就无法分频了???
if Cs='0' AND RD='1' AND Addr="11" then
FrqDivReg <= FRQ; --从SCM读入AD数采芯片时钟分频系数FrqDivReg到EPM7032中
end if;
end Process;
--防抖计数,ScanCounter计够6次后产生一个TriggerClk上升沿,以触发D触发器使能IDT7204-WR输入
SCAN: Process( StopIn,GCLK )
--VARIABLE ScanCounter:std_logic_vector(2 downto 0):="000"; --计数时钟用到的计数器向量
begin
if(StopIn='0') then --BJ高有效,StopIn低有效,FifoFF低有效
TriggerClk <='0';
ScanCounter<="000";
--end if;
elsif(GCLK='1' and GCLK'event) then
--if(BJ/="00" AND StopIn/='0' AND FifoFF/='0') then --BJ高有效,StopIn低有效,FifoFF低有效
if( BJ/="00" ) then --BJ高有效,StopIn低有效,FifoFF低有效
if( ScanCounter>=5 ) then --对于信号量ScanCounter,值并不立即生效,此时的5代表6次计数以后
ScanCounter<="000";
--TriggerClk <= NOT TriggerClk; --此为多次跳变
TriggerClk <= '1'; --此为一次跳变
else
ScanCounter<=ScanCounter+'1';
end if;
else
--TriggerClk <= '0';
ScanCounter <= "000";
end if;
end if;
end Process SCAN;
--D触发器触发扫描信号
TRIGGER: Process( StopIn,FifoFF,TriggerClk )
begin
if(StopIn='0' OR FifoFF='0') then --BJ高有效,StopIn低有效,FifoFF低有效
--Qin <= "111";
EnQin <= '0'; --EPM7032控制数据输出使能信号,用于使能IDT7204-WR输入,高有效
--end if;
--else
elsif(TriggerClk='1' AND TriggerClk'event) then
--Qin <= "000";
EnQin <= '1'; --EPM7032控制数据输出使能信号,用于使能IDT7204-WR输入,高有效
end if;
end Process;
--Qin(0) <= NOT( EnQin AND ADclk(0) AND ADclk(1) );
--Qin(1) <= NOT( EnQin AND ADclk(0) AND ADclk(1) );
--Qin(2) <= NOT( EnQin AND ADclk(0) AND ADclk(1) );
Qin <= ( OTHERS=>NOT(EnQin AND FrqDivClk) ); --EnQin,EPM7032控制数据输出使能信号,用于使能IDT7204-WR输入,高有效