万事开头难啊,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口也按程序中所设计方案配置。

评论