4031|3

10

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

大家好!!请教VHDL高手1个问题!!! [复制链接]

大家好!!请教VHDL高手1个问题!!!

问题主要出在如下语句上:
--#20100403#问题:不知怎么回事?若下面三语句不屏蔽,则ADclk信号不正确,为乱码;而下面3语句屏蔽后,ADclk信号就没有问题了,但就无法分频了???
if Cs='0' AND RD='1' AND Addr=11  then
  FrqDivReg = FRQ;    --从SCM读入AD数采芯片时钟分频系数FrqDivReg到EPM7032中
end if;

      很简单的一个程序,我也注释的非常清楚! 哎,自己水平不够,调了很长时间都没解决这个问题,请牛人帮忙修改一下,只要能满足我的功能需求即可。

   谢谢了!!我QQ:121889835
:P
--------…………………………程序如下(Quartus II 8.0 工程文件见附件)……………………………………--

--基于CPLD的VHDL 40M高频信号双通道数据采集系统设计
--分类: CPLLD电子设计
--硬件平台: MAX7000S-EPM7032STC44-7
--开发平台:Quartus II 8.0
--开发语言: VHDL

--创建时间:2010.02.01,08:45,Palmer  
--修订时间:2010.04.03,20:30,Palmer  
--完善时间:

--功能说明:本CPLD程序主要完成一接口功能,充当单片机与FIFO-IDT7204之间的接口器件;
--    1.对CPLD系统时钟进行分频,分频系数由FRQ(2 downto 0)确定,得到AD数采芯片时钟ADclk
--    2.响应9698比较信号输入BJ(1 downto 0),通过6个系统时钟进行去抖处理后,触发D-触发器,输出FIFO-IDT7204--WR有效信号Qin,
--        将数据写入FIFO-IDT7204中,StopIn作为D-触发器复位信号,充当数据写入使能信号; FifoFF指示FIFO-IDT7204数据写满,以中止数据写入
--    3.Cs:片选信号;RD:总线读信号;Addr:地址信号--00,选择IDT7204_1(Qout="110"); 01,选择IDT7204_2(Qout="101");
--        10,选择IDT7204_3(Qout="011"); 11,选择FRQ(可双向;RD=0,信号流入EPM7032; RD=1,信号流入出EPM7032);

--功能要求:
--    1.
--    2.

--操作说明:
--

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;

ADclk <= (OTHERS=>FrqDivClk);        --分频,获取AD采样时钟ADclk,分频系数由FrqDivReg(2 downto 0)决定

--/RD读数据,低有效
Process( Cs,RD,Addr )    --Process( Cs,RD )        --片选EPM7032
Begin
    Qout<="111";            --都不选择IDT7204
   
    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输入,高有效

end    Behavioral;

[ 本帖最后由 randy67 于 2010-4-12 16:29 编辑 ]

DAQ2_CPLD_Cache.rar

179.29 KB, 下载次数: 7

Quartus II 8.0工程文件

此帖出自FPGA/CPLD论坛

最新回复

你应当用RD上升沿读数据  详情 回复 发表于 2010-4-12 18:26
点赞 关注
 

回复
举报

354

帖子

1

TA的资源

五彩晶圆(中级)

沙发
 
:P

这是花痴的表现
此帖出自FPGA/CPLD论坛
 
 

回复

6892

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 

楼上兄弟

基本上没有掌握基本的硬件电路要领。
此帖出自FPGA/CPLD论坛
 
 
 

回复

202

帖子

0

TA的资源

一粒金砂(高级)

4
 

平时RD=1,好象你不停给FrqDivReg 只要地址符合送

你应当用RD上升沿读数据
此帖出自FPGA/CPLD论坛

赞赏

1

查看全部赞赏

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表