打印

我编些得程序,请大家看看问题出在哪了?

[复制链接]
2138|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhx0919|  楼主 | 2007-2-28 19:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
端口说明:d是并行输入的数据,要把它转成串行输出,cs_read是spi口的一个片选信号,clk是spi的时钟,当cs_write有效(d的值为一计数器的输出,当cs_write高时计数,此时d的值在不停的变化,当cs_write为低时停止计数)时把数据d存入寄存器,以便后面用来串行输出,cs_state(也是spi口的一片选)是状态判断,q是串行数据输出;


程序要实现的功能:其实时个并转串的功能,当cs_state有效时,q输出一固定值(可任意定义,如:当计数器正在计数时输出0xaaaa,当计数完成时输出0x5555),当cs_read有效时把计数的值以串行的方式输出;

和arm的程序连调调后的现象(单步执行):当不判断cs_state时,即不用判断计数器是否计数完成(因为计数器计数的时间非常短,单步执行能够保证其计数完成),串行输出的数据是正确的,当加上状态判断之后就不行了,请各位高手给看看问题出在哪了,在下在此谢谢各位高手了!

LIBRARY ieee;
USE ieee.std_logic_1164.all;


--  Entity Declaration

ENTITY series IS
    -- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!
    PORT
    (
        
        d:in std_logic_vector(15 downto 0);
        cs_read : IN STD_LOGIC;
        clk : IN STD_LOGIC;
        cs_write : IN STD_LOGIC;
        cs1_state:in std_logic;
        q : OUT STD_LOGIC
        
    );
    -- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!
    
END series;


--  Architecture Body

ARCHITECTURE series_architecture OF series IS
--存放计数值的寄存器;
signal reg16:std_logic_vector(15 downto 0);
--返回的状态,其数值可以自定义;
signal reg_state:std_logic_vector(15 downto 0);



BEGIN     
p3:process(clk,cs_read,cs_write,cs1_state)
     begin
       --正在计数,此时d的值在不停变化;
       if(cs_write='1') then
--把d的值存入reg16;
           reg16<=d;  
           reg_state<="1010101010101010";
             
           q<='Z';
       elsif(clk'event and clk='0')  then
          if(cs1_state='0')  then  --cs1  --采集完成,可以发读数据的指令了; 
            q<=reg_state(15);
            reg_state(15 downto 1)<=reg_state(14 downto 0);
               
          elsif(cs_read='0') then  --cs6
           q<=reg16(15);
           reg16(15)<=reg16(14);
           reg16(14)<=reg16(13);
           reg16(13)<=reg16(12);
           reg16(12)<=reg16(11);
           reg16(11)<=reg16(10);
           reg16(10)<=reg16(9);
           reg16(9)<=reg16(8);
           reg16(8)<=reg16(7);
           reg16(7)<=reg16(6);
           reg16(6)<=reg16(5);
           reg16(5)<=reg16(4);
           reg16(4)<=reg16(3);
           reg16(3)<=reg16(2);
           reg16(2)<=reg16(1);
           reg16(1)<=reg16(0);
           --reg16(0)<='1';
             --q<=reg16(15);
         else
          q<='Z';
    
     end if;
    end if;

 end process p3;

          
END series_architecture;

相关帖子

沙发
alin_99| | 2007-3-1 14:36 | 只看该作者

kkk

具体原因 不知道

使用特权

评论回复
板凳
zhx0919|  楼主 | 2007-3-1 19:14 | 只看该作者

知道了,上面的程序是完全正确的

知道了,上面的程序是完全正确的,大家以后可以参考的,但是我刚开始不是这样编的,不成功,请大家帮看看原因,
原来的程序中
 if(cs1_state='0')  then  --cs1  --采集完成,可以发读数据的指令了; 
            q<=reg_state(15);
            reg_state(15 downto 1)<=reg_state(14 downto 0);
               
          elsif(cs_read='0') then  --cs6
不是这样写的,是这样的:
 if(cs1_state='0')  then  --cs1  --采集完成,可以发读数据的指令了; 
            q<='0';
            
               
          elsif(cs_read='0') then  --cs6


我以为spck就决定了我串行输出的数据是16的,结果不是这样的,就改成第一种了,成功了!!!
           
           

使用特权

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

本版积分规则

21

主题

75

帖子

1

粉丝