打印

怎么读AD7714的数据?

[复制链接]
楼主: anqi0126
手机看帖
扫描二维码
随时随地手机跟帖
21
anqi0126|  楼主 | 2010-11-15 20:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
有的是type in choice must be "INTEGER"
can't interpret subprogram call   
aggregate choice must be locally static
最多的就是这三个错误

使用特权

评论回复
22
anqi0126|  楼主 | 2010-11-16 09:28 | 只看该作者
我又改了,现在提示好多错误,都是868。IN2' missing source。

使用特权

评论回复
23
SuperX-man| | 2010-11-16 09:50 | 只看该作者
小版我没用过你的软件,不过从你报错信息来看,都是一些基础性问题,例如信号及变量的定义,VHDL描述语句的语法及结构,信号及变量的匹配等等.

小版还是建议你别一上来就一定要写个东西出来,还是拿本书从头看起来再写,VHDL是比较严谨的.
你可以按照书中的例子或实例来练练手.然后再来写这个AD7714的驱动.

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
anqi0126 + 1
24
anqi0126|  楼主 | 2010-11-16 10:08 | 只看该作者
我知道基础很重要:'(但是我现在是被逼写这个驱动的。不写不行!我正在努力,天天回家看书!苦恼啊!我改了程序,你能不能帮我看看程序有什么不对的,这是用VHDL写的。:'(真的非常感谢你啊!就你一直在帮我。
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
ENTITY AD7714xiaosong IS
     PORT(
         AD7714sclk:OUT std_logic;
         AD7714pol:OUT std_logic;
         AD7714sync:OUT std_logic;
         AD7714reset:OUT std_logic;
         AD7714standby:OUT std_logic;
         AD7714din:OUT std_logic;
         AD7714cs:OUT std_logic;
         AD7714drdy:IN std_logic;
         AD7714dout:IN std_logic;
         AD7714buffer:OUT std_logic;
         clk:IN std_logic
         );
END AD7714xiaosong;
ARCHITECTURE AD7714DATA OF AD7714xiaosong IS
     SIGNAL Read_AD7714DATA:std_logic_vector(23 downto 0);
     SIGNAL AD7714in_DATA:std_logic_vector(7 downto 0);
     BEGIN
     PROCESS(clk)
        VARIABLE i:INTEGER RANGE 0 TO 6;
        VARIABLE m:INTEGER RANGE 0 TO 23;
        VARIABLE n:INTEGER RANGE 0 TO 6;                                               --读数据
       BEGIN
          AD7714pol<='1';                              --初始化
          AD7714sync<='1';
          AD7714standby<='1';
          AD7714buffer<='1';
          AD7714cs<='0';
          AD7714reset<='1';
          IF(clk'EVENT and clk='1')THEN
                IF n<8 THEN
                  CASE n IS
                  WHEN 0 => AD7714in_DATA<="00100000";              
                  WHEN 1 => AD7714in_DATA<="00010001";              
                  WHEN 2 => AD7714in_DATA<="00110000";
                  WHEN 3 => AD7714in_DATA<="00000000";
                  WHEN 4 => AD7714in_DATA<="00010000";
                  WHEN 5 => AD7714in_DATA<="00100000";
                  WHEN 6 => AD7714in_DATA<="00011000";  --选择数据寄存器
                  WHEN OTHERS => AD7714in_DATA<="00011000";
                  END CASE;
                END IF;
                 IF i< 8 THEN
                   AD7714sclk<='0';
                   AD7714din<=AD7714in_DATA(i);       --把数据写入AD7714
                   i:=i+1;
                   AD7714sclk<='1';
                 ELSIF n=6 THEN
                               IF AD7714drdy='0' THEN             --如果AD有新数据产生,就读AD输出数据
                                         IF m<24 THEN
                                              AD7714sclk<='0';
                                              Read_AD7714DATA(m)<=AD7714dout;   
                                              i:=0;
                                              AD7714sclk<='1';
                                         END IF;
                               END IF;
                            ELSE i:=0;
                            n:=n+1;
               END IF;
   
       END IF;
        
     END PROCESS;
END AD7714DATA;

使用特权

评论回复
25
anqi0126|  楼主 | 2010-11-16 10:11 | 只看该作者
对了,改了以后,现在提示好多错误,都是868。IN2' missing source。有一千多个呢。估计就是同一个问题

使用特权

评论回复
26
anqi0126|  楼主 | 2010-11-16 10:53 | 只看该作者
哈哈哈,我又改了,终于编译没错误了,有警告。

使用特权

评论回复
27
SuperX-man| | 2010-11-16 12:48 | 只看该作者
你没有必要把初始化和AD7714的配置都放在Process进程下.
因为你定义的Process(CLK)进程是只要一有时钟就会触发.每次都重新配置一遍就有点多余了.
还有你想完成一个串行输入语句,可以用for.......loop来实现,而不用靠时钟来触发实现.

使用特权

评论回复
28
anqi0126|  楼主 | 2010-11-16 13:55 | 只看该作者
那AD7714的初始化放在哪啊?就是因为不知道放哪才放那的。串行输入不用时钟来触发,我好好想想的。

使用特权

评论回复
29
SuperX-man| | 2010-11-17 18:00 | 只看该作者
本帖最后由 SuperX-man 于 2010-11-17 18:04 编辑

AD7714pol<='1';         
       AD7714sync<='1';
          AD7714standby<='1';
          AD7714buffer<='1';
          AD7714cs<='0';
          AD7714reset<='1';
这些信号,就可以放到process外面.

VHDL不是C语言,Process不是main函数.
从第一个Begin以下,就可以写代码了.
process只是一个触发进程.

使用特权

评论回复
30
anqi0126|  楼主 | 2010-11-19 09:03 | 只看该作者
你太棒了!看出我还徘徊在C语言的语法那了。呵呵多谢提醒!

使用特权

评论回复
31
anqi0126|  楼主 | 2010-11-19 14:57 | 只看该作者
我写的程序在编译的时候,总有信号被忽略,仿真的时候根本不能生成节点,是怎么回事啊?是程序没循环到那吗?

使用特权

评论回复
32
anqi0126|  楼主 | 2010-11-19 15:34 | 只看该作者
我试着用for loop,里面嵌套一个case 语句来改写
IF n<8 THEN
                  CASE n IS
                  WHEN 0 => AD7714in_DATA<="00100000";              
                  WHEN 1 => AD7714in_DATA<="00010001";              
                  WHEN 2 => AD7714in_DATA<="00110000";
                  WHEN 3 => AD7714in_DATA<="00000000";
                  WHEN 4 => AD7714in_DATA<="00010000";
                  WHEN 5 => AD7714in_DATA<="00100000";
                  WHEN 6 => AD7714in_DATA<="00011000";  --选择数据寄存器
                  WHEN OTHERS => AD7714in_DATA<="00011000";
                  END CASE;
                END IF;
                 IF i< 8 THEN
                   AD7714sclk<='0';
                   AD7714din<=AD7714in_DATA(i);       --把数据写入AD7714
                   i:=i+1;
                   AD7714sclk<='1';


但是怎么都觉得不对啊?
L1:FOR n IN 0 TO 6 LOOP
                  CASE n IS
                  WHEN 0 => AD7714in_DATA<="00100000";              
                  WHEN 1 => AD7714in_DATA<="01010001";              
                  WHEN 2 => AD7714in_DATA<="00110000";
                  WHEN 3 => AD7714in_DATA<="10000000";
                  WHEN 4 => AD7714in_DATA<="00010000";
                  WHEN 5 => AD7714in_DATA<="00100000";
                  WHEN 6 => AD7714in_DATA<="01011000";  --选择数据寄存器
                  WHEN OTHERS => AD7714in_DATA<="01011000";
                  END CASE;
                     IF i<7 THEN                     
                   AD7714sclk<='0';
                   AD7714din<=AD7714in_DATA(i); --把数据写入AD7714
                   i:=i+1;
                  
                 ELSE i:=0;
                END IF;
                 AD7714sclk<='1';
     END LOOP;
好像执行不了,达不到效果

使用特权

评论回复
33
anqi0126|  楼主 | 2010-11-20 08:35 | 只看该作者
我用for loop语句赋值是连续送值,只有最后一个值能送进去,其他的都被替换掉了啊。你说的是怎么付呢?

使用特权

评论回复
34
SuperX-man| | 2010-11-20 12:40 | 只看该作者
小版我简单的写了一个代码,你当作参考把.
entity for_loop is
port(
     clk : in std_logic;
   out1: out std_logic_vector(0 to 3)
   );
end for_loop;
architecture Behavioral of for_loop is
signal i :integer range 0 to 3;
signal initial: std_logic:='0';
signal o1:std_logic_vector(0 to 3);
begin
out1<=o1;

process(clk)
begin

if clk='1' and clk'event then
   if initial='0' then                --初始化
    for n in 0 to 4 loop      
          i<=i+1;
          case i is
               when 0 => o1<="0001";
               when 1 => o1<="0010";
               when 2 => o1<="0100";
               when 3 => o1<="1000";initial<='1';
     when others =>null;
          end case;
        end loop;                    --初始化完成
else
    --从这里开始写时序代码了--
  o1<="1111";
  end if;
end if;
end process;
end Behavioral;

这是仿真后的时序图.

使用特权

评论回复
35
anqi0126|  楼主 | 2010-11-20 14:48 | 只看该作者
我的输出是串行的,你定义的是并行的输出,我就是到把并行数据串行输出时出错了。我现在的程序编译过去了,但仿真得到的数不对

使用特权

评论回复
36
anqi0126|  楼主 | 2010-11-20 21:56 | 只看该作者
IF(clk'EVENT and clk='1')THEN
              if initial='0' then
                loop1:for j in 0 to 7 loop
                  CASE n IS
                  WHEN 0 => AD7714in_DATA<="00100000";              
                  WHEN 1 => AD7714in_DATA<="01010001";              
                  WHEN 2 => AD7714in_DATA<="00110000";
                  WHEN 3 => AD7714in_DATA<="10000000";
                  WHEN 4 => AD7714in_DATA<="00010000";
                  WHEN 5 => AD7714in_DATA<="00100000";
                  WHEN 6 => AD7714in_DATA<="01011000";  --选择数据寄存器
                  WHEN OTHERS => AD7714in_DATA<="01011000";
                  END CASE;
                  n:=n+1;
                 loop2:for a in 0 to 7 loop
                  IF i<7 THEN
                  AD7714sclk<='0';
                   AD7714din<=AD7714in_DATA(i);       --把数据写入AD7714
                   i:=i+1;
                  END IF;
                   AD7714sclk<='1';
                 END LOOP loop2;
               END LOOP loop1;
              initial<='1';
                 ELSE .........

我是这么照你的程序改的,可是说给  AD7714sclk和AD7714din都付了多个值,只有最后一个能被执行。

使用特权

评论回复
37
SuperX-man| | 2010-11-21 01:49 | 只看该作者
你还是没有理解什么是硬件描述语.,打个比方,就类似数电,是由实际电路搭起来的,所以必须考虑时序.
for....loop是一个不需要时钟的并行输出语句.你估计和C的for什么的搞混了.
重新给你个参考程序吧,这个能达到串转并的效果.建议你拷贝了仿真看一下,然后把代码看懂了,再动手写你自己的.
entity for_loop is
port(
     clk : in std_logic;
          serial: out std_logic;
          out1: out std_logic_vector(0 to 3)
          );
end for_loop;

architecture Behavioral of for_loop is
signal i :integer range 0 to 4:=0;
signal n :integer range 0 to 3:=0;
signal initial: std_logic:='0';
signal o1:std_logic_vector(0 to 3):="0001";

begin
out1<=o1;

initial_case :process(i) is   --初始化配置
begin
         case i is
    when 0 => o1<="0001";
    when 1 => o1<="0010";
    when 2 => o1<="0100";
    when 3 => o1<="1000";
         when 4 => initial<='1';
         when others =>null;
    end case;
end process initial_case;
         
main:process(clk)
begin
if clk='1' and clk'event then
   if initial='0' then          --初始化,并转串输出
                   serial<=o1(n);
                        if n=3 then
                        n<=0;
                        i<=i+1;
                        else
                        n<=n+1;
                        end if;
      end if;                   --初始化完成
        else
           --从这里开始写控制代码了--

               
end if;
end process main;

end Behavioral;

使用特权

评论回复
38
anqi0126|  楼主 | 2010-11-22 09:10 | 只看该作者
你的程序我编译了一下,出现else clause following a clock edge must hold the state of signal "serial"
的错误
但我没看出问题啊

使用特权

评论回复
39
SuperX-man| | 2010-11-22 10:52 | 只看该作者
小版我没有用过你的软件,从你提供的信息来看,可能意思是需要在ELSE下面写点东西,你就写serial<='1'试试看
我本来空着,就是让你自己写点什么的...

使用特权

评论回复
40
anqi0126|  楼主 | 2010-11-22 12:34 | 只看该作者
你有个地方end IF放错了,我改了就好了,仿真结果   [img][/img]

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则