找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2041|回复: 0
收起左侧

FPGA电机控制vhdl源程序

[复制链接]
ID:259945 发表于 2019-9-3 14:56 | 显示全部楼层 |阅读模式
设计希望对大家有用

单片机源程序如下:
  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;--电机正反转
  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输出状态指示
  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,控制电动机正/反转
  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, 下载次数: 11)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表