正文

〖001〗三人表决器2006-05-02 21:57:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wentao/13484.html

分享到:

万事开头难啊,Blog开这了个EDA·HDL〖〗分类,Starting ……


关于下载线的驱动配置,参见:安装下载电缆的驱动程序

实验参考: 10分钟学会PLD设计
实验板:   网助二号

实验题目:
分别采用VHDL、Verilog-HDL和原理图输入方式设计一个简单的三人表决器,并下载到实验板进行实际运行。

三人表决器的功能描述:三个人分别用手指拨动开关SW1、SW2、SW3来表示自己的意愿,如果对某决议同意,各人就把自己的指拨开关拨到高电平(上方),不同意就把自己的指拨开关拨到低电平(下方)。表决结果用LED(高电平亮)显示,如果决议通过那么实验板上L2(绿灯,本实验板上为L1)亮;如果不通过那么实验板上L1(红灯,本实验板上为L5)亮;如果对某个决议有任意二到三人同意,那么此决议通过,L2亮;如果对某个决议只有一个人或没人同意,那么此决议不通过,L1亮。
方案一:采用原理图输入
方案二:采用VHDL语言 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY majority_voter IS
   PORT(SW : IN std_logic_vector(3 DOWNTO 1);
        L : OUT std_logic_vector(2 DOWNTO 1));
END majority_voter; ARCHITECTURE concurrent OF majority_voter IS BEGIN
    WITH SW SELECT
      L <= "10" WHEN "011",
           "10" WHEN "101",
           "10" WHEN "110",
           "10" WHEN "111",
           "01" WHEN OTHERS;
  END concurrent;

总结:
<1> 新建一个Text Editor file之后要将其设为当前工程,方法:FILE->PROJECT->SET PROJECT TO CURRENT FILE  快捷键:Ctrl+Shift+j 。
<2>保存的文件名要与程序中的实体名相同,这里是majority_voter 。
<3>文件扩展名要选.vhd (Automatic Extension 项)。
<4>选择器件时要将"Show Only Fastest Speed Grades"去掉,显示更多器件。


方案三:采用VerilogHDL语言


module majority_voter(SW1,SW2,SW3,L1,L2);

    output L1,L2;       
    input SW1,SW2,SW3;
    and(SW12,SW1,SW2);  //SW12、SW23、SW13是中间变量
    and(SW13,SW1,SW3);
    and(SW23,SW2,SW3);

    or(L2,SW12,SW13,SW23);

    not(L1,L2);

endmodule 

总结:
<1> 分配完引脚之后要重新编译 。
<2>保存文件名仍然要与程序中的实体名相同,即majority_voter 。
<3>文件扩展名要选.v (Automatic Extension 项)。


分别用以上三种方法实现后,下载到实验板上,得到结果均与预计相符。在网助2号这块板上,分别用拨码开关K6、K7、K8对应SW1、SW2、SW3,用L1(绿)、L5(红)对应L2、L1。引脚分配如下:

SW1--63
SW2--64
SW3--65
L1 --30
L2 --35

思考:既然实验板是MCU+CPLD,那可不可以用单片机将全部输入状态模拟一下呢?即SW1、SW2、SW3状态用MCU输出。经过验证,是可行的,方案如下:

    用P1.2、P1.1P、1.0三口对应SW1、SW2、SW3, 输入状态共有23=8种组合,故使P1口低三位循环依次输出000B,001B,010B,011B……111B。间隔为1s。为了使输入及输出状态都显示出来,做如下分配。

P1.2--63     P0.2--L2     P2.2--L6
P1.1--64     P0.1--L3     P2.1--L7
P1.0--65     P0.0--L4     P2.0--L8
L1----30
L2----35

    由于板上所有芯片外接引脚只有1个,所以只好用上述分配方法来显示全部。最终将要实现:三人输入状态分别用L2,L3,L4(绿)显示,而L6,L7,L8(红)分对应L2,L3,L4取反,即若某人同意,对应的绿灯亮,红灯灭;不同意,对应的红灯亮,绿灯灭。

单片机部分程序:

#include <reg51.h>
void delay_1s(void);

main()
{
    unsigned char SW123;
    SW123 = 0x00;

   
    while(1)
    {           
        SW123 &= 0x07;        // 一轮循环8次
        P1 = SW123;
        P0 = SW123;           // 显示输入状态
        P2 = ~SW123;          // 显示输入状态
        delay_1s();
        SW123++;
    }
}

void delay_1s(void)

    unsigned char h,i,j,k;
    for(h=5;h>0;h--)
        for(i=4;i>0;i--)
            for(j=116;j>0;j--)
               for(k=214;k>0;k--);
}

这里P0,P2只是因为板子资源问题才会用到,实际上只由P1口控制即可。

下载到板上验证,得到正确的结果,即循环输入八个状态,三个输入显示中,任意二到三个全为绿(即同意)时,决议通过,L1(绿)亮,L5(红)灭;否则L5亮,L1灭。截某状态如图:


用Proteus模拟:




八支LED均按实验板上的分布放置,P1、P0、P2口也按程序中所设计方案配置。

阅读(8829) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册