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