1、 FPGA 课程设计报告 专 业:通信工程 班 级:班 姓 名: 学 号: 指导老师: 制作日期:11.1011.20 设计课题设计课题 1:设计一个可控的 100 进制可逆计数器, 要求用 DE2-115 开发板下载。 (1) 计数器的时钟输入信号周期为 200ns。 (2) 以十进制形式显示。 (3) 有一个复位端 clr 和两个控制端 plus 和 minus,在这些控制 信号的作用下,计数器具有复位、增或减计数、暂停功能。 clr plus minus 功能 0 复位为 0 1 1 0 递增计数 1 0 1 递减计数 1 1 1 暂停计数 设计步骤设计步骤 第一步:参考书中的 60 进
2、制计数器设计出 100 进制的加法计数器, 用时 30 分钟; 第二步: 仿照 100 进制的加法可以设计出 100 进制的减法计数器,用 时 45 分钟; 第三步: 将两段程序拼凑起来, 利用两个控制端控制加减和暂停功能, 用时 15 分钟。 关键词关键词 可逆;暂停;循环计数。 内容摘要内容摘要 计数器具有复位、增减计数和暂停功能,可循环计数,可用作平时的 计数器用。 总体方案总体方案 顶层逻辑电路图顶层逻辑电路图 上图为 100 进制可逆计数器的封装图,sw0控制计数脉冲的频率大 小,sw1控制清零端,sw2和 sw3为两个控制端 plus 和 minus, hex1 和 hex0 分别
3、显示 100 进制的十位和个位。 底层功能模块设计底层功能模块设计 100 进制可逆加减的程序代码: module count100(qout,/输出的数字 cout,/进位 data,/置位数字 load,/置位端 clr,/清零端 clk,/时钟脉冲 plus,/控制端 minus/控制端) ; input load,clk,clr,plus,minus;input7:0 data;/输入 output 7:0 qout; reg7:0 qout;output cout;/输出 always (posedge clk)/脉冲 begin if(!clr) qout=0;/如果清零端为 0,
4、将输出清零 else if(load) qout=data;/如果置数端为 1,将置数 端数字给输出 else if(plus/当 plus 为 1 且 minus 为 0 时如果计数 到 99 时回到 00 else if(plus if(qout7:4=9) qout7:4=0; else qout7:4=qout7:4+1; end else qout3:0=qout3:0+1; end else if(!plus if (qout7:4=0) qout7:4=9; else qout7:4=qout7:4-1; end else qout3:0=qout3:0-1; end else
5、if(plus/plus 为 1, minus 为 1, 暂停计数 else qout=0; /为其他时清零 end assign cout=(qout=8d99)?1:0; /为 99 时进位端进 endmodule 注释:利用 plus 和 minus 的几种组合可控制加减和暂停计数。利用 清零端可将计数清零,以便计数。 各模块功能仿真波形显示的结果:各模块功能仿真波形显示的结果: 当 plus 为 1,minus 为 0 时,递增计数到 99 时下一刻为 00。 当 clk 为 0 时,计数器清零。 当 plus 为 0,minus 为 1 时,递减计数,00 时下一秒变为 99。 当
6、plus 为 1,minus 为 1,暂停计数。 设计中遇到问题及解决方法设计中遇到问题及解决方法 在设计时,我用的是让其自己加减的方法,在仿真时可以做出正确 的结果,但是在下载板中显示时,个位一直从 0 加到了 F 才向十位 进位,我感觉到可能是程序出错了,我没有将十位和个位分开,而 是写在了一起,导致默认为十六位计数,于是我将程序改为分开计 数,最后终于成功了。 心得体会心得体会 从第一个简单的实验中我感觉到,看起来简单的事,可能自己亲手 做的时候就会 发现很多问题,这些问题都要自己去解决,后面的 两个实验更难,我需要更多的去开动脑筋,多多查阅资料,力争做 好。 设计课题设计课题 2 2:交通灯控制系统,要求用 DE2-115 开发板下载。 (1) 设计一个十字路口交通信号灯的定时控制电路。要求红、绿 灯按