色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>用于MiniZed的7段LED顯示硬件和VHDL模塊

用于MiniZed的7段LED顯示硬件和VHDL模塊

2022-12-01 | zip | 0.18 MB | 次下載 | 免費(fèi)

資料介紹

描述

介紹

該項(xiàng)目是為 MiniZed 電機(jī)控制構(gòu)建挑戰(zhàn)而創(chuàng)建的,最終應(yīng)用程序是在Adam Taylor的Mini But Mighty項(xiàng)目上構(gòu)建的該項(xiàng)目是一個(gè) VHDL 參考設(shè)計(jì),用于在可編程邏輯中創(chuàng)建多路復(fù)用 7 段顯示硬件驅(qū)動(dòng)程序,并展示了如何在沒有大量按鈕/開關(guān)和 LED 的小型電路板(例如 MiniZed)上使用和測(cè)試 HDL 硬件模塊。該示例介紹了將創(chuàng)建的 VHDL 硬件模塊實(shí)現(xiàn)到 Mini But Mighty 項(xiàng)目中,以在 7 段顯示器上顯示實(shí)際的 PWM 占空比。

硬件

為了這個(gè)項(xiàng)目的需要,我為 5641AS 四位 7 段 LED 顯示器創(chuàng)建了一個(gè)手工制作PCB段線通過300歐姆電阻連接到表頭,每個(gè)顯示器的共陰極由2N7000 N-MOS晶體管驅(qū)動(dòng),其柵極通過10k歐姆電阻連接到表頭并通過220k歐姆電阻接地。一個(gè) 13 針接頭(8 段、4 個(gè)公共陰極、1 個(gè) GND)通過 Arduino 連接器連接到 MiniZed。

pYYBAGOII_OAQBgkAAOK5Dw1UuI926.jpg
頂視圖
?
poYBAGOII_aAOTpYAASz_4-88zQ641.jpg
底視圖
?

附板子原理圖和LED顯示屏內(nèi)部接線圖。但是,您可以使用其他具有類似硬件的顯示器和電路板。

創(chuàng)建 VHDL 7 段 LCD 顯示驅(qū)動(dòng)程序

我從框圖開始。輸入數(shù)據(jù)是一個(gè) 16 位數(shù)字,其中每 4 位是一個(gè)顯示器的編號(hào),因此最低有效 4 位是從右開始第一個(gè)顯示器的數(shù)字,連續(xù)的 4 位是下一個(gè)顯示器,最多 4 個(gè)最高有效位是從左數(shù)第 4 個(gè)顯示屏上的數(shù)字。因此 16 位二進(jìn)制數(shù) 0b0011001000010000 將顯示在顯示器 3210 上。第二個(gè) 4 位輸入用于顯示小數(shù)精度,其中最低有效位是從左數(shù)第一個(gè)顯示器上的點(diǎn),最高有效位是從左數(shù)第四個(gè)顯示器。所以 4 位二進(jìn)制數(shù) 0b0001 只會(huì)在左起第一個(gè)顯示器上顯示點(diǎn)。其他輸入是時(shí)鐘和復(fù)位,該模塊設(shè)計(jì)用于默認(rèn) 50 MHz 時(shí)鐘,并提供約 800Hz(每個(gè)數(shù)字 200 Hz)的顯示刷新率的結(jié)果。

pYYBAGOII_iAIlXhAAAvdAzdjUw385.jpg
框圖
?

選擇器.vhd

該模塊分頻并控制多路復(fù)用器,2 位輸出地址 00 用于第一個(gè)顯示,11 用于最后一個(gè)顯示。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx leaf cells in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity selector is
Port
(
clk, reset: in std_logic;
sel: out std_logic_vector(1 downto 0)
);
end selector;
architecture Behavioral of selector is
signal state, next_state: unsigned(17 downto 0);
begin
--register
process(clk, reset)
begin
if reset='1' then
state <= (others=>'0');
elsif (clk'event and clk='1') then
state <= next_state;
end if;
end process;
--next state logic
next_state <= state + 1;
--output clk/2^16 for 50MHz around 800 Hz out
sel <= std_logic_vector(state(17 downto 16));
end Behavioral;

mux_4_to_1.vhd

該模塊在當(dāng)前控制的 LED 顯示屏上設(shè)置點(diǎn)段。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx leaf cells in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity mux_4_to_1 is
Port
(
input  : in std_logic_vector (3 downto 0);
sw     : in std_logic_vector (1 downto 0);
output : out std_logic
);
end mux_4_to_1;
architecture Behavioral of mux_4_to_1 is
begin
with sw select
output <=
input(0)  when "00",
input(1)  when "01",
input(2)  when "10",
input(3)  when "11",
'0' when others;
end Behavioral;

mux_16_to_1.vhd

該模塊為當(dāng)前控制的 LED 顯示屏設(shè)置 16 位輸入的 4 位輸出。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx leaf cells in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity mux_16_to_4 is
Port
(
input  : in std_logic_vector (15 downto 0);
sw     : in std_logic_vector (1 downto 0);
output : out std_logic_vector (3 downto 0)
);
end mux_16_to_4;
architecture Behavioral of mux_16_to_4 is
begin
with sw select
output(3 downto 0) <=
input(3 downto 0)   when "00",
input(7 downto 4)   when "01",
input(11 downto 8)  when "10",
input(15 downto 12) when "11",
"0000" when others;
end Behavioral;

hex4b_to_lcd.vhd

將 4 位輸入數(shù)據(jù)轉(zhuǎn)換為當(dāng)前控制的 LED 顯示屏的輸出。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx leaf cells in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity hex4b_to_lcd is
Port
(
input:  in  std_logic_vector(3 downto 0);
dot:    in  std_logic;
output: out std_logic_vector(7 downto 0)
);
end hex4b_to_lcd;
architecture Behavioral of hex4b_to_lcd is
begin
with input select
output(6 downto 0) <=
"0111111" when "0000",
"0000110" when "0001",
"1011011" when "0010",
"1001111" when "0011",
"1100110" when "0100",
"1101101" when "0101",
"1111101" when "0110",
"0000111" when "0111",
"1111111" when "1000",
"1101111" when "1001",
"1110111" when "1010", --a
"1111100" when "1011", --b
"0111001" when "1100", --c
"1011110" when "1101", --d
"1111001" when "1110", --e
"1110001" when others; --f
output(7) <= dot;
end Behavioral;

seg_mux_4.vhd

模塊切換當(dāng)前使用的 LED 顯示。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx leaf cells in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity seg_mux_4 is
Port
(
input:  in  std_logic_vector (1 downto 0);
enable: in  std_logic;
output: out std_logic_vector (3 downto 0)
);
end seg_mux_4;
architecture Behavioral of seg_mux_4 is
begin
output <= "0000" when (enable = '0') else
"0001" when (input = "00") else
"0010" when (input = "01") else
"0100" when (input = "10") else
"1000" when (input = "11") else
"0000";
end Behavioral;

主.vhd

這是將上述所有模塊組合成 7 段顯示驅(qū)動(dòng)程序的頂層模塊。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;
-- Uncomment the following library declaration if instantiating
-- any Xilinx leaf cells in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity main is
Port
(
clk:       in std_logic;
dat_in:    in std_logic_vector(15 downto 0);
dp:        in std_logic_vector(3 downto 0);
reset    : in std_logic;
lcd_out:    out std_logic_vector (7 downto 0);
seg_out:    out std_logic_vector (3 downto 0)
);
end main;
architecture Behavioral of main is
signal num_sel: std_logic_vector (1 downto 0);
signal num_out: std_logic_vector (3 downto 0);
signal dp_out:  std_logic;
begin
u1: entity work.selector
port map(clk=>clk, reset=>reset, sel=>num_sel);
u2: entity work.mux_16_to_4
port map(input=>dat_in, sw=>num_sel, output=>num_out);
u3: entity work.seg_mux_4
port map(input=>num_sel, enable=>'1', output=>seg_out);
u4: entity work.mux_4_to_1
port map(input=>dp, sw=>num_sel, output=>dp_out);
u5: entity work.hex4b_to_lcd
port map(input=>num_out, dot=>dp_out, output=>lcd_out);
end Behavioral;

包含所有模塊的 VHDL 代碼文件以供使用和分析。

VHDL 模塊在 Mini But Mighty 項(xiàng)目中的實(shí)現(xiàn)

所以模塊是使用 VHDL 創(chuàng)建的,但是如何在 MiniZed 板上測(cè)試它呢?較大的 FPGA 板通常有 8 或 16 個(gè)輸入開關(guān)和 LED,用于測(cè)試在可編程邏輯中實(shí)現(xiàn)的硬件模塊的輸入和輸出。好的,我們?cè)?MiniZed 板上沒有足夠的 LED 和開關(guān),但我們有更多的東西,Zynq 7000 SoC,它有一個(gè) ARM Cortex - A9 處理器系統(tǒng) (PS) 和 Xilinx Artix 可編程邏輯 (PL)。我們可以使用和組合這些資源,在芯片內(nèi)部創(chuàng)建一個(gè)靈活的測(cè)試環(huán)境,并擁有我們需要的盡可能多的輸入和輸出。這將通過將創(chuàng)建的 VHDL 模塊實(shí)施到 Mini But Mighty 項(xiàng)目中來呈現(xiàn)。

起點(diǎn)將是Mini But Mighty項(xiàng)目。

poYBAGOII_qAY9FZAABMiXGN0V4916.png
迷你但強(qiáng)大的塊設(shè)計(jì)
?

Vivado 硬件構(gòu)建

第一步是將我們創(chuàng)建的源添加到項(xiàng)目中。為此,我們使用選項(xiàng)卡源和“加號(hào)”按鈕。

poYBAGOII_2AYDDyAABdpvKzRGc216.png
?

在下一步中,我們選擇“添加或創(chuàng)建設(shè)計(jì)源”。

pYYBAGOII_-AH50kAABlmanzJas478.png
?

然后單擊“添加文件”按鈕。

poYBAGOIJAKAJ2JtAACAQbBslVQ691.png
?

我們選擇我們的 VHDL 文件并單擊“確定”。

poYBAGOIJAWALAlTAADp9mXveck656.png
?

現(xiàn)在在添加源窗口中我們可以看到我們的 VHDL 文件。確保選中“將源代碼復(fù)制到項(xiàng)目中”,然后接受添加的源代碼并轉(zhuǎn)到下一步。

pYYBAGOIJAiAQiHrAAD8P17K-f0776.png
?

源窗口應(yīng)該是這樣的。

pYYBAGOIJAqANJ2uAABB28LS_RA642.png
?

現(xiàn)在在塊空間的空白處單擊鼠標(biāo)右鍵并選擇“添加模塊”。

poYBAGOIJA2AM1CWAABDWDaU93A698.png
?

在新窗口中選擇“main.vhd”并單擊“確定”。

poYBAGOIJA-AXrG8AABM4QstBks467.png
?

現(xiàn)在在塊設(shè)計(jì)中我們看到創(chuàng)建的 VHDL 模塊。

poYBAGOIJBGALPn6AACn3d8j9vY993.png
?

這個(gè)模塊是簡(jiǎn)單的 RTL 塊,我們需要一些 I/O 來使用它。我們將使用 axi_gpio IP,但首先我們需要配置處理系統(tǒng)。為此,雙擊 Zynq 塊并選擇 PS-PL 配置選項(xiàng)卡。

pYYBAGOIJBSAIV8dAADShqdF52c050.png
?

單擊“Axi Non Secure Enablement”,然后單擊“GP Master AXI Interface”并選擇“M AXI GP0 interface”并確認(rèn)更改。

pYYBAGOIJBeAaEG6AAD8NwOdVaM123.png
?

添加 AXI GPIO IP 是通過單擊塊設(shè)計(jì)中的“加號(hào)”按鈕,在搜索窗口中鍵入“gpio”并選擇“AXI GPIO”來完成的。

poYBAGOIJBmAVXOkAAAhi0U7x20869.png
?

我們還需要兩個(gè)“切片”塊,因此重復(fù)最后一步兩次,在搜索框中鍵入“切片”。

poYBAGOIJBuAb1b9AAAo3W1j60g713.png
?

現(xiàn)在我們有了所有的元素,我們需要配置其中的一些。首先是 AXI GPIO,在 IP 設(shè)置配置選項(xiàng)卡中手動(dòng)設(shè)置 20 位寬度。

pYYBAGOIJB6AYvm5AACtILLys_c417.png
?

為 20 位輸入寬度和 15 到 0 輸出配置第一個(gè)切片,為 20 位輸入寬度和 19 到 16 輸出配置第二個(gè)切片。

poYBAGOIJCGAE_MEAABfwTWUwG4393.png
?
poYBAGOIJCOAb6mfAABZsHCrU9M415.png
?

所有塊都已配置,因此應(yīng)建立它們之間的連接。為此,首先單擊“運(yùn)行連接自動(dòng)化”。

poYBAGOIJCWAVUzwAAAOvLNZOnA101.png
?

并選擇“All automation”(FCLK0 默認(rèn)配置為 50MHz,它是我們的 RTL 塊所需的輸入頻率)。

pYYBAGOIJCiAc-D8AADK0B9R5iA759.png
?

默認(rèn)情況下,Vivado 會(huì)將 VHDL 模塊復(fù)位連接到 peripheral_aresten,我們需要更正這一點(diǎn)并將復(fù)位連接到 peripheral_reset。

poYBAGOIJCqACSHXAAD6tnM_XxI884.png
?

現(xiàn)在我們將切片塊連接到 axi_gpio_0 并將切片輸出連接到相應(yīng)的 RTL 模塊輸入。

pYYBAGOIJC2AZNcFAADiq-isgrs736.png
?

最后一步是使 RTL 模塊輸出到外部并保存塊設(shè)計(jì)。最終的塊設(shè)計(jì)如下。

pYYBAGOIJC-AGT5ZAADap_KLc4U277.png
?

在實(shí)施、合成和比特流生成之前,必須修改約束條件。顯示器的公共部分連接到 Arduino IO0 到 IO7,每個(gè)顯示器的公共陰極連接到 IO8 到 IO11。因此,我們必須在 io.xdc 文件中添加以下行。

set_property PACKAGE_PIN R8  [get_ports {lcd_out_0[7]}];  # "R8.ARDUINO_IO0"
set_property PACKAGE_PIN P8  [get_ports {lcd_out_0[6]}];  # "P8.ARDUINO_IO1"
set_property PACKAGE_PIN P9  [get_ports {lcd_out_0[5]}];  # "P9.ARDUINO_IO2"
set_property PACKAGE_PIN R7  [get_ports {lcd_out_0[4]}];  # "R7.ARDUINO_IO3"
set_property PACKAGE_PIN N7  [get_ports {lcd_out_0[3]}];  # "N7.ARDUINO_IO4"
set_property PACKAGE_PIN R10 [get_ports {lcd_out_0[2]}];  # "R10.ARDUINO_IO5"
set_property PACKAGE_PIN P10 [get_ports {lcd_out_0[1]}];  # "P10.ARDUINO_IO6"
set_property PACKAGE_PIN N8  [get_ports {lcd_out_0[0]}];  # "N8.ARDUINO_IO7"
set_property PACKAGE_PIN M9  [get_ports {seg_out_0[0]}];  # "M9.ARDUINO_IO8"
set_property PACKAGE_PIN N9  [get_ports {seg_out_0[1]}];  # "N9.ARDUINO_IO9"
set_property PACKAGE_PIN M10 [get_ports {seg_out_0[2]}];  # "M10.ARDUINO_IO10"
set_property PACKAGE_PIN M11 [get_ports {seg_out_0[3]}];  # "M11.ARDUINO_IO11"
set_property IOSTANDARD LVCMOS33 [get_ports -of_objects [get_iobanks 34]];

一旦創(chuàng)建了包裝器和約束,我們就可以實(shí)施設(shè)計(jì)了。選擇 Generate BitStream Option 并在設(shè)計(jì)編譯時(shí)等待幾分鐘。

poYBAGOIJDKAACDTAABWPKon3Tw538.png
?

實(shí)施設(shè)計(jì)

一旦比特流可用,下一步就是導(dǎo)出 XSA 以在 Vitis 中使用。在文件下選擇導(dǎo)出-> 導(dǎo)出硬件。

poYBAGOIJDSAfpW2AACF-5FAKF8482.png
?

導(dǎo)出硬件

在出現(xiàn)的對(duì)話框中選擇包含比特流選項(xiàng)

pYYBAGOIJDaARO36AABjI2O6sEY322.png
?

導(dǎo)出 XSA

我們現(xiàn)在準(zhǔn)備好打開 Vitis 并更新軟件應(yīng)用程序

Vitis 軟件構(gòu)建

使用“工具”選項(xiàng)卡啟動(dòng) Vitis 并選擇 Mini But Mighty Workspace。現(xiàn)在我們必須更新硬件平臺(tái)。在 design_1_wrapper 上單擊鼠標(biāo)右鍵并選擇 Update Hardware Specification。

pYYBAGOIJDiAYMMuAABXFDFMwvI862.png
?

在新打開的窗口中,選擇更新的 XSA 文件并確認(rèn)。

poYBAGOIJDuAEJ19AABHIPxt6rI580.png
?

點(diǎn)擊build按鈕,等待編譯結(jié)束,然后打開platform.spr文件查看配置,axi_gpio_0應(yīng)該在Hardware Specification Address Map for processor list中。

pYYBAGOIJD-AMCgKAAFd5hFq6aU163.png
?

現(xiàn)在我們將修改 helloworld.c 應(yīng)用程序以在我們的顯示器上顯示實(shí)際的 PWM。首先,我們需要為 AXI GPIO 添加額外的庫:

#include "xparameters.h"
#include "xgpio.h"

and定義:

#define GPIO_EXAMPLE_DEVICE_ID  XPAR_GPIO_0_DEVICE_ID
#define GPIO_CHANNEL 1

和 GPIO 驅(qū)動(dòng)程序?qū)嵗?/font>

XGpio GpioPL; /* The Instance of the GPIO Driver */

我們的 7 段 LED 顯示和硬件驅(qū)動(dòng)模塊默認(rèn)調(diào)整為十六進(jìn)制數(shù)。因此,我們需要?jiǎng)?chuàng)建一個(gè)函數(shù),以便在我們的軟件應(yīng)用程序中輕松使用十進(jìn)制數(shù):

uint8_t set_7seg_dec(uint16_t dec_num, uint8_t dp)
{
uint32_t seg7_out;
seg7_out = 0; // set 0 output
seg7_out = dp<<16; // set decimal point
seg7_out  |= (seg7_out & LED_MASK) | (dec_num % 10)*0x01;
seg7_out  |= (seg7_out & LED_MASK) | (dec_num / 10)%10*0x10;
seg7_out  |= (seg7_out & LED_MASK) | (dec_num / 100)%10*0x100;
seg7_out  |= (seg7_out & LED_MASK) | (dec_num / 1000)%10*0x1000;
XGpio_DiscreteWrite(&GpioPL, GPIO_CHANNEL, seg7_out);
return 0;
}

dec_num - 是 16 位無符號(hào)整數(shù),

dp - 是 8 位 usigned int 數(shù)字,其中 4 個(gè)最低有效位用于小數(shù)點(diǎn),例如 decimal 2 = 0b00000010 將在第二個(gè)顯示形式右側(cè)顯示點(diǎn)。

LED_MASK 是 0x0000FFFF 十六進(jìn)制數(shù),用于屏蔽 32 位 seg7_out 變量的小數(shù)點(diǎn)部分。

最后要做的是修改用于設(shè)置輸出 PWM 占空比的函數(shù)。我們通過將 set_7seg_function 添加到 set_pwm 函數(shù)并使用“cycle”變量來實(shí)現(xiàn)。變量乘以十是因?yàn)槲覀冊(cè)诘诙€(gè)顯示器上設(shè)置了小數(shù)點(diǎn):

void set_pwm(u32 cycle) {
u32 MatchValue;
set_7seg_dec(cycle*10, 2);
MatchValue = (TimerSetup->Interval * cycle) / 100;
XTtcPs_SetMatchValue(&ttcTimer, 0, MatchValue);
}

下面是修改后的 helloworld.c 的完整代碼,該文件也可以在 github 存儲(chǔ)庫中找到。

#include 
#include "platform.h"
#include "xparameters.h"
#include "xil_printf.h"
#include "xgpiops.h"
#include "sleep.h"
#include "xil_exception.h"
#include "xttcps.h"
#include "xscugic.h"
#include "xgpio.h"
/*
* The following constants map to the XPAR parameters created in the
* xparameters.h file. They are defined here such that a user can easily
* change all the needed parameters in one place.
*/
#define GPIO_EXAMPLE_DEVICE_ID  XPAR_GPIO_0_DEVICE_ID
/*
* The following constant is used to determine which channel of the GPIO is
* used for the LED if there are 2 channels supported.
*/
#define GPIO_CHANNEL 1
/*
* The following constant is used to wait after an LED is turned on to make
* sure that it is visible to the human eye.  This constant might need to be
* tuned for faster or slower processor speeds.
*/
#define LOOP_DELAY     1000000
#define LED_MASK 0x0FFFF
#define GPIO_DEVICE_ID  	XPAR_XGPIOPS_0_DEVICE_ID
#define INTC_DEVICE_ID		XPAR_SCUGIC_0_DEVICE_ID
#define	TICK_TIMER_FREQ_HZ	100
#define TTC_TICK_DEVICE_ID	XPAR_XTTCPS_0_DEVICE_ID
#define TTC_TICK_INTR_ID	XPAR_XTTCPS_0_INTR
static void TickHandler(void *CallBackRef);
int SetupTicker(XTtcPs *TtcPsInst, u16 DeviceID, u16 TtcTickIntrID,
XScuGic *InterruptController);
static int SetupInterruptSystem(u16 IntcDeviceID, XScuGic *IntcInstancePtr);
int SetupTimer(u16 DeviceID, XTtcPs *TtcPsInst);
void set_pwm(u32 cycle);
void display_menu();
typedef struct {
u32 OutputHz; /* Output frequency */
XInterval Interval; /* Interval value */
u8 Prescaler; /* Prescaler value */
u16 Options; /* Option settings */
} TmrCntrSetup;
/*
* The following are declared globally so they are zeroed and so they are
* easily accessible from a debugger
*/
XGpio GpioPL; /* The Instance of the GPIO Driver */
XGpioPs Gpio;
XGpioPs_Config *ConfigPtr;
XTtcPs_Config *TtcConfig;
XTtcPs ttcTimer;
TmrCntrSetup *TimerSetup;
XScuGic InterruptController; /* Interrupt controller instance */
XTtcPs TtcPsInst;
u32 MatchValue;
static TmrCntrSetup SettingsTable = { TICK_TIMER_FREQ_HZ, 0, 0, 0 };
uint8_t set_7seg_dec(uint16_t dec_num, uint8_t dp)
{
uint32_t seg7_out;
seg7_out = 0; // set 0 output
seg7_out = dp<<16; // set decimal point
seg7_out  |= (seg7_out & LED_MASK) | (dec_num % 10)*0x01;
seg7_out  |= (seg7_out & LED_MASK) | (dec_num / 10)%10*0x10;
seg7_out  |= (seg7_out & LED_MASK) | (dec_num / 100)%10*0x100;
seg7_out  |= (seg7_out & LED_MASK) | (dec_num / 1000)%10*0x1000;
XGpio_DiscreteWrite(&GpioPL, GPIO_CHANNEL, seg7_out);
return 0;
}
int main() {
u8 DutyCycle;
char key_input;
int Status;
volatile int Delay;
uint32_t byte, l_byte;
uint32_t lcd_dec=0;
init_platform();
TmrCntrSetup SettingsTable = { TICK_TIMER_FREQ_HZ, 0, 0, 0 };
ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
XGpioPs_SetDirectionPin(&Gpio, 54, 1);
XGpioPs_SetOutputEnablePin(&Gpio, 54, 1);
XGpioPs_WritePin(&Gpio, 54, 0x1);
printf("www.adiuvoengineering.com\n\r");
printf("DC Motor Control Example\n\r");
SetupInterruptSystem(INTC_DEVICE_ID, &InterruptController);
SetupTicker(&ttcTimer, TTC_TICK_DEVICE_ID, TTC_TICK_INTR_ID,
&InterruptController);
byte = 0x20000;
/* Initialize the GPIO driver */
Status = XGpio_Initialize(&GpioPL, GPIO_EXAMPLE_DEVICE_ID);
if (Status != XST_SUCCESS) {
xil_printf("Gpio Initialization Failed\r\n");
return XST_FAILURE;
}
print("Write byte.\n\r");
/* Set the direction for all signals as  output */
XGpio_SetDataDirection(&GpioPL, GPIO_CHANNEL, 0x00);
/* Write inital data */
XGpio_DiscreteWrite(&GpioPL, GPIO_CHANNEL, byte);
//	while (1) {
//
//		if (lcd_dec == 1000) lcd_dec = 0;
////		byte = 0x20000;
//		lcd_dec ++;
//		set_7seg_dec(lcd_dec, 0x02);
////		byte |= (byte & 0x0ffff) | (lcd_dec % 10)*0x01;
////		byte |= (byte & 0x0ffff) | (lcd_dec / 10)%10*0x10;
////		byte |= (byte & 0x0ffff) | (lcd_dec / 100)%10*0x100;
////		byte |= (byte & 0x0ffff) | (lcd_dec / 1000)%10*0x1000;
////
////
////		XGpio_DiscreteWrite(&GpioPL, GPIO_CHANNEL, byte);
//
//
////		byte = inbyte(); // get byte from stdin (uart1)
////
////		if(l_byte != byte)
////		{
////			/* Set counter as output value of port */
////			XGpio_DiscreteWrite(&Gpio, LED_CHANNEL, byte);
////			/*Send byte to stdout*/
////			xil_printf("0x%02x\r\n", byte);
////			/*Save last value*/
////			l_byte = byte;
////		}
//
////		/* Wait a small amount of time so the LED is visible */
////		for (Delay = 0; Delay < LED_DELAY; Delay++);
////
////		/* Clear the LED bit */
////		XGpio_DiscreteClear(&Gpio, LED_CHANNEL, LED);
//
//		/* Wait a small amount of time  */
//		for (Delay = 0; Delay < LOOP_DELAY; Delay++);
//	}
while (1) {
display_menu();
read(1, (char*) &key_input, 1);
printf("Echo %c\n\r", key_input);
switch (key_input) {
//			case 0: // forward
//
//				set_pwm(0);
//				usleep(1000000);
//
//				set_pwm(DutyCycle);
//			break;
//			case 1: //reverse
//
//				//set_pwm(0);
//				//usleep(1000000);
//				//XGpioPs_WritePin(&Gpio, 54, 0x1);
//				//set_pwm(DutyCycle);
//			break;
case '1': //stop
set_pwm(0);
break;
case '2': //25%
printf("25%\n\r");
DutyCycle = 25;
set_pwm(DutyCycle);
break;
case '3': //33%
DutyCycle = 33;
set_pwm(DutyCycle);
break;
case '4': //50%
DutyCycle = 50;
set_pwm(DutyCycle);
break;
case '5': //66%
DutyCycle = 66;
set_pwm(DutyCycle);
break;
case '6': //75%
DutyCycle = 75;
set_pwm(DutyCycle);
break;
case '7': //100%
DutyCycle = 100;
set_pwm(DutyCycle);
break;
}
}
cleanup_platform();
return 0;
}
void display_menu() {
//Clear the screen
printf("\033[2J");
//Display the main menu
printf("*******************************************\n");
printf("****      www.adiuvoengineering.com    ****\n");
printf("****      Motor Control Example        ****\n");
printf("*******************************************\n");
printf("\n");
printf("   MM10 Motor Control   \n");
printf("------------------------------------------\n");
printf("\n");
printf("Select a Speed:\n");
printf("  (1)   - Stop\n");
printf("  (2)   - 25%\n");
printf("  (3)   - 33%\n");
printf("  (4)   - 50%\n");
printf("  (5)   - 66%\n");
printf("  (6)   - 75%\n");
printf("  (7)   - 100%\n");
printf("\n");
}
void set_pwm(u32 cycle) {
u32 MatchValue;
set_7seg_dec(cycle*10, 2);
MatchValue = (TimerSetup->Interval * cycle) / 100;
XTtcPs_SetMatchValue(&ttcTimer, 0, MatchValue);
}
int SetupTicker(XTtcPs *TtcPsInst, u16 DeviceID, u16 TtcTickIntrID,
XScuGic *InterruptController) {
int Status;
TmrCntrSetup *TimerSetup;
XTtcPs *TtcPsTick;
TimerSetup = &SettingsTable;
TimerSetup->Options |= (XTTCPS_OPTION_INTERVAL_MODE |
XTTCPS_OPTION_MATCH_MODE | XTTCPS_OPTION_WAVE_POLARITY);
Status = SetupTimer(DeviceID, TtcPsInst);
if (Status != XST_SUCCESS) {
return Status;
}
TtcPsTick = TtcPsInst;
Status = XScuGic_Connect(InterruptController, TtcTickIntrID,
(Xil_InterruptHandler) TickHandler, (void *) TtcPsTick);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
XScuGic_Enable(InterruptController, TtcTickIntrID);
XTtcPs_EnableInterrupts(TtcPsTick, XTTCPS_IXR_INTERVAL_MASK);
XTtcPs_Start(TtcPsTick);
return Status;
}
static int SetupInterruptSystem(u16 IntcDeviceID, XScuGic *IntcInstancePtr) {
int Status;
XScuGic_Config *IntcConfig;
IntcConfig = XScuGic_LookupConfig(IntcDeviceID);
if (NULL == IntcConfig) {
return XST_FAILURE;
}
Status = XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig,
IntcConfig->CpuBaseAddress);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,
(Xil_ExceptionHandler) XScuGic_InterruptHandler, IntcInstancePtr);
Xil_ExceptionEnable();
return XST_SUCCESS;
}
int SetupTimer(u16 DeviceID, XTtcPs *TtcPsInst) {
int Status;
XTtcPs_Config *Config;
XTtcPs *Timer;
TmrCntrSetup *TimerSetup;
TimerSetup = &SettingsTable;
Timer = TtcPsInst;
Config = XTtcPs_LookupConfig(DeviceID);
if (NULL == Config) {
return XST_FAILURE;
}
Status = XTtcPs_CfgInitialize(Timer, Config, Config->BaseAddress);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
XTtcPs_SetOptions(Timer, TimerSetup->Options);
XTtcPs_CalcIntervalFromFreq(Timer, TimerSetup->OutputHz,
&(TimerSetup->Interval), &(TimerSetup->Prescaler));
XTtcPs_SetInterval(Timer, TimerSetup->Interval);
XTtcPs_SetPrescaler(Timer, TimerSetup->Prescaler);
return XST_SUCCESS;
}
static void TickHandler(void *CallBackRef) {
u32 StatusEvent;
/*
* Read the interrupt status, then write it back to clear the interrupt.
*/
StatusEvent = XTtcPs_GetInterruptStatus((XTtcPs * )CallBackRef);
XTtcPs_ClearInterruptStatus((XTtcPs * )CallBackRef, StatusEvent);
//printf("timer\n\r");
/*update the flag if interrupt has been occurred*/
//UpdateFlag = TRUE;
}

之后我們必須保存文件并構(gòu)建項(xiàng)目。

pYYBAGOIJEKAIeLdAABPhNBnKT0882.png
?

然后,如果沒有錯(cuò)誤,請(qǐng)單擊“運(yùn)行”按鈕并嘗試在終端中鍵入數(shù)字以更改 Pmod HB3 輸出上的脈沖寬度。實(shí)際占空比將顯示在 7 段 LED 顯示屏上。

pYYBAGOIJEqAcukYAABDsTDTyM4292.png
?
poYBAGOIJEyAcwFoAADsp8SkhH4120.png
?

包起來

該項(xiàng)目通過四路 7 段 LED 顯示示例和 Mini But Mighty 項(xiàng)目的更新展示了我們?nèi)绾问褂?AXI GPIO IP 將我們自己的 VHDL 或其他 HDL 模塊用于 Vivado 和 Vitis。可編程邏輯和處理系統(tǒng)的結(jié)合是強(qiáng)大的,唯一的限制是想象力。您可以對(duì)另一個(gè) HDL 模塊使用相同的方法。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1使用單片機(jī)實(shí)現(xiàn)七人表決器的程序和仿真資料免費(fèi)下載
  2. 2.96 MB   |  44次下載  |  免費(fèi)
  3. 2Keysight B1500A 半導(dǎo)體器件分析儀用戶手冊(cè)、說明書 (中文)
  4. 19.00 MB  |  4次下載  |  免費(fèi)
  5. 3BT134雙向可控硅手冊(cè)
  6. 1.74 MB   |  2次下載  |  1 積分
  7. 4一種新型高效率的服務(wù)器電源系統(tǒng)
  8. 0.85 MB   |  1次下載  |  1 積分
  9. 5臺(tái)達(dá)VFD-M系列變頻器驅(qū)動(dòng)板原廠原理圖
  10. 0.17 MB   |  1次下載  |  免費(fèi)
  11. 6WTS-100(1.1) UWB 信標(biāo)定位系統(tǒng) 彩頁
  12. 540.48 KB  |  1次下載  |  免費(fèi)
  13. 7雙向DC-DC轉(zhuǎn)換器用戶指南
  14. 2.98MB   |  1次下載  |  免費(fèi)
  15. 8聯(lián)想E46L DAOLL6筆記本電腦圖紙
  16. 1.10 MB   |  1次下載  |  5 積分

本月

  1. 1使用單片機(jī)實(shí)現(xiàn)七人表決器的程序和仿真資料免費(fèi)下載
  2. 2.96 MB   |  44次下載  |  免費(fèi)
  3. 2UC3842/3/4/5電源管理芯片中文手冊(cè)
  4. 1.75 MB   |  15次下載  |  免費(fèi)
  5. 3DMT0660數(shù)字萬用表產(chǎn)品說明書
  6. 0.70 MB   |  13次下載  |  免費(fèi)
  7. 4ST7789V2單芯片控制器/驅(qū)動(dòng)器英文手冊(cè)
  8. 3.07 MB   |  11次下載  |  1 積分
  9. 5TPS54202H降壓轉(zhuǎn)換器評(píng)估模塊用戶指南
  10. 1.02MB   |  8次下載  |  免費(fèi)
  11. 6STM32F101x8/STM32F101xB手冊(cè)
  12. 1.69 MB   |  8次下載  |  1 積分
  13. 7TPS92682-Q1幀定義和示例
  14. 891.71KB   |  6次下載  |  免費(fèi)
  15. 8HY12P65/HY12P66數(shù)字萬用表芯片規(guī)格書
  16. 0.69 MB   |  6次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935119次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
  4. 1.48MB  |  420061次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233084次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費(fèi)下載
  8. 340992  |  191367次下載  |  10 積分
  9. 5十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
  10. 158M  |  183335次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81581次下載  |  10 積分
  13. 7Keil工具M(jìn)DK-Arm免費(fèi)下載
  14. 0.02 MB  |  73807次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65987次下載  |  10 積分
主站蜘蛛池模板: 日本吃孕妇奶水免费观看| 国产永久免费视频| 午夜福利网国产A| 国产亚洲日韩另类在线播放| 亚洲欧美一区二区三区久久| 久久精品中文字幕| 99国内精品久久久久久久清纯| 欧美人与动交zOZ0| 国产91专区| 亚洲an天堂an在线观看| 久久91精品国产91久久户| 2019久久视频这里有精品15| 欧美人禽Zozo动人物杂交| 国产成人久久婷婷精品流白浆| 亚洲AV美女成人网站P站| 久久机热视频免费| 67194成在线观看免费| 日本无码毛片一区二区手机看| 国产精品亚洲一区二区三区久久| 亚洲无码小格式| 蜜芽在线影片| 高H黄暴NP辣H一女多男| 亚洲免费三区| 免费在线视频一区| 国产AV亚洲一区精午夜麻豆| 亚洲日韩精品AV中文字幕| 麻豆最新免费版| 色姣姣狠狠撩综合网| 国产1769一七六九视频在线| 色综合伊人色综合网站下载| 好看AV中文字幕在线观看| 69夫妇交友群| 色欲精品国产AV久久久| 精品一二三区久久AAA片| asian4you裸模| 新金梅瓶玉蒲团性奴3| 久久亚洲高清观看| 大胸美女被C得嗷嗷叫动态图| 亚洲精品青青草原avav久久qv| 美女胸网站| 国产精品高清m3u8在线播放|