|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
我編些得程序,請大家看看問題出在哪了? |
| 作者:zhx0919 欄目:嵌入式系統(tǒng) |
端口說明:d是并行輸入的數(shù)據(jù),要把它轉(zhuǎn)成串行輸出,cs_read是spi口的一個片選信號,clk是spi的時鐘,當cs_write有效(d的值為一計數(shù)器的輸出,當cs_write高時計數(shù),此時d的值在不停的變化,當cs_write為低時停止計數(shù))時把數(shù)據(jù)d存入寄存器,以便后面用來串行輸出,cs_state(也是spi口的一片選)是狀態(tài)判斷,q是串行數(shù)據(jù)輸出; 程序要實現(xiàn)的功能:其實時個并轉(zhuǎn)串的功能,當cs_state有效時,q輸出一固定值(可任意定義,如:當計數(shù)器正在計數(shù)時輸出0xaaaa,當計數(shù)完成時輸出0x5555),當cs_read有效時把計數(shù)的值以串行的方式輸出; 和arm的程序連調(diào)調(diào)后的現(xiàn)象(單步執(zhí)行):當不判斷cs_state時,即不用判斷計數(shù)器是否計數(shù)完成(因為計數(shù)器計數(shù)的時間非常短,單步執(zhí)行能夠保證其計數(shù)完成),串行輸出的數(shù)據(jù)是正確的,當加上狀態(tài)判斷之后就不行了,請各位高手給看看問題出在哪了,在下在此謝謝各位高手了! 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 --存放計數(shù)值的寄存器; signal reg16:std_logic_vector(15 downto 0); --返回的狀態(tài),其數(shù)值可以自定義; signal reg_state:std_logic_vector(15 downto 0); BEGIN p3:PROCESS(clk,cs_read,cs_write,cs1_state) begin --正在計數(shù),此時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 --采集完成,可以發(fā)讀數(shù)據(jù)的指令了; 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; |
| 2樓: | >>參與討論 |
| 作者: alin_99 于 2007/3/1 14:36:00 發(fā)布:
kkk 具體原因 不知道 |
|
| 3樓: | >>參與討論 |
| 作者: zhx0919 于 2007/3/1 19:14:00 發(fā)布:
知道了,上面的程序是完全正確的 知道了,上面的程序是完全正確的,大家以后可以參考的,但是我剛開始不是這樣編的,不成功,請大家?guī)涂纯丛? 原來的程序中 if(cs1_state='0') then --cs1 --采集完成,可以發(fā)讀數(shù)據(jù)的指令了; 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 --采集完成,可以發(fā)讀數(shù)據(jù)的指令了; q<='0'; elsif(cs_read='0') then --cs6 我以為spck就決定了我串行輸出的數(shù)據(jù)是16的,結(jié)果不是這樣的,就改成第一種了,成功了!!! |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |