|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
我編些得程序,請(qǐng)大家看看問題出在哪了? |
| 作者:zhx0919 欄目:嵌入式系統(tǒng) |
端口說明:d是并行輸入的數(shù)據(jù),要把它轉(zhuǎn)成串行輸出,cs_read是spi口的一個(gè)片選信號(hào),clk是spi的時(shí)鐘,當(dāng)cs_write有效(d的值為一計(jì)數(shù)器的輸出,當(dāng)cs_write高時(shí)計(jì)數(shù),此時(shí)d的值在不停的變化,當(dāng)cs_write為低時(shí)停止計(jì)數(shù))時(shí)把數(shù)據(jù)d存入寄存器,以便后面用來串行輸出,cs_state(也是spi口的一片選)是狀態(tài)判斷,q是串行數(shù)據(jù)輸出; 程序要實(shí)現(xiàn)的功能:其實(shí)時(shí)個(gè)并轉(zhuǎn)串的功能,當(dāng)cs_state有效時(shí),q輸出一固定值(可任意定義,如:當(dāng)計(jì)數(shù)器正在計(jì)數(shù)時(shí)輸出0xaaaa,當(dāng)計(jì)數(shù)完成時(shí)輸出0x5555),當(dāng)cs_read有效時(shí)把計(jì)數(shù)的值以串行的方式輸出; 和arm的程序連調(diào)調(diào)后的現(xiàn)象(單步執(zhí)行):當(dāng)不判斷cs_state時(shí),即不用判斷計(jì)數(shù)器是否計(jì)數(shù)完成(因?yàn)橛?jì)數(shù)器計(jì)數(shù)的時(shí)間非常短,單步執(zhí)行能夠保證其計(jì)數(shù)完成),串行輸出的數(shù)據(jù)是正確的,當(dāng)加上狀態(tài)判斷之后就不行了,請(qǐng)各位高手給看看問題出在哪了,在下在此謝謝各位高手了! 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 --存放計(jì)數(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 --正在計(jì)數(shù),此時(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ā)布:
知道了,上面的程序是完全正確的 知道了,上面的程序是完全正確的,大家以后可以參考的,但是我剛開始不是這樣編的,不成功,請(qǐng)大家?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èi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 udpf.com.cn 浙ICP證030469號(hào) |