|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | 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 |
求教用VHDL產(chǎn)生單穩(wěn)態(tài)一定寬度脈沖 |
| 作者:pallen 欄目:EDA技術(shù) |
假定輸入信號(hào)方波脈沖CAA,且頻率變化,要求在輸入脈沖的上升沿時(shí)輸出一個(gè)一定寬度的脈沖,當(dāng)然這個(gè)脈沖的寬度肯定時(shí)小于A的最小周期的1/2的(即保證輸入脈沖頻率等于輸入脈沖頻率)。 請(qǐng)問(wèn)各位大俠,我如何設(shè)定輸出脈沖的寬度?可以用延時(shí)實(shí)現(xiàn)嗎? 我想的辦法是,做一個(gè)計(jì)數(shù)器來(lái)計(jì)時(shí)鐘的時(shí)序,以記錄時(shí)間; 但必須在輸入脈沖A的上升沿時(shí)輸入脈沖并保持為1,并同時(shí)讓計(jì)數(shù)器開(kāi)始計(jì)數(shù)器開(kāi)始計(jì)數(shù),計(jì)到一定數(shù)值時(shí)(即脈沖寬度),使輸出脈沖輸出為0。這里出現(xiàn)了一個(gè)問(wèn)題:計(jì)數(shù)器器是在脈沖A的上升沿開(kāi)始計(jì)數(shù)的,而計(jì)數(shù)器本身用的時(shí)序是CLK0,那么如何用VHDL描述在CAA上升沿讓計(jì)數(shù)器開(kāi)始計(jì)CLK0呢? 我寫(xiě)的程序如下: 其中CAA,相當(dāng)于輸入的脈沖 LIBRARY ieee; USE ieee.STD_LOGIC_1164.ALL; USE ieee.std_logic_ARITH.all; USE ieee.std_logic_UNSIGNED.all; LIBRARY ALTERA; USE ALTERA.maxplus2.all; ENTITY cpld_my IS PORT( CAA,CLK0 : IN STD_LOGIC; CRST: IN STD_LOGIC; CBB : OUT STD_LOGIC); END cpld_my; ARCHITECTURE build OF cpld_my IS SIGNAL COUNTER1 : STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN COUNT1:PROCESS(CAA,ZERO,CLK0) BEGIN IF( CRST = '1') THEN COUNTER1 <="00000000"; ELSIF(RISING_EDGE(CAA)) THEN IF(RISING_EDGE(CLK0)) THEN IF(COUNTER1 = "01101001") THEN COUNTER1 <= "00000000"; CBB <= '0'; ELSE COUNTER1 <= COUNTER1 + 1; CBB <= '1'; END IF; END IF; END IF; END PROCESS; END build; 請(qǐng)各位大俠指教!! |
| 2樓: | >>參與討論 |
| 作者: picklas 于 2005/1/25 22:33:00 發(fā)布:
re ELSIF(RISING_EDGE(CAA)) THEN IF(RISING_EDGE(CLK0)) THEN 這么寫(xiě)肯定錯(cuò)誤! 不能同時(shí)用兩個(gè)上升沿 |
|
| 3樓: | >>參與討論 |
| 作者: pallen 于 2005/1/26 12:10:00 發(fā)布:
i know,but^ 我知道這么寫(xiě)是錯(cuò)的,問(wèn)題是我不知道怎么寫(xiě)才行! 這也是我發(fā)這篇貼的原因啊! 希望哪位大俠能夠指點(diǎn)指點(diǎn)!! |
|
| 4樓: | >>參與討論 |
| 作者: diploma 于 2005/1/26 12:37:00 發(fā)布:
寫(xiě)了一個(gè),竟供參考! LIBRARY ieee; USE ieee.STD_LOGIC_1164.ALL; USE ieee.std_logic_ARITH.all; USE ieee.std_logic_UNSIGNED.all; LIBRARY ALTERA; USE ALTERA.maxplus2.all; ENTITY cpld_my IS PORT( CAA,CLK0 : IN STD_LOGIC; CRST: IN STD_LOGIC; CBB : OUT STD_LOGIC); END cpld_my; ARCHITECTURE build OF cpld_my IS type state is (s0,s1); signal st :state; SIGNAL COUNTER1 : STD_LOGIC_VECTOR(7 DOWNTO 0); signal caa_in : std_logic; BEGIN COUNT1:PROCESS(crst,CLK0) BEGIN IF( CRST = '1') THEN COUNTER1 <="00000000"; st <= s0; elsIF(RISING_EDGE(CLK0)) THEN caa_in <= caa; case st is when s0 => if caa_in /= caa and caa = '1' then st <= s1; end if; when s1 => IF(COUNTER1 = "01101001") THEN COUNTER1 <= "00000000"; CBB <= '0'; st <= s0; ELSE COUNTER1 <= COUNTER1 + 1; CBB <= '1'; END IF; end case; END IF; END PROCESS; END build; 沒(méi)有綜合,不知道語(yǔ)法上面會(huì)不會(huì)有問(wèn)題。 在這里要說(shuō)明一下,clk0的頻率比輸入的caa頻率越大越好,也就是采集到caa上升邊沿后輸出脈寬的延遲將越! |
|
| 5樓: | >>參與討論 |
| 作者: picklas 于 2005/1/26 13:21:00 發(fā)布:
re 實(shí)現(xiàn)的辦法有很多,樓上的就是一種辦法,建議你把信號(hào)在拍一下,所存兩級(jí)防止亞穩(wěn)態(tài)和毛刺。工作中越高對(duì)你的計(jì)數(shù)器越有利。 |
|
| 6樓: | >>參與討論 |
| 作者: diploma 于 2005/1/26 15:44:00 發(fā)布:
rrr 樓上的說(shuō)的很對(duì),caa信號(hào)進(jìn)來(lái)最好經(jīng)過(guò)一個(gè)高速時(shí)鐘消抖一下,那樣可以消除毛刺。再者,if caa_in /= caa and caa = '1' then 改成 if caa_in /= caa and caa_in = '0' then 我覺(jué)得會(huì)好一點(diǎn),其實(shí)通過(guò)了消抖后再來(lái)處理這個(gè)消抖的信號(hào),用那個(gè)都無(wú)所謂了。 |
|
| 7樓: | >>參與討論 |
| 作者: pallen 于 2005/1/27 8:53:00 發(fā)布:
thanks 非常感謝diploma師兄及picklas師兄的指點(diǎn)! 再請(qǐng)教如何經(jīng)過(guò)一個(gè)高速時(shí)鐘消抖?是用D觸發(fā)器嗎?再次感謝。 |
|
| 8樓: | >>參與討論 |
| 作者: picklas 于 2005/1/28 22:54:00 發(fā)布:
re 消除抖動(dòng)主要是采用同步電路的設(shè)計(jì)思路,簡(jiǎn)單的辦法就是通過(guò)d觸發(fā)器,采用兩級(jí)所存是為了,防止亞穩(wěn)態(tài)的出現(xiàn),將前后部分隔離。 |
|
| 9樓: | >>參與討論 |
| 作者: pallen 于 2005/1/31 12:38:00 發(fā)布:
thanks 非常感謝picklas師兄的指點(diǎn),小弟在此多謝了 |
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |