预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

编号:时间:2021年x月x日书山有路勤为径学海无涯苦作舟页码:PLD与数字系统设计实验报告实验二(B组):旋转开关一实验要求:利用Spartan-3StarterBoard实验板上的旋转开关设计一个通过旋转开关的方向来控制LED灯的依次点亮顺序的实验并且要求可以循环点亮。二实验原理及算法分析本次实验总体上来讲可以分为两大部分来思考:第一部分为由旋转旋钮的方向决定LED灯点亮的顺序使实现旋钮向右旋转时LED灯向右点亮旋钮向左旋转时LED灯向左点亮这部分的关键在于如何根据电路板的引脚输入判断旋钮旋转的方向;第二部分为通过旋转旋钮构建时钟来实现旋钮旋转一格时可循环地依次点亮一个LED灯关键在于如何构建实验所需要的时钟。1°旋钮方向下面这幅图取自《XilinxUG230Spartan-3EStarterKitBoardUserGuide》是Spartan-3电路板上的旋钮的编码电路图:上页图所示的是旋钮旋转中A、B两个引脚的一个状态实际中旋钮旋转一格使A和B与GND导通的开关(分别记为K1、K2)的状态变化(K1、K2)分别为:向右旋转时:(断开断开)(闭合断开)(闭合闭合)(断开闭合)(断开断开)向左旋转时:(断开断开)(断开闭合)(闭合闭合)(闭合断开)(断开断开)根据用户手册中A、B两个引脚的UCF文件所述:“NET"ROT_A"LOC="K18"|IOSTANDARD=LVTTL|PULLUP;NET"ROT_B"LOC="G18"|IOSTANDARD=LVTTL|PULLUP;”Vcco接高电平当K1断开时A输出为高电平即输出为“1”;当K1闭合时A输出为低电平即输出为“0”。对B同理可得出相同结果。可得到旋钮旋转一格(AB)状态的变化如下:向右旋转时:(11)(01)(00)(01)(11)向左旋转是:(11)(10)(00)(01)(11)因此可以根据A、B两个引脚输入值的变化来判断旋钮的旋转方向主要依据的状态为状态2和状态4。下图为用户手册中的关于旋钮向右旋转时的A、B引脚的电平变化时序图仅供参考(注:实际中经过实验测试A、B两个引脚的初始态应该是高电平、高电平):由上图可以看出引脚电平变化时会出现抖动现象(实际上按键抖动是机械按键和旋钮的普遍现象)。实验中所用电板的时钟频率为50MHz须使用分频降低频率获得新的更大周期的时钟来避免受到抖动的影响。2°可循环地依次点亮LED灯为了得到可通过旋转旋钮构建可实现旋钮旋转一格时可循环地依次点亮一个LED灯的按钮的时钟CLK可以令下一个LED灯亮的动作发生在CLK的上升沿由1°中的分析可知旋钮旋转一格总共经历五个状态可以设置CLK初始状态为“1”当得到前三个状态时改变CLK状态为“0”当到达第四个状态时就可以对点亮LED灯的方向做出判断当到达某一格的第五个状态(也可以看成是下一个的第一个状态)时改变CLK状态为“1”这就得到了旋转一格控制LED点亮的时钟过一个周期的效果。根据用户手册中LED灯的UCF文件所述:NET"LED<7>"LOC="F9"|IOSTANDARD=LVTTL|SLEW=SLOW|DRIVE=8;LED驱动强度为“8”为高电平点亮。所以对LED灯可循环地依次点亮的实现可以通过控制8个LED灯的电平来实现这个比较简单代码实现见实验报告“三实验算法及核心代码实现”。三实验算法及核心代码实现1°分频CLK介于分频在实际应用中的重要性在此给出本次实验中用到的分频实现代码:inputclk;integeri;regCLK;parametercount=10_0000;always@(posedgeclk)beginif(i==count)begini=0;CLK=~CLK;endelsei=i+1;endclk为电路板的50MHz时钟上面的代码很好的实现了50M/(50M/count)Hz频率的时钟。通过合理调节CLK频率即可有效避免抖动的影响如上实验所用count=10_0000。2°旋钮方向判断及得到依次点亮LED灯的时钟clk0以{firsec}记录AB第二个和第四个状态的值据此作出判断依据这里在clk0从“0”变到“1”放在第三个状态而不放在第四个状态可以避免order和clk0上升沿发生竞争:always@(posedgeCLK)begincase({abfirsec})//第一种情况向右旋转6'b11_00_00:clk0=1;6'b01_00_00:fir=2'b01;6'b00_01_00:clk0=0;6'b10_