正文

〖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--63SW2--64SW3--65L1 --30L2 --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--L7P1.0--65     P0.0--L4     P2.0--L8L1----30L2----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口也按程序中所设计方案配置。

阅读(18103) | 评论(3)


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

评论

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