端口说明: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;
|