Агуулгын хүснэгт:

Basys ашиглан бүдэг LED 3 самбар: 5 алхам
Basys ашиглан бүдэг LED 3 самбар: 5 алхам

Видео: Basys ашиглан бүдэг LED 3 самбар: 5 алхам

Видео: Basys ашиглан бүдэг LED 3 самбар: 5 алхам
Видео: Укладка плитки на бетонное крыльцо быстро и качественно! Дешёвая плитка, но КРАСИВО! 2024, Долдугаар сарын
Anonim
Basys 3 хавтанг ашиглан бүдэг LED
Basys 3 хавтанг ашиглан бүдэг LED

Энэхүү гарын авлагад бид гадны LED гэрлийг багасгах системийг барьж, хянах гэж байна. Боломжтой товчлууруудын тусламжтайгаар хэрэглэгч LED чийдэнг хүссэн гэрэлтэй болгоно. Систем нь Basys 3 хавтанг ашигладаг бөгөөд энэ нь резистор болон LED чийдэн агуулсан талхны самбартай холбогддог. Зориулалтын "дээш" товчлуурыг дарахад гэрэл гэгээ нэмэгдэх бөгөөд "доош" товчлуур дээр дарахад гэрэл нь тэг хүртэл буурах болно. Энэ нь хэрэглэгчийг нарны гэрлийн чийдэнгээс сохорохоос сэргийлж зогсохгүй энерги хэмнэдэг!

Алхам 1: Оролтын тоолуур үүсгэх

Энэ алхамын хувьд бид гэрэлтүүлгийн түвшинг тодорхойлдог бүрэлдэхүүн хэсгийг бий болгодог (нэг цагаар), хоёр шилжүүлэгчийг ашиглана: нэгийг нь нэмэгдүүлэх, нөгөөийг нь бууруулах. VHDL-ийг ашигласнаар бид D flip-flop ашиглан тоолуур үйлдвэрлэжээ. "Дээш" товчлуурыг дарахад дараагийн төлөв нь одоогийн төлөв рүү шилжиж, долоон сегментийн дэлгэц болон LED чийдэнг гаргана.

аж ахуйн нэгжийн updown_counter байна

Порт (одоогийн байдал: STD_LOGIC_VECTOR (3 уруу 0 хүртэл); өмнөх_үй: STD_LOGIC_VECTOR -д (3 уруу 0); дараагийн_стат: STD_LOGIC_VECTOR -д (3 доошоо 0); clk: STD_LOGIC -д; доош_энэглэх боломжтой: STD_LOGIC -д) updown_counter -ийг дуусгах; архитектур updown_counter -ийн зан төлөв эхэлнэ flop: процесс (next_state, clk, up_enable, down_enable, previous_state) if if (Yükselen_edge (clk)) хэрэв дараа нь (up_enable = '1' биш харин (next_state = "0000")) дараа нь present_state <= next_state; elsif (down_enable = '1' болохоос биш (Өмнөх_стат = "1111")) дараа нь одоогийн_шат <= өмнөх_үй; хэрэв дуусгавар бол; хэрэв дуусгавар бол; үйл явц дуусах; зан үйлийн төгсгөл;

Бидэнд оролт бүрийг түгжих (дээшлэх үед) цаг хэрэгтэй тул гэрэлтүүлгийн түвшин бүрийн хооронд товчлууруудыг хэр хурдан дарж болохыг тодорхойлдог цаг хуваагчийг бүтээсэн. Энэхүү цагийн хуваарь нь долоон сегментийн дэлгэц дээр зөв түвшинг зөв харуулах, түвшин бүрийн хувьд зөв түвшний эрч хүчийг гаргах боломжийг бидэнд олгодог.

аж ахуйн нэгж counter_clkDiv нь

Порт (clk: in std_logic; sclk: out std_logic); counter_clkDiv дуусгах; counter_clkDiv -ийн my_clk_div архитектур нь тогтмол max_count: integer: = (10000000); дохио tmp_clk: std_logic: = '0'; my_div: process (clk, tmp_clk) хувьсагчийг эхлүүлэх div_cnt: integer: = 0; эхлэх (эхлэх_хүрээ (clk)) дараа нь (div_cnt> = MAX_COUNT) бол tmp_clk <= tmp_clk биш; div_cnt: = 0; өөр div_cnt: = div_cnt + 1; хэрэв дуусгавар бол; хэрэв дуусгавар бол; sclk <= tmp_clk; my_div процессыг дуусгах; my_clk_div -ийг дуусгах;

Алхам 2: LED цаг хуваагч үүсгэх

Энэ алхамыг хийхийн тулд бид LED чийдэнгийн цагны хуваагуурыг бий болгож, 16 өөр түвшний эрчимийг тодорхойлдог. 0 -ээс 15 хүртэл хамгийн их тод байдлыг харуулдаг тул цаг хуваагч нь товчлуур тус бүрийг бидний гэрэлтүүлгийн түвшинд тохируулсан хэмжээгээр нэмэгдүүлдэг. Өсөн нэмэгдэж буй түвшин бүр нь LED чийдэнгийн цагийг нэмэгдүүлдэг гэсэн үг юм. Гэрэл нь шугаман байдлаар өсдөггүй гэдгийг санаж, бид цагийг хамгийн дээд хэмжээнд нь эргүүлж, үүний дагуу цагийг багасгасан.

Анхаарна уу: бид цэнхэр өнгийн LED ашиглаж байна. Өөр өнгө (улаан гэх мэт) ашиглахад арай өөр цаг шаардлагатай болно; Цэнхэр өнгөний дунд зэргийн тод байдлын тохиргоо нь улаан өнгөний хамгийн их тод байдал байж магадгүй юм. Гэрлийн долгионы урт нь өөр өөр энерги шаарддаг тул хүйтэн өнгө нь нил ягаан, хөх илүү их энерги шаарддаг бол улаан, улбар шар гэх мэт дулаан өнгө нь бага энерги шаарддагтай холбоотой юм.

аж ахуйн нэгж led_clkDiv бол Порт (одоогийн байдал: STD_LOGIC_VECTOR -д (3 -аас 0 хүртэл); clk: STD_LOGIC -д; led_clk: STD_LOGIC -ээс гадагш); led_clkDiv -ийг дуусгах; led_clkDiv архитектурын зан төлөв нь дохио юм tmp_clk: std_logic: = '0'; хуваалцсан хувьсагч max_count: integer; begin count_stuff: process (present_state) start case present_state нь "0000" => max_count: = 0; үед "0001" => max_count: = 2; үед "0010" => max_count: = 4; үед "0011" => max_count: = 6; үед "0100" => max_count: = 8; үед "0101" => max_count: = 10; үед "0110" => max_count: = 12; үед "0111" => max_count: = 14; үед "1000" => max_count: = 16; үед "1001" => max_count: = 25; "1010" => max_count: = 50; үед "1011" => max_count: = 100; үед "1100" => max_count: = 150; үед "1101" => max_count: = 200; үед "1110" => max_count: = 250; үед "1111" => max_count: = 300; төгсгөлийн тохиолдол; үйл явцын тооллогыг дуусгах; my_div: процесс (clk, tmp_clk, present_state) хувьсагч div_cnt: integer: = 0; эхлэх (эхлэх_хүрээ (clk)) дараа нь (div_cnt> = max_count) бол tmp_clk <= tmp_clk биш; div_cnt: = 0; өөр div_cnt: = div_cnt + 1; хэрэв дуусгавар бол; хэрэв дуусгавар бол; led_clk <= tmp_clk; my_div процессыг дуусгах; зан үйлийн төгсгөл;

Алхам 3: LED хянагч үүсгэх

Одоо бид үүнийг хийж чадсан тул эцэст нь бидний үүсгэсэн бүх бүрэлдэхүүн хэсгүүдийг LED Controller файлд нэгтгэх цаг болжээ.

Дүгнэж хэлэхэд дараахь бүрэлдэхүүн хэсгүүдийг ашигласан болно.

  • Оролтын тоолуур (updown_counter)
  • Цаг хуваагч (counter_clkDiv)
  • LED цаг хуваагч (led_clkDiv)
  • Долоон сегментийн дэлгэцийн драйвер (sseg_dec) (хавсаргасан файл)

Долоон сегментийн дэлгэцийн драйверын талаар өмнө нь яригдаагүй байсан, учир нь бид VHDL файлыг доктор Брайан Малигаас урт, нарийн төвөгтэй кодын улмаас зээлсэн. Үндсэндээ бидний хийдэг товчлуурын оролтыг Basys 3 самбар дээрх долоон сегментийн дэлгэц рүү чиглүүлж, гэрэлтүүлгийн түвшинг мэдэх боломжтой болно.

Урагшлахад LED хянагч нь долоон сегментийн дэлгэц болон LED чийдэнгийн гэрэлтүүлгийн түвшинг нэгэн зэрэг хянадаг тоог багасгах эсвэл багасгахын тулд товшуур ашигладаг.

аж ахуйн нэгжийн тоолуур нь Port (clk: STD_LOGIC; up_enable: STD_LOGIC; in_enable: in STD_LOGIC; SEGMENTS: out STD_LOGIC_VECTOR (7 downto 0); DISP_EN: out STD_LOGIC_VECTOR (3 downto 0); led_LOGIC: STD_LOGIC) төгсгөлийн тоолуур; Архитектурын тооллогын зан төлөв нь бүрэлдэхүүн хэсэг юм. up_enable: STD_LOGIC дээр); төгсгөлийн бүрэлдэхүүн хэсэг updown_counter; counter_clkDiv бүрэлдэхүүн хэсэг нь Порт (clk: in std_logic; sclk: out std_logic); төгсгөлийн бүрэлдэхүүн хэсэг counter_clkDiv; sseg_dec бүрэлдэхүүн хэсэг нь Порт (ALU_VAL: std_logic_vector (7 уруу 0 хүртэл); SIGN: std_logic дотор; VALID: std_logic дотор; CLK: std_logic дотор; DISP_EN: std_logic_vector (3 доошоо 0); SEGMENTS: гадагш std_logic); төгсгөлийн бүрэлдэхүүн хэсэг sseg_dec; led_clkDiv бүрэлдэхүүн хэсэг нь Порт (одоогийн байдал: STD_LOGIC_VECTOR (3 -аас 0 хүртэл); clk: STD_LOGIC; led_clk: STD_LOGIC -ээс гадагш); төгсгөлийн бүрэлдэхүүн хэсэг led_clkDiv; дохио present_state: STD_LOGIC_VECTOR (3 хүртэл 0 хүртэл): = "0000"; next_state дохио: STD_LOGIC_VECTOR (3 хүртэл 0 хүртэл): = "0000"; өмнөх дохио дохио Alu_Val: STD_LOGIC_VECTOR (7 доош 0 хүртэл); дохио sclk: STD_LOGIC; эхлэх Alu_Val (7 -оос 4 хүртэл) <= "0000"; Alu_Val (3 -аас 0 хүртэл) <= одоогийн байдал; next_state (0) <= үгүй (present_state (0)); next_state (1) <= present_state (0) xor present_state (1); next_state (2) <= (present_state (0) and present_state (1)) xor present_state (2); next_state (3) <= (present_state (0) and present_state (1) and present_state (2)) xor present_state (3); previous_state (0) <= үгүй (present_state (0)); өмнөх_үй (1) <= өнөөгийн байдал (0) xnor өнөөгийн байдал (1); өмнөх_шат (2) <= (өнөөгийн_стат (0) эсвэл одоогийн_стат (1)) эсвэл одоогийн_шат (2); previous_state (3) sclk, next_state => next_state, previous_state => previous_state, up_enable => up_enable, down_enable => down_enable, present_state => present_state); дэлгэц: sseg_dec порт газрын зураг (ALU_VAL => Alu_Val, SIGN => '0', VALID => '1', CLK => clk, DISP_EN => DISP_EN, SEGMENTS => SEGMENTS); led_div: led_clkDiv порт газрын зураг (clk => clk, present_state => present_state, led_clk => led_clk); clk_div: counter_clkDiv портын зураг (clk => clk, sclk => sclk); зан үйлийн төгсгөл;

Алхам 4: Хязгаарлалт ба чуулганыг бий болгох

Хязгаарлалтууд

Basys 3 самбарыг зөв тохируулах, програмчлахын тулд бид эхлээд энэ алхамд хавсаргасан хязгаарлалтын файлыг тохируулах ёстой. Дараах тохиргоог тохируулсан болно.

Товчлуурууд

  • T18 -ийг "up_enable" болгож өөрчилсөн (тод байдлыг нэмэгдүүлэх)
  • U17 -г "down_enable" болгож өөрчилсөн (тод байдлыг багасгах)

7 сегментийн дэлгэц

  • W7, W6, U8, V8, U5, V5, U7, V7 нь нэг дэлгэцийн сегмент бүрийг илэрхийлдэг
  • U2, U4, V4, W4 нь харуулсан анод бүрийг илэрхийлдэг (бидний хамгийн их тоо 15 байдаг тул 2 нь л идэвхтэй байдаг)

PMOD толгой JC

JC7 бол бид LED чийдэнгийн нэг утсыг холбож, нөгөө утас нь GROUND руу ордог

Үүнийг бүгдийг тохируулсны дараа хийх ёстой зүйл бол bitstream (Vivado -ийг ашиглаж байгаа ямар ч програм хангамжаар) үүсгэх, самбараа програмчлах, тэсрэлт хийх явдал юм! Та өөртөө ажлын самбар авсан.

Тэмдэглэл: Зүү зураглалыг Basys 3 мэдээллийн хуудаснаас эндээс олж болно.

Чуулган

Алхам 5: Диммер унтраалгыг ашиглах

Хэрэв бүх зүйл сайн байвал та бүрэн ажиллагаатай dimmer системтэй байх ёстой. Дүгнэж хэлэхэд дээд товчлуурыг дарах нь таны гэрлийг нэмэгдүүлэх болно (15 хүртэл), доош товчлуурыг дарахад таны гэрэл багасах болно (0 хүртэл). Таны одоо тайвширсан хараа бүх зүйл сайхан болно гэж найдаж байна!

Зөвлөмж болгож буй: