找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2212|回复: 0
打印 上一主题 下一主题
收起左侧

一个VHDL语言人体反应测试仪程序希望有人能够帮忙把程序注释一下

[复制链接]
跳转到指定楼层
楼主
ID:115394 发表于 2017-6-20 09:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
100黑币
  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. -- This code displays time in the UP3's LCD Display
  6. -- SW8 (GLOBAL RESET) resets time
  7. ENTITY UP3_CLOCK IS
  8.         PORT(reset, clk_48Mhz,D        ,K,D3,D4                            : IN        STD_LOGIC;--复位,时钟信号,按键输入定义
  9.                  LCD_RS, LCD_E, RESET_LED, SEC_LED,Q_LED        : OUT        STD_LOGIC;--使能端,LED指示灯输出定义
  10.                  LCD_RW        ,Q                                                : BUFFER STD_LOGIC;--
  11.                  DATA_BUS                                                : INOUT        STD_LOGIC_VECTOR(7 DOWNTO 0);--1602数据端口
  12.                  SW3                                        : IN STD_LOGIC_VECTOR(3 DOWNTO 0));--
  13. END UP3_CLOCK;

  14. ARCHITECTURE a OF UP3_CLOCK IS
  15.         TYPE STATE_TYPE IS (HOLD, FUNC_SET, DISPLAY_ON, MODE_SET, WRITE_CHAR1,
  16.         WRITE_CHAR2,WRITE_CHAR3,WRITE_CHAR4,WRITE_CHAR5,WRITE_CHAR6,WRITE_CHAR7,
  17.         WRITE_CHAR8, WRITE_CHAR9, WRITE_CHAR10, RETURN_HOME, TOGGLE_E, RESET1, RESET2,
  18.         RESET3, DISPLAY_OFF, DISPLAY_CLEAR);
  19.         TYPE CNT IS RANGE 0 TO 9;
  20.         SIGNAL state, next_command: STATE_TYPE;
  21.         SIGNAL DATA_BUS_VALUE: STD_LOGIC_VECTOR(7 DOWNTO 0);
  22.         SIGNAL CLK_COUNT_100HZ,CLK_COUNT_400HZ: STD_LOGIC_VECTOR(19 DOWNTO 0);
  23.         SIGNAL CLK_COUNT_2HZ,B1,B2,B3: STD_LOGIC_VECTOR(7 DOWNTO 0);
  24.         SIGNAL BCD_SECD0,BCD_SECD1,BCD_MIND0,BCD_MIND1: STD_LOGIC_VECTOR(3 DOWNTO 0);
  25.         SIGNAL BCD_HRD0,BCD_HRD1,BCD_TSEC,S1,S2,BCD_3CAI: STD_LOGIC_VECTOR(3 DOWNTO 0);
  26.         SIGNAL CLK_400HZ, CLK_100HZ,D1 ,D0,CLK_2HZ: STD_LOGIC;
  27.         SIGNAL COUNT:INTEGER RANGE 0 TO 200;
  28.         SIGNAL COUNT1,COUNT2:INTEGER RANGE 0 TO 40;

  29. BEGIN        
  30.         
  31. --1602数据总线
  32.         DATA_BUS <= DATA_BUS_VALUE WHEN LCD_RW = '0' ELSE "ZZZZZZZZ";

  33.         PROCESS
  34.         BEGIN
  35.          WAIT UNTIL CLK_48MHZ'EVENT AND CLK_48MHZ = '1';
  36.                 IF RESET = '0' THEN
  37.                  CLK_COUNT_400HZ <= X"00000";
  38.                  CLK_400HZ <= '0';
  39.                 ELSE
  40.                                 IF CLK_COUNT_400HZ < X"0EA60" THEN
  41.                                  CLK_COUNT_400HZ <= CLK_COUNT_400HZ + 1;
  42.                                 ELSE
  43.                              CLK_COUNT_400HZ <= X"00000";
  44.                                  CLK_400HZ <= NOT CLK_400HZ;
  45.                                 END IF;
  46.                                 IF CLK_COUNT_100HZ < 240000 THEN
  47.                                 CLK_COUNT_100HZ <= CLK_COUNT_100HZ + 1;
  48.                         ELSE
  49.                                 CLK_COUNT_100HZ <= X"00000";
  50.                                 CLK_100HZ <= NOT CLK_100HZ;
  51.                         END IF;
  52.                 END IF;
  53.         END PROCESS;
  54.         PROCESS (CLK_400HZ, reset)
  55.         BEGIN
  56.                 IF reset = '0'OR D1='1'OR K='1' THEN
  57.                         state <= RESET1;
  58.                         DATA_BUS_VALUE <= X"38";
  59.                         next_command <= RESET2;
  60.                         LCD_E <= '1';
  61.                         LCD_RS <= '0';
  62.                         LCD_RW <= '0';

  63.                 ELSIF CLK_400HZ'EVENT AND CLK_400HZ = '1' THEN
  64. -- 产生1秒时钟信号
  65.                         
  66.                         IF CLK_COUNT_2HZ < 99 THEN
  67.                                 CLK_COUNT_2HZ <= CLK_COUNT_2HZ + 1;
  68.                         ELSE
  69.                                 CLK_COUNT_2HZ <= X"00";
  70.                                 CLK_2HZ <= NOT CLK_2HZ;
  71.                         END IF;
  72. -- 发送时间到液晶显示器               
  73.                         CASE state IS
  74. -- 将8位数据转换成1602的一个5X8字体大小
  75.                                 WHEN RESET1 =>
  76.                                                 LCD_E <= '1';
  77.                                                 LCD_RS <= '0';
  78.                                                 LCD_RW <= '0';
  79.                                                 DATA_BUS_VALUE <= X"38";
  80.                                                 state <= TOGGLE_E;
  81.                                                 next_command <= RESET2;
  82.                                 WHEN RESET2 =>
  83.                                                 LCD_E <= '1';
  84.                                                 LCD_RS <= '0';
  85.                                                 LCD_RW <= '0';
  86.                                                 DATA_BUS_VALUE <= X"38";
  87.                                                 state <= TOGGLE_E;
  88.                                                 next_command <= RESET3;
  89.                                 WHEN RESET3 =>
  90.                                                 LCD_E <= '1';
  91.                                                 LCD_RS <= '0';
  92.                                                 LCD_RW <= '0';
  93.                                                 DATA_BUS_VALUE <= X"38";
  94.                                                 state <= TOGGLE_E;
  95.                                                 next_command <= FUNC_SET;
  96. -- EXTRA STATES ABOVE ARE NEEDED FOR RELIABLE PUSHBUTTON RESET OF LCD
  97.                                 WHEN FUNC_SET =>
  98.                                                 LCD_E <= '1';
  99.                                                 LCD_RS <= '0';
  100.                                                 LCD_RW <= '0';
  101.                                                 DATA_BUS_VALUE <= X"38";
  102.                                                 state <= TOGGLE_E;
  103.                                                 next_command <= DISPLAY_OFF;
  104. -- Turn off Display and Turn off cursor
  105.                                 WHEN DISPLAY_OFF =>
  106.                                                 LCD_E <= '1';
  107.                                                 LCD_RS <= '0';
  108.                                                 LCD_RW <= '0';
  109.                                                 DATA_BUS_VALUE <= X"08";
  110.                                                 state <= TOGGLE_E;
  111.                                                 next_command <= DISPLAY_CLEAR;
  112. -- Turn on Display and Turn off cursor
  113.                                 WHEN DISPLAY_CLEAR =>
  114.                                                 LCD_E <= '1';
  115.                                                 LCD_RS <= '0';
  116.                                                 LCD_RW <= '0';
  117.                                                 DATA_BUS_VALUE <= X"01";
  118.                                                 state <= TOGGLE_E;
  119.                                                 next_command <= DISPLAY_ON;
  120. -- Turn on Display and Turn off cursor
  121.                                 WHEN DISPLAY_ON =>
  122.                                                 LCD_E <= '1';
  123.                                                 LCD_RS <= '0';
  124.                                                 LCD_RW <= '0';
  125.                                                 DATA_BUS_VALUE <= X"0C";
  126.                                                 state <= TOGGLE_E;
  127.                                                 next_command <= MODE_SET;
  128. -- Set write mode to auto increment address and move cursor to the right
  129.                                 WHEN MODE_SET =>
  130.                                                 LCD_E <= '1';
  131.                                                 LCD_RS <= '0';
  132.                                                 LCD_RW <= '0';
  133.                                                 DATA_BUS_VALUE <= X"06";
  134.                                                 state <= TOGGLE_E;
  135.                                                 next_command <= WRITE_CHAR1;
  136. -- Write ASCII hex character in first LCD character location
  137.                                 WHEN WRITE_CHAR1 =>
  138.                                                 LCD_E <= '1';
  139.                                                 LCD_RS <= '1';
  140.                                                 LCD_RW <= '0';
  141.                                                 DATA_BUS_VALUE <= X"3" & BCD_SECD1;
  142.                                                 state <= TOGGLE_E;
  143.                                                 next_command <= WRITE_CHAR2;
  144. -- Write ASCII hex character in second LCD character location
  145.                                 WHEN WRITE_CHAR2 =>
  146.                                                 LCD_E <= '1';
  147.                                                 LCD_RS <= '1';
  148.                                                 LCD_RW <= '0';
  149.                                                 DATA_BUS_VALUE <= X"3" & BCD_SECD0;
  150.                                                 state <= TOGGLE_E;
  151.                                                 next_command <= WRITE_CHAR3;
  152. -- Write ASCII hex character in third LCD character location
  153.                                 WHEN WRITE_CHAR3 =>
  154.                                                 LCD_E <= '1';
  155.                                                 LCD_RS <= '1';
  156.                                                 LCD_RW <= '0';
  157.                                                 DATA_BUS_VALUE <= X"3A" ;
  158.                                                 state <= TOGGLE_E;
  159.                                                 next_command <= WRITE_CHAR4;
  160. -- Write ASCII hex character in fourth LCD character location
  161.                                 WHEN WRITE_CHAR4 =>
  162.                                                 LCD_E <= '1';
  163.                                                 LCD_RS <= '1';
  164.                                                 LCD_RW <= '0';
  165.                                                 DATA_BUS_VALUE <= X"3" & BCD_TSEC;
  166.                                                 state <= TOGGLE_E;
  167.                                                 next_command <= WRITE_CHAR5;
  168. -- Write ASCII hex character in fifth LCD character location
  169.                                 WHEN WRITE_CHAR5 =>
  170.                                                 LCD_E <= '1';
  171.                                                 LCD_RS <= '1';
  172.                                                 LCD_RW <= '0';
  173.                                                 DATA_BUS_VALUE <= X"3" & BCD_3CAI;
  174.                                                 state <= TOGGLE_E;
  175.                                                 next_command <= WRITE_CHAR6;
  176. -- Write ASCII hex character in sixth LCD character location
  177.                                 WHEN WRITE_CHAR6 =>
  178.                                                 LCD_E <= '0';
  179.                                                 LCD_RS <= '0';
  180.                                                 LCD_RW <= '0';
  181.                                                 DATA_BUS_VALUE <= X"3A" ;
  182.                                                 state <= TOGGLE_E;
  183.                                                 next_command <= WRITE_CHAR7;
  184. -- Write ASCII hex character in seventh LCD character location
  185.                                 WHEN WRITE_CHAR7 =>
  186.                                                 LCD_E <= '0';
  187.                                                 LCD_RS <= '0';
  188.                                                 LCD_RW <= '0';
  189.                                                 DATA_BUS_VALUE <= X"3" & BCD_SECD1;
  190.                                                 state <= TOGGLE_E;
  191.                                                 next_command <= WRITE_CHAR8;
  192. -- Write ASCII hex character in eighth LCD character location
  193.                                 WHEN WRITE_CHAR8 =>
  194.                                                 LCD_E <= '0';
  195.                                                 LCD_RS <= '0';
  196.                                                 LCD_RW <= '0';
  197.                                                 DATA_BUS_VALUE <= X"3" & BCD_SECD0;
  198.                                                 state <= TOGGLE_E;
  199.                                                 next_command <= WRITE_CHAR9;
  200.                                 WHEN WRITE_CHAR9 =>
  201.                                                 LCD_E <= '0';
  202.                                                 LCD_RS <= '0';
  203.                                                 LCD_RW <= '0';
  204.                                                 DATA_BUS_VALUE <= X"2E";
  205.                                                 state <= TOGGLE_E;
  206.                                                 next_command <= WRITE_CHAR10;
  207.                                 WHEN WRITE_CHAR10 =>
  208.                                                 LCD_E <= '0';
  209.                                                 LCD_RS <= '0';
  210.                                                 LCD_RW <= '0';
  211.                                                 DATA_BUS_VALUE <= X"3" & BCD_TSEC;
  212.                                                 state <= TOGGLE_E;
  213.                                                 next_command <= RETURN_HOME;

  214. -- Return write address to first character postion
  215.                                 WHEN RETURN_HOME =>
  216.                                                 LCD_E <= '1';
  217.                                                 LCD_RS <= '0';
  218.                                                 LCD_RW <= '0';
  219.                                                 DATA_BUS_VALUE <= X"80";
  220.                                                 state <= TOGGLE_E;
  221.                                                 next_command <= WRITE_CHAR1;
  222. -- The next two states occur at the end of each command to the LCD
  223. -- Toggle E line - falling edge loads inst/data to LCD controller
  224.                                 WHEN TOGGLE_E =>
  225.                                                 LCD_E <= '0';
  226.                                                 state <= HOLD;
  227. -- Hold LCD inst/data valid after falling edge of E line                                
  228.                                 WHEN HOLD =>
  229.                                                 state <= next_command;
  230.                         END CASE;
  231.                 END IF;
  232.         END PROCESS;
  233.         PROCESS (Clk_100hz, reset)

  234.         BEGIN
  235.         

  236.                 IF reset = '0' OR D1='1'THEN        
  237.                         BCD_HRD1 <= X"0";        
  238.                                        
  239.                         BCD_HRD0 <= X"0";
  240.                         BCD_MIND1 <= X"0";
  241.                         BCD_MIND0 <= X"0";
  242.                         BCD_SECD1 <= X"0";
  243.                         BCD_SECD0 <= X"0";
  244.                         BCD_TSEC  <= X"0";
  245.                         BCD_3CAI<=X"0";
  246.                         SEC_LED<='0';
  247.                 RESET_LED<='0';
  248.                 Q_LED<='0';
  249.                
  250.         IF K='0' THEN B2<=X"00";ELSE NULL;END IF;
  251.                 ELSIF clk_100HZ'EVENT AND clk_100HZ = '1' THEN
  252.             IF COUNT1<20 THEN
  253.          COUNT1<=COUNT1+1;ELSE COUNT1<=0;
  254. IF COUNT2<=8 THEN IF D3='0' THEN COUNT2<=COUNT2+1;ELSE
  255. COUNT2<=COUNT2; END IF;ELSE COUNT2<=1;END IF;END IF ;
  256.         
  257.         
  258.         IF BCD_3CAI<9 THEN
  259.         BCD_3CAI<=BCD_3CAI+1;
  260.         IF K='0' THEN B2<=B2+1;
  261.         ELSE NULL;
  262.         IF D3='0' THEN  SEC_LED<='0';
  263.         RESET_LED<='0';Q_LED<='0';ELSE
  264.         IF K='1'AND D0='1' THEN
  265.         IF B2<=15 THEN SEC_LED<='1';
  266.         ELSE SEC_LED<='0';
  267.         IF B2>15 AND B2<=23 THEN  RESET_LED<='1';
  268.         ELSE RESET_LED<='0';
  269.         IF B2>23 AND B2<=31 THEN  Q_LED<='1';
  270.         ELSE Q_LED<='0';
  271.         IF B2>31 THEN
  272.         SEC_LED<='1';
  273.         RESET_LED<='1';Q_LED<='1';
  274.         ELSE SEC_LED<='0';
  275.         RESET_LED<='0';Q_LED<='0';
  276.         END IF;END IF;END IF;END IF;END IF;
  277.         END IF;END IF;
  278.         ELSE
  279.         BCD_3CAI<=X"0";
  280. -- TENTHS OF SECONDS
  281.                 IF BCD_TSEC < 9 THEN
  282.                  BCD_TSEC <= BCD_TSEC + 1;
  283.                 ELSE
  284.                  BCD_TSEC <= X"0";
  285.                  
  286. -- SECONDS
  287.                 IF BCD_SECD0 < 9 THEN
  288.                   BCD_SECD0 <= BCD_SECD0 + 1;
  289.         
  290.         
  291.         
  292.                 ELSE
  293. -- TENS OF SECONDS
  294.                  BCD_SECD0 <= "0000";
  295.                    IF BCD_SECD1 < 5 THEN
  296.                    BCD_SECD1 <= BCD_SECD1 + 1;
  297.                   ELSE
  298. -- MINUTES
  299.                    BCD_SECD1 <= "0000";
  300.                    IF BCD_MIND0 < 9 THEN
  301.                      BCD_MIND0 <= BCD_MIND0 + 1;
  302.                    ELSE
  303. -- TENS OF MINUTES
  304.                      BCD_MIND0 <= "0000";
  305.                      IF BCD_MIND1 < 5 THEN
  306.                BCD_MIND1 <= BCD_MIND1 + 1;
  307.                      ELSE
  308. -- HOURS
  309.                     BCD_MIND1 <= "0000";
  310.                     IF BCD_HRD0 < 9 AND NOT((BCD_HRD1 = 2) AND (BCD_HRD0 = 3))THEN
  311.                       BCD_HRD0 <= BCD_HRD0 + 1;
  312.                     ELSE
  313. -- TENS OF HOURS
  314.                       IF NOT((BCD_HRD1 = 2) AND (BCD_HRD0 = 3)) THEN
  315.                         BCD_HRD1 <= BCD_HRD1 + 1;
  316.                         BCD_HRD0 <= "0000";
  317.                       ELSE
  318. -- NEW DAY
  319.                        BCD_HRD1 <= "0000";
  320.                    BCD_HRD0 <= "0000";
  321.                  END IF;
  322.            END IF;
  323.           END IF;
  324.          END IF;
  325.         END IF;
  326.        END IF;
  327.          END IF;
  328.         END IF;
  329.         END IF;
  330. END PROCESS;
  331. PROCESS(CLK_100HZ)
  332. BEGIN
  333.         CASE SW3 IS
  334. WHEN "0000"=>S1<=X"0";
  335. WHEN "0001"=>S1<=X"1";
  336. WHEN "0010"=>S1<=X"2";
  337. WHEN "0011"=>S1<=X"3";
  338. WHEN "0100"=>S1<=X"4";
  339. WHEN "0101"=>S1<=X"5";
  340. WHEN "0110"=>S1<=X"6";
  341. WHEN "0111"=>S1<=X"7";
  342. WHEN "1000"=>S1<=X"8";
  343. WHEN "1001"=>S1<=X"9";
  344. WHEN "1010"=>S1<=X"A";
  345. WHEN "1011"=>S1<=X"B";
  346. WHEN "1100"=>S1<=X"C";
  347. WHEN "1101"=>S1<=X"D";
  348. WHEN "1110"=>S1<=X"E";
  349. WHEN OTHERS=>S1<=X"F";
  350. END CASE;
  351. IF reset='0'OR D1='1' THEN
  352. B1<=X"00";B3<=X"00";D1<='0';
  353. ELSIF clk_100HZ'EVENT AND clk_100HZ = '1' THEN
  354. IF B1<99 THEN B1<=B1+1;
  355. ELSE B1<=X"00";
  356. IF B3<16 THEN B3<=B3+1;
  357. IF B3=S1 THEN D0<='1';D1<='1';ELSE D0<='0';END IF;
  358. ELSE B3<=X"00";
  359. END IF;END IF;END IF;
  360. END PROCESS;
  361. PROCESS(CLK_100HZ)
  362. BEGIN
  363. IF reset='0' THEN COUNT<=0;Q<='0';
  364. ELSIF D0='1' OR D4='0' THEN
  365. IF CLK_400HZ'EVENT  AND CLK_400HZ='1'   THEN
  366. IF COUNT<=COUNT2 THEN Q<='1';COUNT<=COUNT+1;
  367. ELSIF COUNT=8 THEN Q<='0';COUNT<=0;
  368. ELSE Q<='0';COUNT<=COUNT+1;
  369. END IF;END IF;ELSE NULL;END IF;END PROCESS;
  370. END a;


复制代码

人体反应测试仪.zip

2.65 KB, 下载次数: 7

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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