PLD实验报告.doc

上传人:少林足球 文档编号:4770569 上传时间:2019-12-11 格式:DOC 页数:10 大小:207.57KB
返回 下载 相关 举报
PLD实验报告.doc_第1页
第1页 / 共10页
PLD实验报告.doc_第2页
第2页 / 共10页
PLD实验报告.doc_第3页
第3页 / 共10页
PLD实验报告.doc_第4页
第4页 / 共10页
PLD实验报告.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《PLD实验报告.doc》由会员分享,可在线阅读,更多相关《PLD实验报告.doc(10页珍藏版)》请在三一文库上搜索。

1、PLD实验报告 实验内容:用4*3键盘作为输入,在8*8的LED显示屏上采用动画过度的效果显示相应的字符,并以两个按键作为复位和字符循环播放模式。电路结构:1.4*3数字键盘键盘的按键识别方式采用行扫描,实际电路中由于列输入端在悬空时被内部电路拉高而呈逻辑1,所以需要使用低电平作为行扫描标志,相应的,列接收端以低电平作为有效信号。由于按键存在一定的抖动,所以在扫描时可以采用较低的扫描频率,也可以通过计数器保证一次按键的有效识别。2.8*8的LED显示屏:8*8LED显示屏可采用行扫描来进行显示,行以高电平作为扫描标志连接某一行的二极管的阳极,而列以低电平作为二极管的阴极输出。但由于FPGA驱动

2、能力有限,不可能同时驱动一整排的LED灯管,所以实验板上采用反向器提高其驱动能力,相应的在FPGA端,应使用以低电平作为标志的行扫描信号。3. 普通按键电路板上有四个被电路拉高为逻辑1的按键,在按键时呈现低电平,作为复位信号以及字符循环显示的模式选择。程序结构:1. 字符矩阵采用常量的方式存储大量的字符显示所需的矩阵信息:TYPE romtable IS ARRAY (0 TO 7) OF STD_LOGIC_VECTOR(7 DOWNTO 0);CONSTANT zero:romtable:=romtable(11000011, 10111101, 10111101, 10111101, 1

3、0111101,10111101, 10111101, 11000011);CONSTANT one:romtable:=romtable(11100111, 11000111, 11100111, 11100111, 11100111,11100111, 11100111, 11000011);CONSTANT two:romtable:=romtable(11000011, 10011001, 10111001, 11111011, 11110111,11101111, 11011111, 10000001);CONSTANT three:romtable:=romtable(110000

4、11, 11111001, 11111101, 11100011, 11111101,11111101, 11111001, 11000011);CONSTANT four:romtable:=romtable(11110111, 11101111, 11011111, 10110111, 10110111,10000001, 11110111, 11110111);CONSTANT five:romtable:=romtable(11000001, 11011111, 11000011, 11111001, 11111101,11111101, 10111001, 11000011);CON

5、STANT six:romtable:=romtable(11110111, 11101111, 11011111, 10100011, 10111101,10111101, 10111101, 11000011);CONSTANT seven:romtable:=romtable(10000001, 11111101, 11111011, 11110111, 11101111,11011111, 11011111, 11011111);CONSTANT eight:romtable:=romtable(11000011, 10111101, 10111101, 11000011, 10111

6、101,10111101, 10111101, 11000011);CONSTANT nine:romtable:=romtable(11000011, 10111101, 10111101, 10111101, 11000001,11111101, 11111101, 11000011);CONSTANT star:romtable:=romtable(11111111, 11101111, 10101101, 11000011, 11101111,11010111, 10111011, 11111111);CONSTANT sharp:romtable:=romtable(11111111

7、, 11011011, 10000001, 11011011, 11011011,10000001, 11011011, 11111111);CONSTANT act1:romtable:=romtable(00000000, 00000000, 00000000, 00011000, 00011000,00000000, 00000000, 00000000);CONSTANT act2:romtable:=romtable(00000000, 00000000, 00111100, 00111100, 00111100,00111100, 00000000, 00000000);CONST

8、ANT act3:romtable:=romtable(00000000, 01111110, 01111110, 01111110, 01111110,01111110, 01111110, 00000000);CONSTANT act4:romtable:=romtable(11111111, 11111111, 11111111, 11111111, 11111111,11111111, 11111111, 11111111);CONSTANT window1:romtable:=romtable(00000000, 00000000, 00111100, 00100100, 00100

9、100,00111100, 00000000, 00000000);CONSTANT window2:romtable:=romtable(00000000, 01111110, 01000010, 01000010, 01000010,01000010, 01111110, 00000000);CONSTANT window3:romtable:=romtable(11111111, 10000001, 10000001, 10000001, 10000001,10000001, 10000001, 11111111);CONSTANT window4:romtable:=romtable(

10、00000000, 00000000, 00000000, 00000000, 00000000,00000000, 00000000, 00000000);对应的图像如下:其中前12个对应键盘上的字符,而最后8个用作动画的窗。2.分频器整个程序使用一个PROCESS作为分频模块,采用多次渐进分频的方法,提供多种频率信号的输出,程序如下:SIGNAL clk4:STD_LOGIC:=0;SIGNAL clk5:STD_LOGIC:=0;SIGNAL clk6:STD_LOGIC:=0;clocks:PROCESS(clk,reset)VARIABLE clk1:STD_LOGIC_VECTOR

11、(7 DOWNTO 0):=00000000;VARIABLE clk2:STD_LOGIC_VECTOR(7 DOWNTO 0):=00000000;VARIABLE clk3:STD_LOGIC_VECTOR(7 DOWNTO 0):=00000000;BEGINIF reset=0 THEN-在需要的时候重置分频器参数。clk1:=00000000;clk2:=00000000;clk3:=00000000;ELSIF RISING_EDGE(clk) THEN-计数器工作,采用系统时钟50MHz,端口“Y11”clk1:=clk1+1;IF clk1=11111010 THEN-250

12、clk1:=00000000;clk2:=clk2+1;END IF;IF clk2=11111010 THEN-clk2每计数到250时跳变为0clk2:=00000000;clk3:=clk3+1;clk5=NOT clk5;-clk5产生400Hz的信号,作为8*8LED显示屏的扫描频率的8倍END IF;IF clk3=00100000 THEN-clk3每计数到32时跳变为0clk3:=00000000;clk4=NOT clk4;-clk4产生12Hz的信号,作为数字键盘的扫描频率的4倍END IF;clk6=clk3(5);END IF;END PROCESS;3. 数字键盘扫描

13、:采用clk4信号作为扫描时钟,同时使用复位信号reset进行复位,程序如下:SIGNAL rowtemp:STD_LOGIC_VECTOR(3 DOWNTO 0):=0000;scan:PROCESS(clk4,reset)-update rowVARIABLE rowtemp00:STD_LOGIC_VECTOR(3 DOWNTO 0):=0000;-采用内部信号进行计数。BEGINIF reset=0 THEN rowtemp00:=0000;rowtemp=0000;row rowtemp00:=0011;WHEN0011= rowtemp00:=0110;WHEN0110= rowt

14、emp00:=1001;WHEN1001= rowtemp00:=0000;WHEN OTHERS= rowtemp00:=0000;END CASE;CASE rowtemp00 ISWHEN0000= row row row row row=0111;END CASE;rowtemp lastcount=count00;-有新的有效按键输入,存储上一次按键count00:=rowtemp+0001;-由行地址和列地址生成字符地址dcount lastcount=count00;count00:=rowtemp+0010;dcount lastcount=count00;count00:=r

15、owtemp+0011;dcount lastcount=count00;count00:=count00;IF dcount/=11 THEN dcount=dcount+1; END IF;END CASE;ELSIF style=0 THEN-字符循环显示功能lastcount count00:=0010;WHEN0010= count00:=0011;WHEN0011= count00:=0100;WHEN0100= count00:=0101;WHEN0101= count00:=0110;WHEN0110= count00:=0111;WHEN0111= count00:=1000

16、;WHEN1000= count00:=1001;WHEN1001= count00:=1010;WHEN1010= count00:=1011;WHEN1011= count00:=1100;WHEN1100= count00:=0001;WHEN OTHERS= count00:=0001;END CASE;END IF;count=count00;colout=col;count2=count00;END IF;END PROCESS;按键(字符地址)第1列第2列第3列第1行1(0001)2(0010)3(0011)第2行4(0100)5(0101)6(0110)第3行7(0111)8(

17、1000)9(1001)第4行*(1010)0(1011)#(1100)5.字符显示使用50Hz的刷屏速度,将上一个按键所对应的矩阵与本次按键所对应多的矩阵分别与act和lastact相乘后相加,再与边框矩阵window相加得到需要显示的矩阵,示例如下:若上一个字符为0,本次字符为4:若上一个字符为2,本次字符为#:程序如下:showkey:PROCESS(clk5,reset)VARIABLE rowtemp2:STD_LOGIC_VECTOR(7 DOWNTO 0):=00000000;VARIABLE ncol2:INTEGER RANGE 0 TO 7:=0;VARIABLE act:

18、romtable;VARIABLE window:romtable;VARIABLE lastact:romtable;VARIABLE col2temp:STD_LOGIC_VECTOR(7 DOWNTO 0):=00000000;VARIABLE col2temp2:STD_LOGIC_VECTOR(7 DOWNTO 0):=00000000;BEGINIF reset=0 THEN-清除存储的案件所对应的字符信息rowtemp2:=11111111;ncol2:=0;row2=11111111;col2 rowtemp2:=11111101;ncol2:=1;-ncol2便于提取显示字符

19、的每一行信息WHEN11111101= rowtemp2:=11111011;ncol2:=2;WHEN11111011= rowtemp2:=11110111;ncol2:=3;WHEN11110111= rowtemp2:=11101111;ncol2:=4;WHEN11101111= rowtemp2:=11011111;ncol2:=5;WHEN11011111= rowtemp2:=10111111;ncol2:=6;WHEN10111111= rowtemp2:=01111111;ncol2:=7;WHEN01111111= rowtemp2:=11111110;ncol2:=0;

20、WHEN OTHERS= rowtemp2:=11111110;ncol2:=0;END CASE;row2 act:=act1;window:=window1;WHEN01= act:=act2;window:=window2;WHEN10= act:=act3;window:=window3;WHEN11= act:=act4;window:=window4;WHEN OTHERS= act:=act4;window:=window4;END CASE;FOR i IN 0 TO 7 LOOP-lastact = NOT actlastact(i):=NOT act(i);-上一次按键对应

21、的动作矩阵lastact-与本次按键所对应的动作矩阵act相反END LOOP;CASE count IS-形成本次按键所对应字符矩阵的显示范围WHEN0001= col2temp:=one(ncol2) AND act(ncol2);WHEN0010= col2temp:=two(ncol2) AND act(ncol2);WHEN0011= col2temp:=three(ncol2) AND act(ncol2);WHEN0100= col2temp:=four(ncol2) AND act(ncol2);WHEN0101= col2temp:=five(ncol2) AND act(n

22、col2);WHEN0110= col2temp:=six(ncol2) AND act(ncol2);WHEN0111= col2temp:=seven(ncol2) AND act(ncol2);WHEN1000= col2temp:=eight(ncol2) AND act(ncol2);WHEN1001= col2temp:=nine(ncol2) AND act(ncol2);WHEN1010= col2temp:=star(ncol2) AND act(ncol2);WHEN1011= col2temp:=zero(ncol2) AND act(ncol2);WHEN1100= c

23、ol2temp:=sharp(ncol2) AND act(ncol2);WHEN OTHERS= col2temp:=11111111 AND act(ncol2);END CASE;CASE lastcount IS-形成上一次按键所对应字符矩阵的显示范围WHEN0001= col2temp2:=(one(ncol2) AND lastact(ncol2);WHEN0010= col2temp2:=(two(ncol2) AND lastact(ncol2);WHEN0011= col2temp2:=(three(ncol2) AND lastact(ncol2);WHEN0100= co

24、l2temp2:=(four(ncol2) AND lastact(ncol2);WHEN0101= col2temp2:=(five(ncol2) AND lastact(ncol2);WHEN0110= col2temp2:=(six(ncol2) AND lastact(ncol2);WHEN0111= col2temp2:=(seven(ncol2) AND lastact(ncol2);WHEN1000= col2temp2:=(eight(ncol2) AND lastact(ncol2);WHEN1001= col2temp2:=(nine(ncol2) AND lastact(

25、ncol2);WHEN1010= col2temp2:=(star(ncol2) AND lastact(ncol2);WHEN1011= col2temp2:=(zero(ncol2) AND lastact(ncol2);WHEN1100= col2temp2:=(sharp(ncol2) AND lastact(ncol2);WHEN OTHERS= col2temp2:=(11111111 AND lastact(ncol2);END CASE;col2=(col2temp OR col2temp2) AND (NOT window(ncol2);-添加边框后形成最后的输出矩阵END

26、IF;END PROCESS;6. 实体信息entity numberkeyboard is Port ( clk : in STD_LOGIC; style : in STD_LOGIC; reset : in STD_LOGIC; row : out STD_LOGIC_VECTOR (3 downto 0);-from 1 to 4 col : in STD_LOGIC_VECTOR (2 downto 0); colout : out STD_LOGIC_VECTOR (2 downto 0); count2 : out STD_LOGIC_VECTOR (3 downto 0); r

27、ow2 : out STD_LOGIC_VECTOR (7 downto 0); col2 : out STD_LOGIC_VECTOR (7 downto 0);end numberkeyboard;实验小结:1. 模块化编程将每一个大的模块分开写便于中间调试,但每一个模块尽量完成一个较为完整的功能,而不必将模块的适应性过于高,从而节省有限的FPGA资源。分频器采用多次渐进分频也是处于这个考虑。2. 状态机每一个模块均采用状态机的方法进行编写,层次清晰也不容易出现综合错误。3. 调试为了便于调试,利用8个发光二极管或其他显示端作为程序内部的一些关键信息的输出,便于快速定位错位的位置。4. 常见综合错误(1) SIGNAL信号在不同的PROCESS中出现赋值语句。(2) 将SIGNAL信号的赋值出现在两块复杂的语句中。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1