找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2660|回復: 0
打印 上一主題 下一主題
收起左側(cè)

FPGA電機控制vhdl源程序

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:259945 發(fā)表于 2019-9-3 14:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
設(shè)計希望對大家有用

單片機源程序如下:
  1. LIBRARY IEEE;                     
  2. USE IEEE.STD_LOGIC_1164.ALL;
  3. USE IEEE.STD_LOGIC_Arith.ALL;
  4. USE IEEE.STD_LOGIC_Unsigned.ALL;

  5. ENTITY moto_test IS
  6. PORT(
  7. clock_48M:                IN         STD_LOGIC;       
  8. key:                IN         STD_LOGIC_VECTOR(2 DOWNTO 0);
  9. pwm_in:                IN  STD_LOGIC;               
  10. pwm_en:                OUT STD_LOGIC;               
  11. duty_cycle:        OUT        STD_LOGIC_VECTOR(3 DOWNTO 0);
  12. motoa,motob:OUT STD_LOGIC;       
  13. led:                OUT STD_LOGIC_VECTOR(4 DOWNTO 0)
  14. );
  15. END;

  16. ARCHITECTURE one OF moto_test IS
  17. SIGNAL duty_cycle_io:        STD_LOGIC_VECTOR(3 DOWNTO 0);
  18. SIGNAL pwm_en_io:                STD_LOGIC;
  19. SIGNAL count:                        STD_LOGIC_VECTOR(16 DOWNTO 0);
  20. SIGNAL dout1,dout2,dout3:STD_LOGIC_VECTOR(2 DOWNTO 0);--消抖寄存器
  21. SIGNAL moto_dir:                STD_LOGIC;--電機正反轉(zhuǎn)
  22. SIGNAL k_debounce:                STD_LOGIC_VECTOR(2  DOWNTO 0);--按鍵消抖輸出
  23. SIGNAL clk:                                STD_LOGIC;--分頻時鐘
  24. SIGNAL key_edge:                STD_LOGIC_VECTOR(2  DOWNTO 0);

  25. BEGIN
  26. led<=NOT (pwm_en_io & duty_cycle_io);--LED輸出狀態(tài)指示
  27. pwm_en <= pwm_en_io;
  28. duty_cycle <= duty_cycle_io;

  29. PROCESS(clock_48M)
  30. BEGIN
  31.         IF RISING_EDGE(clock_48m) THEN
  32.                 IF count<120000 THEN       
  33.                         count<=count+1;
  34.                         clk<='0';
  35.                 ELSE
  36.                         count<=B"0_0000_0000_0000_0000";
  37.                         clk<='1';
  38.                 END IF;
  39.         END IF;
  40. END PROCESS;

  41. PROCESS (clock_48m)
  42. BEGIN
  43.         IF RISING_EDGE(clock_48M) THEN
  44.                 IF clk='1' THEN
  45.                         dout1<=key;
  46.                         dout2<=dout1;
  47.                         dout3<=dout2;
  48.                 END IF;
  49.         END IF;
  50. END PROCESS;

  51. PROCESS (clock_48M)
  52. BEGIN
  53.         IF RISING_EDGE(clock_48M) THEN
  54.                 k_debounce<=dout1 OR dout2 OR dout3;--按鍵消抖輸出.
  55.         END IF;
  56. END PROCESS;
  57. key_edge<=NOT (dout1 OR dout2 OR dout3) AND k_debounce;

  58. PROCESS(clock_48M)--按鍵1 控制電動機速度
  59. BEGIN
  60.         IF RISING_EDGE(clock_48M) THEN
  61.                 IF key_edge(0)='1' THEN
  62.                         duty_cycle_io<=duty_cycle_io+1;
  63.                 END IF;
  64.         END IF;
  65. END PROCESS;

  66. PROCESS(clock_48M)--按鍵2,控制電動機啟動、停止
  67. BEGIN
  68.         IF RISING_EDGE(clock_48M) THEN
  69.                 IF key_edge(1)='1' THEN
  70.                         pwm_en_io<=NOT pwm_en_io;
  71.                 END IF;
  72.         END IF;
  73. END PROCESS;

  74. PROCESS(clock_48M)--按鍵3,控制電動機正/反轉(zhuǎn)
  75. BEGIN
  76.         IF RISING_EDGE(clock_48M) THEN
  77.                 IF key_edge(2)='1' THEN
  78.                         moto_dir <=NOT moto_dir;
  79.                 END IF;
  80.         END IF;
  81. END PROCESS;
  82. motob<='0'    WHEN moto_dir='1' ELSE pwm_in;
  83. motoa<=pwm_in WHEN moto_dir='1' ELSE '0';


  84. END;
復制代碼

所有資料51hei提供下載:
motor.rar (493.06 KB, 下載次數(shù): 11)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表