'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
FPGA/CPLD᭄ᄫ⬉䏃䆒䅵㒣偠ߚѿ
ᨬ㽕˖᭄ᄫ⬉䏃ⱘ䆒䅵Ёˈᯊᑣ䆒䅵ᰃϔϾ㋏㒳ᗻ㛑ⱘЏ㽕ᷛᖫˈ催ሖ䆒䅵ᮍ⊩Ёˈᇍᯊᑣࠊⱘ
ᢑ䈵ᑺгⳌᑨᦤ催ˈℸ䆒䅵Ё䕗䲒ᡞᦵˈԚ⧚㾷 RTL⬉䏃ᯊᑣൟⱘ⸔Ϟˈ䞛⫼ড়⧚ⱘ䆒䅵ᮍ⊩
䆒䅵ᴖ᭄ᄫ㋏㒳ᰃ㸠П᳝ᬜⱘˈ䗮䖛䆌䆒䅵ᅲ՟䆕ᯢ䞛⫼䖭⾡ᮍᓣৃҹՓ⬉䏃ⱘৢӓⳳ䗮䖛⥛
ᦤ催ˈᑊϨ㋏㒳ⱘᎹ乥⥛ৃҹ䖒ࠄϔϾ䕗催∈ᑇDŽ
݇䬂䆡˖FPGA ᭄ᄫ⬉䏃 ᯊᑣ ᯊᓊ䏃ᕘ ᓎゟᯊ䯈 ֱᣕᯊ䯈
1 ᭄ᄫ⬉䏃䆒䅵ЁⱘϾᴀὖᗉ˖
1.1 ᓎゟᯊ䯈ֱᣕᯊ䯈˖
ᓎゟᯊ䯈˄setup time˅ᰃᣛ㾺থ఼ⱘᯊ䩳ֵোϞछ⊓ࠄᴹҹࠡˈ᭄〇ᅮϡবⱘᯊ䯈ˈབᵰᓎゟᯊ
䯈ϡˈ᭄ᇚϡ㛑䖭Ͼᯊ䩳Ϟछ⊓㹿ᠧܹ㾺থ఼˗ֱᣕᯊ䯈˄hold time˅ᰃᣛ㾺থ఼ⱘᯊ䩳ֵোϞ
छ⊓ࠄᴹҹৢˈ᭄〇ᅮϡবⱘᯊ䯈ˈ བᵰֱᣕᯊ䯈ϡˈ᭄ৠḋϡ㛑㹿ᠧܹ㾺থ఼DŽ བ 1 DŽ ᭄
〇ᅮӴ䕧ᖙ乏⒵䎇ᓎゟֱᣕᯊ䯈ⱘ㽕∖ˈᔧ✊ϔѯᚙމϟˈᓎゟᯊ䯈ֱᣕᯊ䯈ⱘؐৃҹЎ䳊DŽ
PLD/FPGAᓔথ䕃ӊৃҹ㞾ࡼ䅵ㅫϸϾⳌ݇䕧ܹⱘᓎゟֱᣕᯊ䯈˄བ 2˅
1 ᓎゟᯊ䯈ֱᣕᯊ䯈݇㋏
⊼˖
㗗㰥ᓎゟֱᣕᯊ䯈ᯊˈᑨ䆹㗗㰥ᯊ䩳ᷥৢأ᭰ⱘᚙމˈ㗗㰥ᓎゟᯊ䯈ᯊᑨ䆹㗗㰥ᯊ䩳ᷥ
ࠡأ᭰ⱘᚙމDŽ䖯㸠ৢӓⳳᯊˈ᳔ᓊ䖳⫼ᴹẔᶹᓎゟᯊ䯈ˈ᳔ᇣᓊᯊ⫼ᴹẔᶹֱᣕᯊ䯈DŽ
ᓎゟᯊ䯈ⱘ㑺ᴳᯊ䩳਼ᳳ᳝݇ˈᔧ㋏㒳催乥ᯊ䩳ϟ᮴⊩Ꮉᯊˈ䰡Ԣᯊ䩳乥⥛ህৃҹՓ㋏㒳
ᅠ៤ᎹDŽֱᣕᯊ䯈ᰃϔϾᯊ䩳਼ᳳ᮴݇ⱘখ᭄ˈབᵰ䆒䅵ϡড়⧚ˈՓᕫᏗሔᏗ㒓Ꮉ᮴⊩Ꮧ
ߎ催䋼䞣ⱘᯊ䩳ᷥˈ䙷М᮴䆎བԩ䇗ᭈᯊ䩳乥⥛г᮴⊩䖒ࠄ㽕∖ˈা᳝ᇍ᠔䆒䅵㋏㒳䕗ᬍࡼ
ᠡ᳝ৃ㛑ℷᐌᎹˈᇐ㟈䆒䅵ᬜ⥛䰡ԢDŽℸড়⧚ⱘ䆒䅵㋏㒳ⱘᯊᑣᰃᦤ催䆒䅵䋼䞣ⱘ݇䬂DŽ
ৃ㓪఼ӊЁˈᯊ䩳ᷥⱘأ᭰Тৃҹϡ㗗㰥ˈℸֱᣕᯊ䯈䗮ᐌ䛑ᰃ⒵䎇ⱘDŽ1.2 FPGAЁⱘ
ゲѝݦ䰽⦄䈵
ֵো FPGA఼ӊݙ䚼䗮䖛䖲㒓䘏䕥ऩܗᯊˈ䛑᳝ϔᅮⱘᓊᯊDŽᓊᯊⱘᇣϢ䖲㒓ⱘ䭓ⷁ䘏䕥ऩ
ܗⱘ᭄Ⳃ᳝݇ˈৠᯊ䖬ফ఼ӊⱘࠊ䗴Ꮉ㡎ǃᎹ⬉य़ǃ⏽ᑺㄝᴵӊⱘᕅડDŽֵোⱘ催Ԣ⬉ᑇ䕀ᤶг䳔㽕ϔ
ᅮⱘ䖛⏵ᯊ䯈DŽ⬅Ѣᄬ䖭ϸᮍ䴶㋴ˈ䏃ֵোⱘ⬉ᑇؐথ⫳ব࣪ᯊˈֵোব࣪ⱘⶀ䯈ˈ㒘ড়䘏䕥ⱘ
䕧ߎ᳝ܜৢ乎ᑣˈᑊϡᰃৠᯊব࣪,ᕔᕔӮߎ⦄ϔѯϡℷ⹂ⱘᇪዄֵোˈ䖭ѯᇪዄֵো⿄Ў"↯ࠎ"DŽབᵰϔ
Ͼ㒘ড়䘏䕥⬉䏃Ё᳝"↯ࠎ"ߎ⦄ˈህ䇈ᯢ䆹⬉䏃ᄬ"ݦ䰽"DŽ˄Ϣߚゟܗӊϡৠˈ⬅Ѣ PLDݙ䚼ϡᄬᆘ
⫳⬉ᆍ⬉ᛳˈ䖭ѯ↯ࠎᇚ㹿ᅠᭈⱘֱ⬭ᑊϟϔ㑻Ӵ䗦ˈℸ↯ࠎ⦄䈵 PLDǃFPGA䆒䅵ЁᇸЎさߎ˅
2ᰃϔϾ䘏䕥ݦ䰽ⱘ՟ᄤ Ңˈ 3ⱘӓⳳ⊶ᔶৃҹⳟߎ "ˈAǃBǃCǃD"ಯϾ䕧ֵܹো㒣䖛Ꮧ㒓ᓊᯊҹৢˈ
催Ԣ⬉ᑇবᤶϡᰃৠᯊথ⫳ⱘˈ䖭ᇐ㟈䕧ߎֵো"OUT"ߎ⦄њ↯ࠎDŽ˄៥Ӏ᮴⊩ֱ䆕᠔᳝䖲㒓ⱘ䭓ᑺϔ㟈ˈ
1
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
᠔ҹेՓಯϾ䕧ֵܹো䕧ܹッৠᯊব࣪ˈԚ㒣䖛 PLDݙ䚼ⱘ䍄㒓ˈࠄ䖒䮼ⱘᯊ䯈гᰃϡϔḋⱘˈ↯ࠎ
ᖙ✊ѻ⫳˅DŽৃҹὖᣀⱘ䆆ˈা㽕䕧ֵܹোৠᯊব࣪ˈ˄㒣䖛ݙ䚼䍄㒓˅㒘ড়䘏䕥ᖙᇚѻ⫳↯ࠎDŽ ᇚᅗӀ
ⱘ䕧ߎⳈ䖲ࠄᯊ䩳䕧ܹッǃ⏙䳊㕂ԡッষⱘ䆒䅵ᮍ⊩ᰃ䫭䇃ⱘˈ䖭ৃ㛑Ӯᇐ㟈Ϲ䞡ⱘৢᵰDŽ ᠔ҹ៥
Ӏᖙ乏Ẕᶹ䆒䅵Ё᠔᳝ᯊ䩳ǃ⏙䳊㕂ԡㄝᇍ↯ࠎᬣᛳⱘ䕧ܹッষˈ⹂ֱ䕧ܹϡӮ᳝ӏԩ↯ࠎ
2 ᄬ䘏䕥ݦ䰽ⱘ⬉䏃⼎՟
3 2᠔⼎⬉䏃ⱘӓⳳ⊶ᔶ
ݦ䰽ᕔᕔӮᕅડࠄ䘏䕥⬉䏃ⱘ〇ᅮᗻDŽᯊ䩳ッষǃ⏙䳊㕂ԡッষᇍ↯ࠎֵোकߚᬣᛳˈӏԩϔ⚍↯
ࠎ䛑ৃ㛑ӮՓ㋏㒳ߎ䫭ˈℸ߸ᮁ䘏䕥⬉䏃Ёᰃ৺ᄬݦ䰽ҹঞབԩ䙓ܡݦ䰽ᰃ䆒䅵Ҏਬᖙ乏㽕㗗㰥ⱘ䯂
乬DŽ
བԩ໘⧚↯ࠎ
៥Ӏৃҹ䗮䖛ᬍব䆒䅵ˈ⸈ണ↯ࠎѻ⫳ⱘᴵӊˈᴹޣᇥ↯ࠎⱘথ⫳DŽ՟བˈ᭄ᄫ⬉䏃䆒䅵Ёˈᐌᐌ
䞛⫼Ḑ䳋ⷕ䅵఼᭄পҷ᱂䗮ⱘѠ䖯ࠊ䅵఼᭄ˈ䖭ᰃЎḐ䳋ⷕ䅵఼᭄ⱘ䕧ߎ↣া᳝ϔԡ䏇বˈ⍜䰸њゲ
ѝݦ䰽ⱘথ⫳ᴵӊˈ䙓ܡњ↯ࠎⱘѻ⫳DŽ
↯ࠎᑊϡᰃᇍ᠔᳝ⱘ䕧ܹ䛑᳝ॅᆇˈ՟བ D㾺থ఼ⱘ D䕧ܹッˈা㽕↯ࠎϡߎ⦄ᯊ䩳ⱘϞछ⊓ᑊϨ
⒵䎇᭄ⱘᓎゟֱᣕᯊ䯈 ህˈϡӮᇍ㋏㒳䗴៤ॅᆇ ៥ˈӀৃҹ䇈 D㾺থ఼ⱘ D䕧ܹッᇍ↯ࠎϡᬣᛳDŽḍ
䖭Ͼ⡍ᗻˈ៥Ӏᑨᔧ㋏㒳Ёሑৃ㛑䞛⫼ৠℹ⬉䏃ˈ䖭ᰃЎৠℹ⬉䏃ֵোⱘব࣪䛑থ⫳ᯊ䩳⊓ˈা
㽕↯ࠎϡߎ⦄ᯊ䩳ⱘ⊓ষᑊϨϡ⒵䎇᭄ⱘᓎゟֱᣕᯊ䯈 ህˈϡӮᇍ㋏㒳䗴៤ॅᆇDŽ˄⬅Ѣ↯ࠎᕜⷁˈ
Ў㒇⾦ˈᴀϞ䛑ϡৃ㛑⒵䎇᭄ⱘᓎゟֱᣕᯊ䯈˅
এ䰸↯ࠎⱘϔ⾡ᐌ㾕ⱘᮍ⊩ᰃ߽⫼ D㾺থ఼ⱘ D䕧ܹッᇍ↯ࠎֵোϡᬣᛳⱘ⡍⚍ ˈ䕧ߎֵোⱘֱᣕ
ᯊ䯈ݙˈ⫼㾺থ఼䇏প㒘ড়䘏䕥ⱘ䕧ߎֵোˈ䖭⾡ᮍ⊩㉏ԐѢᇚᓖℹ⬉䏃䕀࣪Ўৠℹ⬉䏃DŽ 4㒭ߎњ䖭
⾡ᮍ⊩ⱘ⼎㣗⬉䏃ˈ 5ᰃӓⳳ⊶ᔶDŽ
2
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
4 ⍜䰸↯ࠎֵোᮍ⊩ПѠ
5 4᠔⼎⬉䏃ⱘӓⳳ⊶ᔶ
བࠡ᠔䗄ˈӬ⾔ⱘ䆒䅵ᮍḜˈབ䞛⫼Ḑ䳋ⷕ䅵఼᭄ˈৠℹ⬉䏃ㄝˈৃҹޣᇥ↯ࠎˈԚᅗᑊϡ㛑ᅠ
ܼ⍜䰸↯ࠎDŽ ↯ࠎᑊϡᰃᇍ᠔᳝䕧ܹ䛑᳝ॅᆇˈ՟བ D 㾺থ఼ⱘ D 䕧ܹッˈা㽕↯ࠎϡߎ⦄ᯊ䩳ⱘϞ
छ⊓ᑊϨ⒵䎇᭄ⱘᓎゟֱᣕᯊ䯈ˈህϡӮᇍ㋏㒳䗴៤ॅᆇDŽℸ៥Ӏৃҹ䇈 D㾺থ఼ⱘ D䕧ܹッᇍ↯
ࠎϡᬣᛳDŽԚᇍѢ D㾺থ఼ⱘᯊ䩳ッˈ㕂ԡッˈ⏙䳊ッˈ߭䛑ᰃᇍ↯ࠎᬣᛳⱘ䕧ܹッˈӏԩϔ⚍↯ࠎህӮ
Փ㋏㒳ߎ䫭ˈԚা㽕䅸ⳳ໘⧚ˈ៥Ӏৃҹᡞॅᆇ䰡ࠄ᳔ԢⳈ㟇⍜䰸DŽϟ䴶៥Ӏህᇍ⾡ԧⱘֵো䖯㸠
䅼DŽ
1.3 ⏙䰸㕂ԡֵো
FPGA ⱘ䆒䅵Ёˈܼሔⱘ⏙䳊㕂ԡֵোᖙ乏㒣䖛ܼሔⱘ⏙䳊㕂ԡㅵ㛮䕧ܹˈЎҪӀгሲѢܼ
ሔⱘ䌘⑤ˈ݊ߎ㛑ˈ㗠Ϩ FPGA ݙ䚼ᰃⳈ䖲ࠄ᠔᳝ⱘ㾺থ఼ⱘ㕂ԡ⏙䳊ッⱘˈ䖭ḋⱘخ⊩
ӮՓ㢃⠛ⱘᎹৃ䴴ǃᗻ㛑〇ᅮˈ㗠Փ⫼᱂䗮ⱘ IO㛮߭ϡ㛑ֱ䆕䆹ᗻ㛑DŽ
FPGAⱘ䆒䅵Ёˈ䰸њҢ䚼ㅵ㛮ᓩܹⱘܼሔ⏙䰸㕂ԡֵো FPGAݙ䚼䘏䕥ⱘ໘⧚Ёг㒣ᐌ
䳔㽕ѻ⫳ϔѯݙ䚼ⱘ⏙䰸㕂ԡֵোDŽ⏙䰸㕂ԡֵো㽕∖䈵ᇍᕙᯊ䩳䙷ḋᇣᖗഄ㗗㰥ᅗӀˈЎ䖭ѯֵ
োᇍ↯ࠎгᰃ䴲ᐌᬣᛳⱘDŽ
ৠℹ⬉䏃䆒䅵Ёˈ᳝ᯊৃҹ⫼ৠℹ㕂ԡⱘࡲ⊩ᴹ᳓ҷᓖℹ⏙ 0DŽ⫼⹀ӊᦣ䗄䇁㿔ⱘ䆒䅵Ёৃҹ
⫼བϟⱘᮍᓣᴹᦣ䗄˖
ᓖℹ⏙ 0ⱘᦣ䗄ᮍ⊩˖
3
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
process(rst,clk)
begin
if rst=’1’ then
count<=(others=>’0’);
elsif clk’event and clk=’1’ then
count<=count+1;
end if;
end process;
ৠℹ⏙ 0ⱘᦣ䗄ᮍ⊩˖
process
begin
wait until clk’event and clk=’1’;
if rst=’1’ then
count<=(others=>’0’);
else
count<=count+1;
end if;
end process;
6 ᓖℹ⏙ 0ǃ㕂ԡ䘏䕥
7 ৠℹ⏙ 0ǃ㕂ԡ݇㋏
1.4 㾺থ఼䫕ᄬ఼˖
៥Ӏⶹ䘧ˈ㾺থ఼ᰃᯊ䩳ⱘ⊓䖯㸠᭄ⱘ䫕ᄬⱘˈ㗠䫕ᄬ఼ᰃ⫼⬉ᑇՓ㛑ᴹ䫕ᄬ᭄ⱘDŽ᠔ҹ㾺থ
఼ⱘ Q䕧ߎッ↣ϔϾᯊ䩳⊓䛑Ӯ㹿ᮄˈ㗠䫕ᄬ఼া㛑Փ㛑⬉ᑇ᳝ᬜ఼ӊᠡӮ㹿ᮄDŽ FPGA䆒䅵
Ёᓎ䆂བᵰϡᰃᖙ乏䙷Мᑨ䆹ሑ䞣Փ⫼㾺থ఼㗠ϡᰃ䫕ᄬ఼DŽ
䙷МՓ⫼⹀ӊᦣ䗄䇁㿔䖯㸠⬉䏃䆒䅵ⱘᯊབԩऎߚ㾺থ఼䫕ᄬ఼ⱘᦣ䗄ᮍ⊩ા˛݊ᅲ᳝ϡᇥҎ
Փ⫼ⱘ䖛Ёৃ㛑ᑊ≵᳝⡍ᛣऎߚ䖛ˈ᠔ҹгᗑ⬹њѠ㗙ᦣ䗄ᮍ⊩Ϟⱘऎ߿DŽϟ䴶ᰃ⫼ VHDL䇁㿔ᦣ
䗄ⱘ㾺থ఼䫕ᄬ఼ҹঞ㓐ড়఼ѻ⫳ⱘ⬉䏃䘏䕥DŽ
㾺থ఼ⱘ䇁㿔ᦣ䗄˖
4
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
process
begin
wait until clk’event and clk=’1’;
q<=d;
end process;
㾺থ఼
䫕ᄬ఼ⱘ䇁㿔ᦣ䗄˖
process(en,d)
begin
if en=’1’ then
q<=d;
end if;
end process;
䫕ᄬ఼
⬅Ϟ䗄ᇍ Latchⱘᦣ䗄ৃ㾕ˈ݊ᕜᆍᯧѢ䗝ᢽ఼ⱘᦣ䗄Ⳍ⏋⎚ˈ⫼ VHDL䇁㿔ᇍ䗝ᢽ఼ⱘᦣ䗄ᮍ⊩བ
ϟ˖
process(en,a,b)
begin
if en=’1’ then
q<=a;
else
q<=b;
end if;
end process;
5
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
2 FPGA/CPLDЁⱘϔѯ䆒䅵ᮍ⊩
2.1 FPGA䆒䅵Ёⱘৠℹ䆒䅵
ᓖℹ䆒䅵ϡᰃᘏ㛑⒵䎇(ᅗӀ᠔作䗕ⱘ㾺থ఼ⱘ)ᓎゟֱᣕᯊ䯈ⱘ㽕∖DŽℸˈᓖℹ䕧ܹᐌᐌӮᡞ䫭
䇃ⱘ᭄䫕ᄬࠄ㾺থ఼ˈ㗙Փ㾺থ఼䖯ܹѮ〇ᅮⱘ⢊ᗕˈ䆹⢊ᗕϟˈ㾺থ఼ⱘ䕧ߎϡ㛑䆚߿Ў l 0DŽ
བᵰ≵᳝ℷ⹂ഄ໘⧚ˈѮ〇ᗻӮᇐ㟈Ϲ䞡ⱘ㋏㒳ৃ䴴ᗻ䯂乬DŽ
ˈ FPGAⱘݙ䚼䌘⑤䞠᳔䞡㽕ⱘϔ䚼ߚህᰃ݊ᯊ䩳䌘⑤˄ ܼሔᯊ䩳㔥㒰˅ˈ ᅗϔ㠀ᰃ㒣䖛 FPGA
ⱘ⡍ᅮܼሔᯊ䩳ㅵ㛮䖯ܹ FPGAݙ䚼ˈৢ 㒣䖛ܼሔᯊ䩳 BUF䗖䜡ࠄܼሔᯊ䩳㔥㒰ⱘ 䖭ˈḋⱘᯊ䩳㔥㒰ৃҹ
ֱ䆕Ⳍৠⱘᯊ䩳⊓ࠄ䖒㢃⠛ݙ䚼↣ϔϾ㾺থ఼ⱘᓊ䖳ᯊ䯈Ꮒᓖᰃৃҹᗑ⬹ϡ䅵ⱘDŽ
FPGAЁϞ䗄ⱘܼሔᯊ䩳㔥㒰㹿⿄Ўᯊ䩳ᷥˈ᮴䆎ᰃϧϮⱘϝᮍᎹ䖬ᰃ఼ӊॖଚᦤկⱘᏗሔᏗ
㒓఼ᓊᯊখ᭄ᦤপǃߚᵤⱘᯊ䛑ᰃձܼሔᯊ䩳㔥㒰Ў䅵ㅫⱘޚⱘDŽབᵰϔϾ䆒䅵≵᳝Փ⫼ᯊ䩳
ᷥᦤկⱘᯊ䩳ˈ䙷М䖭ѯ䆒䅵Ꮉ᳝ⱘӮᢦ㒱خᓊᯊߚᵤǃ᳝ⱘᓊᯊ᭄ᇚᰃϡৃ䴴ⱘDŽ
៥Ӏ᮹ᐌⱘ䆒䅵ЁᕜᚙᔶϟӮ⫼ࠄ䳔㽕ߚ乥ⱘᚙᔶˈདҎⱘخ⊩ᰃܜ⫼催乥ᯊ䩳䅵᭄ˈ✊ৢՓ
⫼䅵఼᭄ⱘᶤϔԡ䕧ߎЎᎹᯊ䩳䖯㸠݊Ҫⱘ䘏䕥䆒䅵DŽ݊ᅲ䖭ḋⱘᮍ⊩ᰃϡ㾘㣗ⱘDŽ↨བϟ䴶ⱘᦣ䗄
ᮍ⊩˖
6
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
process
begin
wait until clk’event and clk=’1’;
if fck=’1’ then
count<=(others=>’0’);
else
count<=count+1;
end if;
end process;
process
begin
wait until count(2)’event and count(2)=’1’ ;
shift_reg<=data;
end process;
Ϟ䗄ⱘϔϾ process⬉䏃ᦣ䗄Ёˈ佪ܜ䅵఼᭄ⱘ䕧ߎ㒧ᵰ˄count(2)˅ⳌᇍѢܼሔᯊ䩳 clkᏆ㒣ѻ⫳
њϔᅮⱘᓊᯊ˄ᓊᯊⱘᇣপއѢ䅵఼᭄ⱘԡ᭄᠔䗝ᢽՓ⫼ⱘ఼ӊᎹ㡎˅˗㗠ѠϾ processЁՓ⫼䅵
఼᭄ⱘ bit2Ўᯊ䩳ˈ䙷М shift_reg ⳌᇍѢܼሔ clk ⱘᓊᯊᇚবᕫϡདࠊDŽᏗሔᏗ㒓᳔఼㒜㒭ߎⱘᯊ䯈
ߚᵤгᰃϡৃ䴴ⱘDŽ䖭ḋѻ⫳ⱘ㒧ᵰ⊶ᔶӓⳳབϟ᠔⼎˖
ℷ⹂ⱘخ⊩ৃҹᇚѠϾ process䖭ḋᴹݭDŽ
process
begin
wait until clk’event and clk=’1’ ;
if count(2 downto 0)=”000” then
shift_reg<=data;
end if;
end process;
㗙ߚ៤ϸℹᴹݭ˖
process(count)
begin
if count(2 downto 0)=”000” then
en<=’1’;
else
en<=’0’;
end if;
end process;
process
begin
wait until clk’event and clk=’1’ ;
if en=’1’ then
shift_reg<=data;
end if;
end process;
7
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
䖭ḋخᰃⳌᔧѢѻ⫳њϔϾ 8ߚ乥ⱘՓ㛑ֵোˈՓ㛑ֵো᳝ᬜⱘᯊᇚ data᭄䞛ḋࠄ shift_regᆘ
ᄬ఼ЁDŽԚℸ⾡ᚙᔶϟ shift_regⱘᓊᯊᰃⳌᇍѢܼሔᯊ䩳 clkⱘDŽϟ䴶ⱘᔶ㛑ⳟᕫ⏙ἮDŽ
ϞЁ⊶ᔶⱘሔ䚼ᬒ
2.2 FPGA䆒䅵Ёⱘᓊᯊ⬉䏃ⱘѻ⫳˖
᮹ᐌⱘ⬉䏃䆒䅵Ёˈ᳝ᯊ៥Ӏ䳔㽕ᇍֵো䖯㸠ᓊᯊ໘⧚ᴹ䗖ᑨᇍষⱘᯊᑣ݇㋏ˈ᳔㒣ᐌгᰃ
᳔ൟⱘᚙމᰃخ໘⧚ᴎⱘষ˗ЎϢ໘⧚ⱘষᯊᑣ݇㋏ᰃᓖℹⱘˈ㗠ϔϾ㾘㣗ⱘ FPGA 䆒䅵ᑨ䆹ᰃ
ሑৃ㛑䞛⫼ৠℹ䆒䅵DŽ䙷М䘛ࠄ䖭⾡ᚙމ䆹བԩ໘⧚ਸ਼˛
佪ܜ FPGAЁ㽕ѻ⫳ᓊᯊˈֵোᖙ乏㒣䖛ϔᅮⱘ⠽⧚䌘⑤DŽ⹀ӊᦣ䗄䇁㿔Ё᳝݇䬂䆡Wait for xx
nsˈ䳔㽕䇈ᯢⱘᰃ䆹䇁⊩ᰃҙҙ⫼Ѣӓⳳ㗠ϡ㛑⫼Ѣ㓐ড়ⱘˈৃ㓐ড়ⱘᓊᯊᮍ⊩᳝˖
! Փֵো㒣䖛䘏䕥䮼ᕫࠄᓊᯊ˄བ䴲䮼˅˗
! Փ⫼఼ӊᦤկⱘᓊᯊऩܗ˄བ Altera݀ৌⱘ LCELLˈXilinx݀ৌⱘ˅˗
⊼ᛣ˖ᔧՓ⫼㑻䴲䮼ⱘᯊ㓐ড়఼ᕔᕔӮᇚ݊Ӭ࣪ᥝˈЎ㓐ড়఼Ӯ䅸ЎϔϾֵো䴲ϸ䖬ᰃᅗ㞾ᏅDŽ
䳔㽕䇈ᯢⱘᰃ FPGA/CPLDݙ䚼㒧ᵘᰃϔ⾡ᷛޚⱘᅣऩܗˈϟᰃ Xilinx݀ৌⱘ Spartans II㋏఼߫ӊⱘ
ϔϾᷛޚᅣऩܗDŽ㱑✊ϡৠⱘॖᆊⱘ㢃⠛ᅣऩܗⱘ㒧ᵘϡৠˈԚὖᣀ㗠㿔䛑ᰃ⬅ϔѯ㒘ড়䘏䕥ࡴϔѠ
Ͼ㾺থ఼㗠ᵘ៤DŽᅲ䰙ᑨ⫼Ё ᔧˈϔϾഫݙⱘ㒘ড়䘏䕥㹿Փ⫼њ䙷МϢ݊ᇍᑨⱘ㾺থ఼гህϡ㛑⫼њ˗
ৠḋབᵰ㾺থ఼ऩܗ㹿⫼њ䙷М㒘ড়䘏䕥ऩܗгህᑳњDŽ䖭ህᰃ᳝ᯊ˄⡍߿ᰃՓ⫼ CPLD˅㱑✊䆒䅵Փ
⫼ⱘ䌘⑤ᑊϡԚᏗሔᏗ㒓఼ैਞ䌘⑤ϡՓ⫼ⱘॳDŽ
8
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
⦄䴶ⱘϔϾ՟ᄤᰃࠡϔ↉ᯊ䯈៥݀ৌ䘛ࠄⱘϔϾ䆒䅵DŽ䆒䅵Փ⫼ Altera݀ৌⱘ EPM7256ൟোⱘ CPLDDŽ
䆹䆒䅵ᅲ䰙Փ⫼ⱘᆘᄬ఼䌘⑤া᳝ 109ϾˈऴᭈϾ఼ӊ䌘⑤ⱘ 42%DŽৃᰃ䆹䆒䅵Փ⫼њབϟ᠔⼎ⱘᓊᯊ
ᮍ⊩ᴹخ໘⧚఼ষⱘᯊᑣ˖
䆹⬉䏃ⱘ䆒䅵ЁՓ⫼њ䞣ⱘ LCELLᴹѻ⫳ 100㒇⾦ⱘᓊᯊ 䖭ˈḋخⱘৢᵰᰃ㱑✊ᭈϾ⬉䏃ⱘ㾺থ఼
䌘⑤াՓ⫼њ 42%ˈৃᰃ⫼ MaxplusII 䖯㸠ᏗሔᏗ㒓Ꮖ㒣ϡ㛑䗮䖛њDŽ㗠Ϩ៥ᗔ⭥㒣䖛䖭М䘏䕥ⱘᓊ
ᯊৢ᠔ѻ⫳ⱘֵো䖬㛑ֱᣕॳᴹⱘᗻ㛑ϡ?
9
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
ᔧ䳔㽕ᇍᶤϔֵোϔ↉ᓊᯊᯊˈ߱ᄺ㗙ᕔᕔℸֵোৢІϔѯ䴲䮼݊ᅗ䮼⬉䏃ˈℸᮍ⊩ߚ⾏
⬉䏃Ёᰃৃ㸠ⱘDŽԚˢˬˣ˝Ёˈᓔথ䕃ӊ㓐ড়䆒䅵ᯊӮᇚ䖭ѯ䮼ᔧݫԭ䘏䕥এᥝˈ䖒ϡࠄᓊᯊⱘ
ᬜᵰDŽ⫼ALTERA݀ৌⱘMaxplusIIᓔথˢˬˣ˝ᯊˈৃ ҹ䗮䖛ᦦܹϔѯ˨˟ˡ˨˨ॳ䇁ᴹѻ⫳ϔᅮⱘᓊᯊˈ
Ԛ䖭ḋᔶ៤ⱘᓊᯊˢˬˣ˝㢃⠛Ёᑊϡ〇ᅮ Ӯˈ䱣⏽ᑺㄝ䚼⦃๗ⱘᬍব㗠ᬍব ˈℸᑊϡᦤ䖭ḋخDŽ
ℸˈৃҹ⫼催乥ᯊ䩳ᴹ偅ࡼ⿏ԡᆘᄬ఼ˈᕙᓊᯊֵো᭄䕧ܹˈᣝ᠔䳔ᓊᯊℷ⹂䆒㕂⿏ԡᆘᄬ఼ⱘ㑻
᭄ˈ⿏ԡᆘᄬ఼ⱘ䕧ߎेЎᓊᯊৢⱘֵোDŽℸᮍ⊩ѻ⫳ⱘᓊᯊֵোϢॳֵো↨᳝䇃Ꮒˈ䇃Ꮒᇣ⬅催乥ᯊ
䩳ⱘ਼ᳳᴹއᅮDŽᇍѢ᭄ֵোⱘᓊᯊˈ䕧ߎッ⫼᭄ᯊ䩳ᇍᓊᯊৢֵো䞡ᮄ䞛ḋˈህৃҹ⍜䰸䇃ᏂDŽ
ᇍѢ䖭ḋⱘᓊᯊ៥ᓎ䆂ⱘᅲ⦄ᮍ⊩ᰃ䞛⫼ᯊ䩳䫕ᄬᴹѻ⫳ᓊᯊⱘᮍ⊩ˈ៥Ӏⶹ䘧ᔧϔϾֵো⫼ᯊ䩳
䫕ᄬϔˈᇚӮऴ⫼ϔϾ㾺থ఼䌘⑤ˈֵোӮৢ⿏ϔϾᯊ䩳਼ᳳ˗䆹ৠџⱘ䆒䅵䞠 CPLD㢃⠛ℷད䖲
᳝ 32MHzⱘᯊ䩳 䙷ˈМ↣⫼ᯊ䩳䫕ᄬϔ sspֵোህӮ⿏ 31ns 䖭ˈḋা䳔Փ⫼ 3Ͼ㾺থ఼䌘⑤ህৃ
ҹ䖒ࠄⳂⱘњDŽ⬉䏃ӓⳳ⊶ᔶབϟ᠔⼎˖ᔧ✊䖭ḋخᇍॳᴹֵো催Ԣ⬉ᑇⱘᆑᑺӮ᳝ᬍবˈԚা
㽕ᰃϢ݊ষⱘ㢃⠛ⱘᆍ䆌㣗ೈПݙህϡӮᕅડࠄࡳ㛑ⱘᅲ⦄DŽ
⫼Ѣᓊᯊⱘ⬉䏃
Ϟӓⳳ⊶ᔶ
2.3 བԩᦤ催㋏㒳ⱘ䖤㸠䗳ᑺ
ৠℹ⬉䏃ⱘ䗳ᑺᰃᣛৠℹᯊ䩳ⱘ䗳ᑺDŽৠℹᯊ䩳ᛜᖿˈ⬉䏃໘⧚᭄ⱘᯊ䯈䯈䱨䍞ⷁˈ⬉䏃ऩԡᯊ
䯈໘⧚ⱘ᭄䞣ህᛜ.
៥Ӏܜᴹⳟϔⳟৠℹ⬉䏃Ё᭄Ӵ䗦ⱘϔϾᴀൟˈབϟ˖
10
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
˄Tcoᰃ㾺থ఼ᯊ䩳ࠄ᭄䕧ߎⱘᓊᯊ˗Tdelayᰃ㒘ড়䘏䕥ⱘᓊᯊ˗Tsetupᰃ㾺থ఼ⱘᓎゟᯊ䯈˅
؛䆒᭄Ꮖ㒣㹿ᯊ䩳ⱘϞछ⊓ᠧܹ D㾺থ఼ˈ䙷М᭄ࠄ䖒ϔϾ㾺থ఼ⱘ Qッ䳔㽕 Tcoˈݡ㒣䖛㒘
ড়䘏䕥ⱘᓊᯊ Tdelayࠄ䖒ⱘѠϾ㾺থ఼ⱘ Dッˈ㽕ᛇᯊ䩳㛑ѠϾ㾺থ఼ݡ㹿〇ᅮⱘ䫕ܹ㾺থ఼ˈ
߭ᯊ䩳ⱘᓊ䖳ϡ㛑ᰮѢ Tco+Tdelay+Tsetupˈ˄ ៥Ӏৃҹಲ乒ϔϟࠡ䴶䆆䖛ⱘᓎゟֱᣕᯊ䯈ⱘὖᗉˈህৃ
ҹ⧚㾷ЎҔМ݀ᓣ᳔ৢ㽕ࡴϞϔϾ Tdelay˅ ⬅ҹϞߚᵤৃⶹ˖᳔ᇣᯊ䩳਼ᳳ˖T=Tco+Tdelay+Tsetup ᳔
ᖿᯊ䩳乥⥛ F= 1/T PLDᓔথ䕃ӊгℷᰃ䗮䖛䖭Ͼ݀ᓣᴹ䅵ㅫ㋏㒳䖤㸠䗳ᑺ Fmax
⊼˖䖭Ͼ䘏䕥Ё᳝Ͼখ᭄˖Tpd ,ेᯊ䩳ⱘᓊᯊখ᭄ˈ៥Ӏ߮ᠡخᯊ䯈ߚᵤⱘᯊˈ≵᳝ᦤ䖭Ͼ
খ᭄ˈ˄བᵰՓ⫼ PLD ⱘܼሔᯊ䩳ൟোˈTpd ৃҹЎ 0ˈབᵰᰃ᱂䗮ᯊ䩳ˈ߭ϡЎ 0˅DŽ᠔ҹབᵰ㗗㰥ࠄ
ᯊ䩳ⱘᓊᯊ ㊒ˈ⹂ⱘ݀ᓣᑨ䆹ᰃ T=Tco+Tdelay+Tsetup-TpdDŽᔧ✊ҹϞܼ䚼ߚᵤⱘ䛑ᰃ఼ӊݙ䚼ⱘ䖤㸠䗳ᑺˈ
བᵰ㗗㰥㢃⠛ I/Oㅵ㛮ᓊᯊᇍ㋏㒳䗳ᑺⱘᕅડˈ䙷М䖬䳔㽕ࡴϔѯׂℷDŽ
⬅Ѣ TcoǃTsetup ᰃ⬅ԧⱘ఼ӊᎹ㡎އᅮⱘˈ៥Ӏ䆒䅵⬉䏃ᯊাৃҹᬍব TdelayDŽ᠔ҹ㓽ⷁ㾺থ
఼䯈㒘ড়䘏䕥ⱘᓊᯊᰃᦤ催ৠℹ⬉䏃䗳ᑺⱘ݇䬂DŽ⬅Ѣϔ㠀ৠℹ⬉䏃䛑ϡℶϔ㑻䫕ᄬ˄བ 3˅ˈ㗠㽕Փ
⬉䏃〇ᅮᎹˈᯊ䩳਼ᳳᖙ乏⒵䎇᳔ᓊᯊ㽕∖ˈ㓽ⷁ᳔䭓ᓊᯊ䏃ᕘˈᠡৃᦤ催⬉䏃ⱘᎹ乥⥛DŽ
བ 2 ᠔⼎˖៥Ӏৃҹᇚ䕗ⱘ㒘ড়䘏䕥ߚ㾷Ў䕗ᇣⱘഫˈЁ䯈ᦦܹ㾺থ఼ˈ䖭ḋৃҹᦤ催⬉䏃ⱘ
Ꮉ乥⥛DŽ䖭гᰃ᠔䇧“⌕∈㒓”˄pipelining˅ᡔᴃⱘᴀॳ⧚DŽ
ᇍѢ 3 ⱘϞञ䚼ߚˈᅗᯊ䩳乥⥛ফࠊѢѠϾ䕗ⱘ㒘ড়䘏䕥ⱘᓊᯊˈ䗮䖛䗖ᔧⱘᮍ⊩ᑇഛߚ䜡㒘
ড়䘏䕥ˈৃҹ䙓ܡϸϾ㾺থ఼П䯈ߎ⦄䖛ⱘᓊᯊˈ⍜䰸䗳ᑺ⫊乜DŽ
11
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
FPGA/CPLDᓔথ䕃ӊЁг᳝ϔѯখ᭄䆒㕂ˈ䗮䖛ׂᬍ䖭ѯ䆒㕂ˈৃҹᦤ催㓪䆥/ᏗሔᏗ㒓ৢ㋏㒳䗳ᑺˈ
Ԛᰃḍ㒣偠䖭⾡䗳ᑺⱘᦤ催ᰃᕜ᳝䰤ⱘ ˈ؛བᣝ✻㽕∖៥Ӏ䳔㽕䆒䅵ϔϾৃҹᎹࠄ 50MHzⱘ㋏㒳 ᅲˈ
䰙ᏗሔᏗ㒓఼ਞߎᴹⱘ Fmax া᳝ 40MHzˈℸᯊབᵰ៥ӀՓ⫼ᏗሔᏗ㒓఼ⱘ䆒㕂䗝乍᳔ৃҹᦤ催ࠄ
45MHzˈ䖭䖬ᰃ䖤⇨↨䕗དⱘᚙމDŽ㗠ϨԴᖙ乏њ㾷䖭ѯ䗝乍ⱘНǃՓ⫼㚠᱃ㄝDŽ
݊ᅲϔϾ䆒䅵䞠ᕅડ䗳ᑺⱘ⫊乜㒣ᐌাӮ᳝ᴵˈ៥Ӏᇚᓊᯊ᳔ⱘ䏃ᕘ⿄݇䬂䏃ᕘDŽᔧ䆒䅵ⱘ
䖤㸠䗳ᑺϡヺড়㋏㒳䆒䅵㽕∖ⱘᯊ៥Ӏৃҹ佪ܜᡒࠄϡ㛑⒵䎇㽕∖ⱘ݇䬂䏃ᕘˈᣝ✻Ϟ䗄ⱘᮍ⊩ᇚ݇䬂
䏃ᕘϞⱘ㒘ড়䘏䕥ᢚߚ៤ϾЁ䯈⫼㾺থ఼䱨ᓔˈ䖭ḋᕜᆍᯧህৃҹҢḍᴀϞᦤछ㋏㒳ⱘ䖤㸠䗳ᑺњDŽ
᳝ⱘ䆒䅵䆒䅵ᓔྟህⶹ䘧䙷䚼ߚ⬉䏃Ӯѻ⫳↨䕗ⱘ㒘ড়䘏䕥ˈᇐ㟈䗳ᑺ⫊乜ⱘѻ⫳ˈ䙷Мህᑨ䆹
ᓔྟህᛇད㾷އࡲ⊩DŽ↨བ⦄䆒䅵䳔㽕ѻ⫳ϔϾ 32 ԡⱘࡴ⊩఼ˈᑊϨ㽕∖㛑Ꮉ 50MHzDŽḍ
㒣偠Ⳉ⫼ 32ԡࡴ⊩఼㚃ᅮᰃ䖒ϡࠄ 50MHzⱘ㽕∖ⱘˈ䖭ᯊ៥Ӏৃҹᇚ݊ߚ៤ 3Ͼ 12ԡ䅵఼᭄ᴹ᪡ˈ
ৢ䴶ⱘ䅵఼᭄া㽕ᇚࠡ䴶䅵఼᭄㒧ᵰⱘ催ԡ˄䖯ԡԡ˅ⳌࡴህৃҹњDŽ
ϟ䴶ᰃॳᴹᆑᏺܹ᳡ࡵ఼䆒䅵Ёⱘ⌕䞣㒳䅵ऩܗЁⱘ 32ԡࡴ⊩఼ⱘᦣ䗄˖
----------------------------------------------------------
---- flow count element
----------------------------------------------------------
-----temporary computing 12 bits adder
process(Count_0_en,count_buffer,Len,Carry_0_0,Carry_0_1)
begin
case Count_0_en is
---1st Step addition (10 downto 0) + (10 downto 0)
when "001" => add_12_a_0 <= ('0' & count_buffer(0)(10 downto 0));
add_12_b_0 <= ('0' & Len(10 downto 0));
---2nd Step addition (21 downto 11) + Carry_0_0
when "010" => add_12_a_0 <= ('0' & count_buffer(0)(21 downto 11));
add_12_b_0 <= ("00000000000" & Carry_0_0);
---3rd Step addition (31 downto 22) + Carry_0_1
when "100" => add_12_a_0 <= ("00" & count_buffer(0)(31 downto 22));
add_12_b_0 <= ("00000000000" & Carry_0_1);
when others => add_12_a_0 <=˄others=>’X’˅;
add_12_b_0 <=˄others=>’X’˅;
end case;
end process;
------12 bits adder
add_12_result_0 <= add_12_a_0 + add_12_b_0;
------Bytes Count
12
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
process(RST,CLK_25MHz,IO,OE_bar,data_sel,Count_0_en)
begin
if(RST = '1')then -----system Reset
count_buffer(0) <= (others => '0');
Carry_0_0 <= '0';
Carry_0_1 <= '0';
Carry_0_2 <= '0';
elsif(CLK_25MHz'event and CLK_25MHz = '0')then
if(OE_bar = '0' and data_sel = '0')then
count_buffer(0) <= IO;
Carry_0_2 <= '0';
else
case Count_0_en is
---1st Step addition (10 downto 0) + (10 downto 0)
when "001" => count_buffer(0)(10 downto 0) <= add_12_result_0(10 downto 0);
Carry_0_0 <= add_12_result_0(11);--first step carry
---2nd Step addition (21 downto 11) + Carry_0_0
when "010" => count_buffer(0)(21 downto 11) <= add_12_result_0(10 downto 0);
Carry_0_1 <= add_12_result_0(11);--Second step carry
---3rd Step addition (31 downto 22) + Carry_0_1
when "100" => count_buffer(0)(31 downto 22) <= add_12_result_0(9 downto 0);
Carry_0_2 <= add_12_result_0(10);--Third step carry
when others => Carry_0_2 <= '0';
end case;
end if;
end if;
end process;
2.4 ֵো䕧ߎ
ᔧԴ䳔㽕ᇚ FPGA/CPLDݙ䚼ⱘֵো䗮䖛ㅵ㛮䕧ߎ㒭䚼Ⳍ఼݇ӊⱘᯊ བˈᵰϡᕅડࡳ㛑᳔དᰃᇚ䖭
ѯֵো䗮䖛⫼ᯊ䩳䫕ᄬৢ䕧ߎDŽЎ䗮ᐌᚙމϟϔϾᵓᄤᰃᎹѢϔ⾡ϸ⾡ᯊ䩳ᓣϟ Ϣˈ FPGA/CPLD
Ⳍ䖲ⱘ㢃⠛ⱘᎹᯊ䩳᭄ᚙᔶϟϢ FPGA ⱘᯊ䩳ৠ⑤ˈབᵰ䕧ߎⱘֵো㒣䖛ᯊ䩳䫕ᄬৃҹ䍋ࠄབϟ
ⱘ⫼˖
! ᆍᯧ⒵䎇㢃⠛䯈ֵো䖲ⱘᯊᑣ㽕∖˗
! ᆍᯧ⒵䎇ֵোⱘᓎゟֱᣕᯊ䯈˗
� �
&/.
6,*
6,*�
6,*�
བϞ᠔⼎ˈ↨བ FPGA/CPLD CLKⱘᯊ䩳⊓ 1䫕ᄬϔϾֵোᕫࠄ SIG᠔⼎ⱘ⊶ᔶ SˈIGֵো䳔㽕㒭
ⱘϔϾϢ݊ষⱘ㢃⠛ 䙷ˈМ䆹㢃⠛ᇚϔᅮӮ CLKⱘᯊ䩳⊓ 2ℷ⹂䞛ḋࠄ SIGֵোDŽԚᰃབᵰ䆹ֵো
FPGA/CPLDЁ䕧ߎⱘᯊϡᰃ⫼ᯊ䩳⊓䫕ᄬⱘˈ䙷ᇚ᳝ৃ㛑ߎ⦄ SIG1/SIG2᠔⼎ⱘᯊᑣ݇㋏ˈ߭Ϣ݊
ষⱘ㢃⠛ᯊ䩳⊓ 2໘䞛ḋ䆹ֵোⱘᯊ᳝ৃ㛑ߎ⦄ᓎゟֱᣕᯊ䯈ϡ⒵䎇㽕∖㗠ߎ⦄䞛ḋϡৃ䴴ǃ⊓ᠧ
13
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
⊓ㄝᚙމDŽ䗮䖛㒘ড়䘏䕥䕧ߎ䖬᳝ৃ㛑ߎ⦄↯ࠎⱘᚙމDŽ᠔᳝䖭ѯϡ㾘㣗ⱘ䆒䅵䛑Ӯᓩ䍋㋏㒳Ꮉᯊ
ⱘϡৃ䴴ǃϡ〇ᅮⱘᚙᔶDŽ
2.5 ᆘᄬᓖℹ䕧ֵܹো
៥Ӏ᮹ᐌⱘ䆒䅵ᎹЁˈFPGA/CPLDᘏᰃ㽕Ϣ߿ⱘ㢃⠛Ⳍ䖲ⱘˈFPGA/CPLDӮ㒭߿ⱘ㢃⠛䕧ߎ
ֵোˈৠᯊг㽕໘⧚߿ⱘ㢃⠛䗕ᴹⱘֵোˈ䖭ѯֵোᕔᕔᇍ FPGA/CPLD ݙ䚼ⱘᯊ䩳㋏㒳㗠㿔ᰃᓖℹⱘˈ
Ўњৃ䴴ⱘ䞛ḋࠄ䖭ѯ䕧ֵܹোˈᓎ䆂ᇚ䖭ѯ䕧ֵܹোՓ⫼Ⳍᑨⱘᯊ䩳䫕ᄬৢ໘⧚ˈ䖭ḋخ˖
! ᇚॳᴹⱘᓖℹֵো䕀࣪៤ৠℹᴹ໘⧚˗
! এ䰸䕧ֵܹোЁⱘ↯ࠎ˄⡍߿ᰃᇍѢ᭄ᘏ㒓˅˗
FPGA/CPLDЁֵোⱘ䕧ܹǃ䕧ߎ䫕ᄬ
2.6 FPGA/CPLDЁⱘᯊ䩳䆒䅵
᮴≺ᰃ⫼⾏ᬷ䘏䕥ǃৃ㓪䘏䕥ˈ䖬ᰃ⫼ܼᅮࠊ⸙఼ӊᅲ⦄ⱘӏԩ᭄ᄫ䆒䅵ˈЎњ៤ࡳഄ᪡ˈৃ䴴
ⱘᯊ䩳ᰃ䴲ᐌ݇䬂ⱘDŽ䆒䅵ϡ㡃ⱘᯊ䩳ᵕ䰤ⱘ⏽ᑺǃ⬉य़ࠊ䗴Ꮉ㡎ⱘأᏂᚙމϟᇚᇐ㟈䫭䇃ⱘ㸠Ўˈ
ᑊϨ䇗䆩ೄ䲒ǃ㢅䫔ᕜDŽ䆒䅵 FPGA/CPLD ᯊ䗮ᐌ䞛⫼⾡ᯊ䩳㉏ൟDŽᯊ䩳ৃߚЎབϟಯ⾡㉏ൟ˖ܼ
ሔᯊ䩳ǃ䮼ᯊ䩳ǃ㑻䘏䕥ᯊ䩳⊶ࡼᓣᯊ䩳DŽᯊ䩳㋏㒳㛑ࣙᣀϞ䗄ಯ⾡ᯊ䩳㉏ൟⱘӏᛣ㒘ড়DŽ
᮴䆎䞛⫼ԩ⾡ᮍᓣˈ⬉䏃Ёⳳᅲⱘᯊ䩳ᷥг᮴⊩䖒ࠄ؛ᅮⱘ⧚ᛇᯊ䩳ˈℸ៥Ӏᖙ乏ձ⧚ᛇᯊ䩳ˈ
ᓎゟϔϾᅲ䰙Ꮉᯊ䩳ൟᴹߚᵤ⬉䏃ˈ䖭ḋᠡৃҹՓᕫ⬉䏃ⱘᅲ䰙Ꮉᬜᵰ乘ᳳⱘϔḋDŽᅲ䰙ⱘᯊ
䩳ൟЁˈ៥Ӏ㽕㗗㰥ᯊ䩳ᷥӴ᪁Ёⱘأ᭰ǃ䏇ব㒱ᇍൖⳈⱘأᏂҹঞ݊ᅗϔѯϡ⹂ᅮ㋴DŽ
14
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
ᇍѢᆘᄬ఼㗠㿔ˈᔧᯊ䩳Ꮉ⊓ࠄᴹᯊᅗⱘ᭄ッᑨ䆹Ꮖ㒣〇ᅮˈ䖭ḋᠡ㛑ֱ䆕ᯊ䩳Ꮉ⊓䞛ḋࠄ᭄
ⱘℷ⹂ᗻˈ䖭↉᭄ⱘ乘ᯊ䯈៥Ӏ⿄ПЎᓎゟᯊ䯈˄setup time DŽ˅᭄ৠḋᑨ䆹ᯊ䩳Ꮉ⊓䖛এৢֱ
ᣕϔ↉ᯊ䯈ˈ䖭↉ᯊ䯈⿄Ўֱᣕᯊ䯈˄hold time DŽ˅ℸԧⱘᯊ䩳བ 5᠔⼎DŽ݊Ё㔥㒰ᓊ䖳ᰃᣛᯊ䩳ⱘ
Ӵ᪁ᓊᯊҹঞЎ䏇বϡൖⳈㄝᬜⱘأᏂ ˈℸ⸔Ϟ㗗㰥ϔѯϡ⹂ᅮ㋴ᅲ䰙ⱘᎹᯊ䩳⊓བЁ᠔⼎DŽ
ֱᣕᯊ䯈˄hold˅ᓎゟᯊ䯈˄setup˅䛑ᰃⳌᇍѢᅲ䰙ᯊ䩳䏇ব㗠㿔ⱘDŽℸ⹂ᅮ⬉䏃ᯊᑣᯊˈᖙ乏㽕
㗗㰥ࠄ䖭ѯ㋴ˈՓᕫᓎゟᯊ䯈ֱᣕᯊ䯈ヺড়㽕∖DŽ
hold
setup
⧚ᛇ
䏇ব
㔥㒰
ᓊ䖳
ᅲ䰙ᯊ
䩳⊓
㔥㒰
ᓊ䖳
ᅲ䰙ᯊ
䩳⊓
⧚ᛇ
䏇ব 㔥㒰
ᓊ䖳
᳝ᬜᎹऎ
5 Ꮉᯊ䩳ൟ
ЎњՓ⬉䏃ℷᐌᎹˈᓎゟᯊ䯈ֱᣕᯊ䯈ᑨ䆹ߚ߿⒵䎇˖
min_logmin__ icQclockskewhold tttt !
skewsetupicQclockclock ttttt " max_logmax__
݊Ёtclock_Q_maxᰃᯊ䩳⊓ব࣪ࠄ᭄䕧ߎッব࣪ⱘ᳔᜶ব࣪ᚙމˈtlogic_maxᰃᆘᄬ఼䯈㒘ড়䘏䕥ⱘ᳔ৃ
㛑ᓊ䖳 tˈclock_Q_mintlogic_min㸼⼎᳔ᖿᚙމDŽ㗗㰥ᓎゟֱᣕᯊ䯈ᯊˈᑨ䆹㗗㰥ᯊ䩳ᷥৢأ᭰ⱘᚙމˈ㗗
㰥ᓎゟᯊ䯈ᯊᑨ䆹㗗㰥ᯊ䩳ᷥࠡأ᭰ⱘᚙމDŽ䖯㸠ৢӓⳳᯊˈ᳔ᓊ䖳⫼ᴹẔᶹᓎゟᯊ䯈ˈ᳔ᇣᓊᯊ
⫼ᴹẔᶹֱᣕᯊ䯈DŽ
2.6.1 ܼሔᯊ䩳
ᇍѢϔϾ䆒䅵乍Ⳃᴹ䇈ˈܼሔᯊ䩳(ৠℹᯊ䩳)ᰃ᳔ㅔऩ᳔ৃ乘⌟ⱘᯊ䩳DŽ PLD/FPGA 䆒䅵Ё᳔
དⱘᯊ䩳ᮍḜᰃ˖⬅ϧ⫼ⱘܼሔᯊ䩳䕧ܹᓩ㛮偅ࡼⱘऩϾЏᯊ䩳এ䩳䆒䅵乍ⳂЁⱘ↣ϔϾ㾺থ఼DŽা㽕
ৃ㛑ህᑨሑ䞣䆒䅵乍ⳂЁ䞛⫼ܼሔᯊ䩳DŽPLD/FPGA 䛑᳝ϧ䮼ⱘܼሔᯊ䩳ᓩ㛮ˈᅗⳈ䖲ࠄ఼ӊЁⱘ
↣ϔϾᆘᄬ఼DŽ䖭⾡ܼሔᯊ䩳ᦤկ఼ӊЁ᳔ⷁⱘᯊ䩳ࠄ䕧ߎⱘᓊᯊDŽ
1 ⼎ߎܼሔᯊ䩳ⱘᅲ՟DŽ 1 ᅮᯊ⊶ᔶ⼎ߎ㾺থ఼ⱘ᭄䕧ܹ D[1..3]ᑨ䙉ᅜᓎゟᯊ䯈ֱᣕᯊ䯈ⱘ
㑺ᴳᴵӊDŽᓎゟֱᣕᯊ䯈ⱘ᭄ؐ PLD᭄ݠЁ㒭ߎˈгৃ⫼䕃ӊⱘᅮᯊߚᵤ఼䅵ㅫߎᴹDŽབᵰᑨ
⫼Ёϡ㛑⒵䎇ᓎゟֱᣕᯊ䯈ⱘ㽕∖ˈ߭ᖙ乏⫼ᯊ䩳ৠℹ䕧ֵܹো(খⳟϟϔゴ“ᓖℹ䕧ܹ”)DŽ
15
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
1 ܼሔᯊ䩳
˄᳔དⱘᮍ⊩ᰃ⫼ܼሔᯊ䩳ᓩ㛮এ䩳 PLDݙⱘ↣ϔϾᆘᄬ఼ Ѣˈᰃ᭄া㽕䙉ᅜⳌᇍᯊ䩳ⱘᓎゟᯊ䯈 tsu
ֱᣕᯊ䯈 th˅
2.6.2 䮼ᯊ䩳
䆌ᑨ⫼ЁˈᭈϾ䆒䅵乍Ⳃ䛑䞛⫼䚼ⱘܼሔᯊ䩳ᰃϡৃ㛑ϡᅲ䰙ⱘDŽPLD᳝Ь⿃乍䘏䕥䰉߫
ᯊ䩳˄ेᯊ䩳ᰃ⬅䘏䕥ѻ⫳ⱘ˅ˈܕ䆌ӏᛣߑ᭄ऩ⣀ഄ䩳Ͼ㾺থ఼DŽ✊㗠ˈᔧԴ⫼䰉߫ᯊ䩳ᯊˈᑨҨ
㒚ഄߚᵤᯊ䩳ߑ᭄ˈҹ䙓ܡ↯ࠎDŽ
䗮ᐌ⫼䰉߫ᯊ䩳ᵘ៤䮼ᯊ䩳DŽ䮼ᯊ䩳ᐌᐌৠᖂ໘⧚఼ষ᳝݇ˈ⫼ഄഔ㒓এࠊݭ㛝ކDŽ✊㗠ˈ↣
ᔧ⫼㒘ড়ߑ᭄䩳㾺থ఼ᯊˈ䗮ᐌ䛑ᄬⴔ䮼ᯊ䩳DŽབᵰヺড়ϟ䗄ᴵӊˈ䮼ᯊ䩳ৃҹ䈵ܼሔᯊ䩳ϔḋ
ৃ䴴ഄᎹ˖
偅ࡼᯊ䩳ⱘ䘏䕥ᖙ乏াࣙϔϾ“Ϣ”䮼ϔϾ“”䮼DŽབᵰ䞛⫼ӏԩ䰘ࡴ䘏ᶤѯᎹ⢊ᗕϟˈ
Ӯߎ⦄ゲѝѻ⫳ⱘ↯ࠎDŽ
䘏䕥䮼ⱘϔϾ䕧ܹЎᅲ䰙ⱘᯊ䩳ˈ㗠䆹䘏䕥䮼ⱘ᠔᳝݊ᅗ䕧ܹᖙ乏ᔧ៤ഄഔࠊ㒓ˈᅗӀ䙉
ᅜⳌᇍѢᯊ䩳ⱘᓎゟֱᣕᯊ䯈ⱘ㑺ᴳDŽ
2 3 ᰃৃ䴴ⱘ䮼ᯊ䩳ⱘᅲ՟DŽ 2 Ёˈ⫼ϔϾ“Ϣ”䮼ѻ⫳䮼ᯊ䩳ˈ 3 Ёˈ⫼ϔϾ“”
䮼ѻ⫳䮼ᯊ䩳DŽ䖭ϸϾᅲ՟Ёˈᓩ㛮 nWR nWE㗗㰥Ўᯊ䩳ᓩ㛮ˈᓩ㛮 ADD[oˊˊ3]ᰃഄഔᓩ㛮ˈ
ϸϾ㾺থ఼ⱘ᭄ᰃֵো D[1..n]㒣䱣ᴎ䘏䕥ѻ⫳ⱘDŽ
16
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
2 “Ϣ”䮼䮼ᯊ䩳
�
�
3 “”䮼䮼ᯊ䩳
2 3 ⱘ⊶ᔶᰒ⼎ߎ᳝݇ⱘᓎゟᯊ䯈ֱᣕᯊ䯈ⱘ㽕∖DŽ䖭ϸϾ䆒䅵乍Ⳃⱘഄഔ㒓ᖙ乏ᯊ䩳ֱᣕ
᳝ᬜⱘᭈϾᳳ䯈ݙֱᣕ〇ᅮ(nWR nWEᰃԢ⬉ᑇ᳝ᬜ)DŽབᵰഄഔ㒓㾘ᅮⱘᯊ䯈ݙֱᣕ〇ᅮˈ߭ ᯊ
䩳ϞӮߎ⦄↯ࠎˈ䗴៤㾺থ఼থ⫳䫭䇃ⱘ⢊ᗕব࣪DŽϔᮍ䴶ˈ᭄ᓩ㛮 D[1ˊ nˊ]া㽕∖ nWR nWE
ⱘ᳝ᬜ䖍⊓໘⒵䎇ᷛޚⱘᓎゟֱᣕᯊ䯈ⱘ㾘ᅮDŽ
៥Ӏᕔᕔৃҹᇚ䮼ᯊ䩳䕀ᤶ៤ܼሔᯊ䩳ҹᬍ䆒䅵乍Ⳃⱘৃ䴴ᗻDŽ 4 ⼎ߎབԩ⫼ܼሔᯊ䩳䞡ᮄ䆒
䅵 2 ⱘ⬉䏃DŽഄഔ㒓ࠊ D㾺থ఼ⱘՓ㛑䕧ܹˈ䆌 PLD䆒䅵䕃ӊˈབ MAX+PLUSII䕃ӊ䛑ᦤկ
䖭⾡ᏺՓ㛑ッⱘ D㾺থ఼DŽᔧ ENAЎ催⬉ᑇᯊˈD䕧ܹッⱘؐ㹿䩳ࠄ㾺থ఼Ё˖ᔧ ENAЎԢ⬉ᑇᯊˈ
㓈ᣕ⦄ⱘ⢊ᗕDŽ
17
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
4 “Ϣ”䮼䮼ᯊ䩳䕀࣪៤ܼሔᯊ䩳
4 Ё䞡ᮄ䆒䅵ⱘ⬉䏃ⱘᅮᯊ⊶ᔶ㸼ᯢഄഔ㒓ϡ䳔㽕 nWR ᳝ᬜⱘᭈϾᳳ䯈ݙֱᣕ〇ᅮ˗㗠া㽕∖ᅗӀ
᭄ᓩ㛮ϔḋヺড়ৠḋⱘᓎゟֱᣕᯊ䯈ˈ䖭ḋᇍഄഔ㒓ⱘ㽕∖ህᇥᕜDŽ
5㒭ߎϔϾϡৃ䴴ⱘ䮼ᯊ䩳ⱘ՟ᄤDŽ3ԡৠℹࡴ⊩䅵఼᭄ⱘ RCO䕧ߎ⫼ᴹ䩳㾺থ఼DŽ✊㗠ˈ䅵఼᭄
㒭ߎⱘϾ䕧ܹ䍋ࠄᯊ䩳ⱘ⫼ˈ䖭䖱ডњৃ䴴䮼ᯊ䩳᠔䳔ⱘᴵӊПϔDŽѻ⫳ RCOֵোⱘ㾺থ఼Ёˈ
≵᳝ϔϾ㛑㗗㰥Ўᅲ䰙ⱘᯊ䩳㒓ˈ䖭ᰃЎ᠔᳝㾺থ఼ТⳌৠⱘᯊࠏথ⫳㗏䕀DŽ㗠៥Ӏᑊϡ㛑ֱ䆕
PLD/FPGAݙ䚼 QA,QB,QCࠄ D㾺থ఼ⱘᏗ㒓䭓ⷁϔ㟈ˈℸˈབ 5 ⱘᯊ䯈⊶ᔶ᠔⼎ˈ఼Ң 3䅵ࠄ
4ᯊˈRCO㒓ϞӮߎ⦄↯ࠎ˄؛䆒 QCࠄ D㾺থ఼ⱘ䏃ᕘ䕗ⷁˈे QCⱘ䕧ߎܜ㗏䕀˅DŽ
18
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
5 ϡৃ䴴ⱘ䮼ᯊ䩳
(ᅮᯊ⊶ᔶ⼎ߎ䅵఼᭄Ң 3ࠄ 4ᬍবᯊˈRCOֵোབԩߎ⦄↯ࠎⱘ)
6 㒭ߎϔ⾡ৃ䴴ⱘܼሔ䩳ⱘ⬉䏃ˈᅗᰃ 5 ϡৃ䴴䅵఼᭄⬉䏃ⱘᬍ䖯ˈRCO ࠊ D 㾺থ఼ⱘՓ㛑䕧
ܹDŽ䖭Ͼᬍ䖯ϡ䳔㽕ࡴ PLDⱘ䘏䕥ऩܗDŽ
6 ϡৃ䴴ⱘ
䮼ᯊ䩳䕀ᤶЎܼሔᯊ䩳
2.6.3 㑻䘏䕥ᯊ䩳
ᔧѻ⫳䮼ᯊ䩳ⱘ㒘ড়䘏䕥䍙䖛ϔ㑻(े䍙䖛ऩϾⱘ“Ϣ”䮼“”䮼)ᯊ 䆕ˈ䆒䅵乍Ⳃⱘৃ䴴ᗻবᕫᕜೄ
䲒DŽेՓḋᴎӓⳳ㒧ᵰ≵᳝ᰒ⼎ߎ䴭ᗕ䰽䈵ˈԚᅲ䰙Ϟҡ✊ৃ㛑ᄬⴔॅ䰽DŽ䗮ᐌˈ៥Ӏϡᑨ䆹⫼㑻
㒘ড়䘏䕥এ䩳 PLD䆒䅵Ёⱘ㾺থ఼DŽ
7 㒭ߎϔϾ᳝䰽䈵ⱘ㑻ᯊ䩳ⱘ՟ᄤDŽᯊ䩳ᰃ⬅ SELᓩ㛮ࠊⱘ䏃䗝ᢽ఼䕧ߎⱘDŽ䏃䗝ᢽ఼ⱘ䕧
ܹᰃᯊ䩳(CLK)䆹ᯊ䩳ⱘ 2 ߚ乥(DIV2)DŽ⬅ 7 ⱘᅮᯊ⊶ᔶⳟߎˈϸϾᯊ䩳ഛЎ䘏䕥 1 ⱘᚙމϟˈ
ᔧ SEL㒓ⱘ⢊ᗕᬍবᯊˈᄬ䴭ᗕ䰽䈵DŽ䰽䈵ⱘᑺপއѢᎹⱘᴵӊDŽ 㑻䘏䕥ⱘ䰽䈵ᰃৃҹএ䰸ⱘDŽ
՟བˈԴৃҹᦦܹ“ݫԭ䘏䕥”ࠄ䆒䅵乍ⳂЁDŽ✊㗠ˈPLD/FPGA㓪䆥఼䘏䕥㓐ড়ᯊӮএᥝ䖭ѯݫԭ䘏䕥ˈ
Փᕫ偠䆕䰽䈵ᰃ৺ⳳℷ㹿এ䰸বᕫೄ䲒њDŽЎℸˈᖙ乏ᑨᇏ∖݊ᅗᮍ⊩ᴹᅲ⦄⬉䏃ⱘࡳ㛑DŽ
19
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
7 ᳝䴭ᗕ䰽䈵ⱘ㑻ᯊ䩳
8 㒭ߎ 7 ⬉䏃ⱘϔ⾡ऩ㑻ᯊ䩳ⱘ᳓ҷᮍḜDŽЁ SELᓩ㛮 DIV2ֵো⫼ѢՓ㛑 D㾺থ఼ⱘՓ㛑䕧
ܹッˈ㗠ϡᰃ⫼Ѣ䆹㾺থ఼ⱘᯊ䩳ᓩ㛮DŽ䞛⫼䖭Ͼ⬉䏃ᑊϡ䳔㽕䰘ࡴ PLD ⱘ䘏䕥ऩܗˈᎹैৃ䴴
њDŽ ϡৠⱘ㋏㒳䳔㽕䞛⫼ϡৠⱘᮍ⊩এ䰸㑻ᯊ䩳ˈᑊ≵᳝ᅮⱘᓣDŽ
�
7 ᮴䴭ᗕ䰽䈵ⱘ㑻ᯊ䩳
˄䖭Ͼ⬉䏃䘏䕥ϞㄝᬜѢ 7ˈԚैৃ䴴ⱘ˅�
2.6.4 㸠⊶ᯊ䩳
ϔ⾡⌕㸠ⱘᯊ䩳⬉䏃ᰃ䞛⫼㸠⊶ᯊ䩳ˈेϔϾ㾺থ఼ⱘ䕧ߎ⫼ϔϾ㾺থ఼ⱘᯊ䩳䕧ܹDŽབᵰҨ
㒚ഄ䆒䅵ˈ㸠⊶ᯊ䩳ৃҹ䈵ܼሔᯊ䩳ϔḋഄৃ䴴ᎹDŽ✊㗠ˈ㸠⊶ᯊ䩳ՓᕫϢ⬉䏃᳝݇ⱘᅮᯊ䅵ㅫবᕫᕜ
20
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
ᴖDŽ㸠⊶ᯊ䩳㸠⊶䫒Ϟ㾺থ఼ⱘᯊ䩳П䯈ѻ⫳䕗ⱘᯊ䯈أ⿏ ᑊˈϨӮ䍙ߎ᳔ണᚙމϟⱘᓎゟᯊ䯈ǃ
ֱᣕᯊ䯈⬉䏃Ёᯊ䩳ࠄ䕧ߎⱘᓊᯊˈՓ㋏㒳ⱘᅲ䰙䗳ᑺϟ䰡DŽ
⫼䅵᭄㗏䕀ൟ㾺থ఼ᵘ៤ᓖℹ䅵఼᭄ᯊᐌ䞛⫼㸠⊶ᯊ䩳ˈϔϾ㾺থ఼ⱘ䕧ߎ䩳ϟϔϾ㾺থ఼ⱘ䕧ܹˈ
খⳟ 9 ৠℹ䅵఼᭄䗮ᐌᰃҷ᳓ᓖℹ䅵఼᭄ⱘདᮍḜˈ䖭ᰃЎϸ㗙䳔㽕ৠḋⱘᅣऩܗ㗠ৠℹ䅵᭄
఼᳝䕗ᖿⱘᯊ䩳ࠄ䕧ߎⱘᯊ䯈DŽ 10 㒭ߎ᳝ܼሔᯊ䩳ⱘৠℹ䅵఼᭄ˈᅗ 9 ࡳ㛑Ⳍৠˈ⫼њৠḋ
ⱘ䘏䕥ऩܗᅲ⦄ˈै᳝䕗ᖿⱘᯊ䩳ࠄ䕧ߎⱘᯊ䯈DŽТ᠔᳝ PLDᓔথ䕃ӊ䛑ᦤկ⾡ḋⱘৠℹ䅵఼᭄DŽ
�
9 㸠⊶ᯊ䩳�
10 㸠⊶ᯊ䩳䕀ᤶ៤ܼሔᯊ䩳
(䖭Ͼ 3ԡ䅵఼᭄ᰃ 9ᓖℹ䅵఼᭄ⱘ᳓ҷ⬉䏃 ᅗˈ⫼њৠḋⱘ 3Ͼᅣऩܗ Ԛˈ᳝ⷁⱘᯊ䩳ࠄ䕧ߎⱘᓊᯊ)
2.6.5 ᯊ䩳㋏㒳
䆌㋏㒳㽕∖ৠϔϾ PLDݙ䞛⫼ᯊ䩳DŽ᳔ᐌ㾕ⱘ՟ᄤᰃϸϾᓖℹᖂ໘⧚఼఼П䯈ⱘষˈᖂ໘
⧚఼ᓖℹ䗮ֵ䗮䘧ⱘষDŽ⬅ѢϸϾᯊ䩳ֵোП䯈㽕∖ϔᅮⱘᓎゟֱᣕᯊ䯈ˈ᠔ҹˈϞ䗄ᑨ⫼ᓩ䖯њ
䰘ࡴⱘᅮᯊ㑺ᴳᴵӊDŽᅗӀгӮ㽕∖ᇚᶤѯᓖℹֵোৠℹ࣪DŽ
11 㒭ߎϔϾᯊ䩳㋏㒳ⱘᅲ՟DŽCLK_A⫼ҹ䩳 REG_A CˈLK_B⫼Ѣ䩳 REG_B ⬅ˈѢ REG_A
偅ࡼⴔ䖯ܹ REG_Bⱘ㒘ড়䘏䕥ˈᬙ CLK_AⱘϞछ⊓ⳌᇍѢ CLK_BⱘϞछ⊓᳝ᓎゟᯊ䯈ֱᣕᯊ䯈ⱘ㽕
∖DŽ⬅Ѣ REG_Bϡ偅ࡼ作ࠄ REG_Aⱘ䘏䕥 CˈLK_BⱘϞछ⊓ⳌᇍѢ CLK_A≵᳝ᓎゟᯊ䯈ⱘ㽕∖DŽℸˈ
⬅Ѣᯊ䩳ⱘϟ䰡⊓ϡᕅડ㾺থ఼ⱘ⢊ᗕ ᠔ˈҹ CLK_A CLK_Bⱘϟ䰡⊓П䯈≵᳝ᯊ䯈Ϟⱘ㽕∖DŽབ 4ˈ
21
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
2 IˊI᠔⼎ˈ⬉䏃Ё᳝ϸϾ⣀ゟⱘᯊ䩳ˈৃᰃˈᅗӀП䯈ⱘᓎゟᯊ䯈ֱᣕᯊ䯈ⱘ㽕∖ᰃϡ㛑ֱ䆕ⱘDŽ
䖭⾡ᚙމϟˈᖙ乏ᇚ⬉䏃ৠℹ࣪DŽ 12 㒭ߎ REG_A ⱘؐ(བԩՓ⫼ࠡ)ৠ CLK_B ৠℹ࣪DŽᮄⱘ㾺থ఼
REG_C⬅ GLK_B㾺ˈֱ䆕 REG_Gⱘ䕧ߎヺড় REG_Bⱘᓎゟᯊ䯈DŽ✊㗠ˈ䖭Ͼᮍ⊩Փ䕧ߎᓊᯊњϔϾ
ᯊ䩳਼ᳳDŽ
ll ᯊ䩳㋏㒳
(ᅮᯊ⊶ᔶ⼎ߎ CLK_AⱘϞछ⊓ⳌᇍѢ CLK_BⱘϞछ⊓᳝ᓎゟᯊ䯈ֱᣕᯊ䯈ⱘ㑺ᴳᴵӊ)
�
12 ᳝ৠℹᆘᄬ఼䕧ߎⱘᯊ䩳㋏㒳
(བᵰ CLK_A CLK_BᰃⳌѦ⣀ゟⱘˈ߭ REG—Aⱘ䕧ߎᖙ乏ᅗ作䗕ࠄ 1REG_BПࠡˈ⫼ REG_Cৠ
ℹ࣪)�
䆌ᑨ⫼Ёাᇚᓖℹֵোৠℹ࣪䖬ᰃϡⱘˈᔧ㋏㒳Ё᳝ϸϾϸϾҹϞ䴲ৠ⑤ᯊ䩳ⱘᯊˈ᭄
ⱘᓎゟֱᣕᯊ䯈ᕜ䲒ᕫࠄֱ䆕ˈ៥Ӏᇚ䴶Јᴖⱘᯊ䯈䯂乬DŽ᳔དⱘᮍ⊩ᰃᇚ᠔᳝䴲ৠ⑤ᯊ䩳ৠℹ࣪DŽ
Փ⫼ PLDݙ䚼ⱘ䫕乍⦃˄PLL DLL˅ᰃϔϾᬜᵰᕜདⱘᮍ⊩ˈԚϡᰃ᠔᳝ PLD䛑ᏺ᳝ PLLǃDLLˈ㗠
Ϩᏺ᳝ PLLࡳ㛑ⱘ㢃⠛ӋḐᯖ䌉ˈ᠔ҹ䰸䴲᳝⡍⅞㽕∖ˈϔ㠀എড়ৃҹϡՓ⫼ᏺ PLLⱘ PLDDŽ 䖭ᯊ
៥Ӏ䳔㽕Փ⫼ᏺՓ㛑ッⱘ D㾺থ఼ˈᑊᓩܹϔϾ催乥ᯊ䩳DŽ
22
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
�
13 ϡৠ⑤ᯊ䩳
བ 13᠔⼎ˈ㋏㒳᳝ϸϾϡৠ⑤ᯊ䩳ˈϔϾЎ 3MHzˈϔϾЎ 5MHzˈϡৠⱘ㾺থ఼Փ⫼ϡৠⱘᯊ䩳DŽЎ
њ㋏㒳〇ᅮˈ៥ӀᓩܹϔϾ 20MHzᯊ䩳ˈᇚ 3M 5Mᯊ䩳ৠℹ࣪ˈབ 15᠔⼎DŽ 20Mⱘ催乥ᯊ䩳ᇚ
Ў㋏㒳ᯊ䩳ˈ䕧ܹࠄ᠔᳝㾺থ఼ⱘⱘᯊ䩳ッDŽ3M_EN 5M_EN ᇚࠊ᠔᳝㾺থ఼ⱘՓ㛑ッDŽेॳᴹ
3Mᯊ䩳ⱘ㾺থ఼ˈ 20Mᯊ䩳ˈৠᯊ 3M_EN ᇚࠊ䆹㾺থ఼Փ㛑 ˈॳ 5Mᯊ䩳ⱘ㾺থ఼ˈг 20M
ᯊ䩳ˈৠᯊ 5M_EN ᇚࠊ䆹㾺থ఼Փ㛑DŽ 䖭ḋ៥Ӏህৃҹᇚӏԩ䴲ৠ⑤ᯊ䩳ৠℹ࣪DŽ
13 ৠℹ࣪ӏᛣ䴲ৠ⑤ᯊ䩳
˄ϔϾ DFFৢ䴶䴲䮼ˈϢ䮼ᵘ៤ᯊ䩳Ϟछ⊓Ẕ⌟⬉䏃˅
ˈᓖℹֵো䕧ܹᘏᰃ᮴⊩⒵䎇᭄ⱘᓎゟֱᣕᯊ䯈ˈᆍᯧՓ㋏㒳䖯ܹѮ〇ᗕˈ᠔ҹгᓎ䆂䆒䅵㗙
ᡞ᠔᳝ᓖℹ䕧ܹ䛑ܜ㒣䖛ঠ㾺থ఼䖯㸠ৠℹ࣪.
� ᇣ㒧˖〇ᅮৃ䴴ⱘᯊ䩳ᰃ㋏㒳〇ᅮৃ䴴ⱘ䞡㽕ᴵӊˈ៥Ӏϡ㛑ᇚӏԩৃ㛑᳝↯ࠎⱘ䕧ߎЎᯊ䩳
ֵোˈᑊϨሑৃ㛑াՓ⫼ϔϾܼሔᯊ䩳ˈᇍᯊ䩳㋏㒳㽕⊼ᛣৠℹᓖℹֵো䴲ৠ⑤ᯊ䩳DŽ
2.6.6 ᯊ䩳㋏㒳䆒䅵ⱘϔѯᮍ⊩˖
བᵰᯊ䩳䯈ᄬⴔᅮⱘ乥⥛ס᭄ˈ䖭⾡ᚙމϟᅗӀⱘⳌԡϔ㠀᳝ᅮ݇㋏ˈৃҹ䞛⫼ϟ䗄ᮍ⊩໘⧚˗
Փ⫼催乥ᯊ䩳ЎᎹᯊ䩳ˈՓ⫼Ԣ乥ᯊ䩳ЎՓ㛑ֵোˈᔧࡳ㗫ϡЎ佪㽕㋴ᯊᓎ䆂Փ⫼䖭
⾡ᮍᓣ˗
23
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
Ҩ㒚ߚᵤᯊᑣⱘ⸔Ϟᦣ䗄ϸϾᯊ䩳䕀ᤶ໘ⱘ⬉䏃˗
བᵰ⬉䏃ЁᄬϸϾϡৠ乥⥛ⱘᯊ䩳ˈᑊϨ乥⥛᮴݇ˈৃҹ䞛⫼བϟㄪ⬹˖
߽⫼催乥ᯊ䩳䞛ḋϸϾᯊ䩳ˈ⬉䏃ЁՓ⫼催乥ᯊ䩳Ў⬉䏃ⱘᎹᯊ䩳ˈ㒣䞛ḋৢⱘԢ乥ᯊ䩳
ЎՓ㛑˗
ᯊ䩳ৠℹऩܗЁ䞛⫼ϸৠℹ⊩
Փ⫼ᦵֵো
Փ⫼ঠᯊ䩳 FIFO䖯㸠᭄㓧ކ
ᯊ䩳ৠℹ࣪ བˈᵰ㋏㒳ЁᄬϸϾᯊ䩳 clk_a clk_b,䆒䅵㗙ৃҹՓ⫼乥⥛催Ѣ max(clk_a,clk_b)ϸסⱘ
ᯊ䩳ᴹЎ䞛ḋᯊ䩳ˈϸϾԢ乥ᯊ䩳㒣䖛໘⧚ৢৃҹЎ㾺থ఼ⱘՓ㛑ֵোˈ䞛⫼䖭⾡ᮍḜⱘད໘ᰃᭈϾ
⬉䏃䞛⫼ऩᯊ䩳ᎹˈԚ䳔㽕ϔϾ乱ⱘ催乥ᯊ䩳ˈᔧ⬉䏃᳝ࡳ㗫㽕∖ᯊˈ䆒䅵㗙ᑨ䆹Ҩ㒚㗗㰥˗
Փ⫼ 20M䞛ḋ 3M 5M,syn_5MЎॳᴹ 5Mֵো偅ࡼᆘᄬ఼ⱘՓ㛑ֵো˗
Փ⫼催乥ᯊ䩳䞛ḋ 2ϾԢ乥ᯊ䩳ॳ⧚
Փ⫼催乥ᯊ䩳䞛ḋ 2ϾԢ乥ᯊ䩳⊶ᔶ
ᵘӊ⬅ϸϾϡৠ㋏㒳ᯊ䩳ࠊᎹⱘഫП䯈ⱘৠℹഫᯊˈᑨ䆹䙉ᅜϟ䴶ॳ߭˖ϸϾ䞛⫼ϡৠᯊ
䩳Ꮉⱘᆘᄬ఼П䯈ϡᑨ䆹ݡߎ⦄䘏䕥⬉䏃ˈ㗠ᑨ䆹ҙҙᰃϔ⾡䖲݇㋏ˈԧབϟ᠔⼎ˈ䖭⾡ᮍ⊩᳝
߽Ѣࠊᓎゟֱᣕᯊ䯈ⱘ⒵䎇DŽ
ᦵֵোᴎࠊᰃᓖℹ㋏㒳П䯈䗮ֵⱘᴀᮍᓣˈ៥Ӏ໘⧚ϡৠᯊ䩳П䯈ⱘষᯊˈгৃҹ䞛⫼䖭⾡
ᮍᓣˈԚ䳔㽕⊼ᛣⱘᰃ䆒䅵㗙ᑨ䆹Ҩ㒚ߚᵤᦵᑨㄨֵো᳝ᬜᣕ㓁ⱘᯊ䯈ˈ⹂ֱ䞛ḋ᭄ⱘℷ⹂ᗻDŽ
Ⳃࠡ⾡఼ӊЁᦤկⱘঠᯊ䩳 FIFOᅣऩܗᕜདⱘᦤկњᇍᓖℹঠᯊ䩳ⱘ䆓䯂 ऩˈܗⱘݙ䚼᳝ण䇗ϸϾ
ᯊ䩳ⱘ⬉䏃ˈ⹂ֱ䇏ݭⱘℷ⹂ᗻDŽৃҹ߽⫼䖭Ͼ఼ӊᅠ៤᭄ⱘৠℹDŽ
1. 䞛⫼ܼሔᯊ䩳ˈϡ㽕ᇚᯊ䩳খϢ䖤ㅫDŽ㋏㒳ᦤկϔᅮ᭄䞣ⱘܼሔᯊ䩳㒓ˈᏗሔᏗ㒓ᯊˈሑ䞣⒵䎇䖭
ѯֵোⱘ㽕∖ҹޣᇣᯊ䩳أ⿏ؒ᭰DŽབᵰᯊᑣᅝᥦϡড়⧚Փ⫼њ䕗 gated clockˈ䙷М䖭ѯᯊ䩳ⱘ
24
'1("�$1-%ᖂ℡ῆᾫ❶� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �
أ᭰ህӮ䕗ˈϡ㛑ֱ䱰ᓎゟᯊ䯈ֱᣕᯊ䯈ˈᇐ㟈⬉䏃Ꮉ乥⥛䰡Ԣ᮴⊩ᎹDŽ
2. ҹᆘ
本文档为【[翻译版]FPGA设计经验谈】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。