EDA流水灯设计大作业

更新时间:2023-11-24 22:31:02 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

西安电子科技大学

——电子工程学院

EDA程序设计

流水灯控制

科 目: EDA程序设计 任课老师:_________ _______________ 姓 名:______________ ___________ 学 号:__________________________

班 级:_________ ______________

流水灯设计

一、 引言

EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言VHDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。随着EDA技术发展和应用领域的扩大与深入,EDA技术在电子信息、通讯、自动控制及计算机应用等领域的重要性突出。随着技术市场与人才市场对EDA的需求不断提高,产品的市场需求和技术市场的要求也必然会反映到教学领域和科研领域中来。因此学好EDA技术对我们有很大的益处。EDA是指以计算机为工具,在EDA软件平台上,根据设计社描述的源文件(原理图文件、硬件描述语言文件或波形图文件),自动完成系统的设计,包括编译、仿真、优化、综合、适配(或布局布线)以及下载。

二、 实验目的

1、掌握基于FPGA的开发方法

2,学习使用EDA集成设计软件Quartus II,电路描述,综合,模拟过程。

3,了解基于EDA应用系统的设计方法。

4,掌握使用EDA工具设计流水灯的设计思路和设计方法

三、实验题目

设计能让一排灯(8只)自动改变显示的控制系统。可将实验板上的一排发光二极管作为彩灯用。控制器应有两种控制方式:

规则变化:变化节拍有0.5秒和0.25秒两种,交替出现,每种节拍可有8种花样,各执行一或者二个周期后替换。彩灯变化方向有单向移动,双向移动,跳跃移动等。

随机变化:变化花样相同,但节拍及花样的转换都随机出现 四、设计思路

1、灯光移动用移位寄存器实现,各种花样,有的可以存于寄存器中,使用时并行置入移位寄存器,有的可以利用环形计数器或扭环计数器实现。

2、节拍信号可选用实验板上的振荡器,花样控制信号可用4位计数器实现控制,1为节拍变化,另三位控制花样。

3、随机信号可以用长度大于15的伪随机序列信号发生器或用高速时钟驱动上述4位计数器得到。

五、程序设计 1.程序代码:

moduleliushuideng( clk,rst_n,key1,key2,led );

inputclk; //12MHz input rst_n; //高电平复位

input key1; //key1=1启动流水灯;key1=0停止流水灯 input key2; //key2=1流水灯右移;key2=0流水灯左移 output[3:0] led; //流水灯指示

//************************************************ reg[16:0] cnt; //分频计数器

always@(posedgeclk or posedgerst_n) begin

if(rst_n) cnt<=17'd0; //异步高电平复位 else if(cnt==17'd119999) cnt<=17'd0; //产生10ms时钟 elsecnt<=cnt+17'd1; end

//***************************************************** regstop_start,left_right; //流水灯控制位

reg[2:0] st; //用于保存当前状态

parameter st0=3'b000,st1=3'b001,st2=3'b101,st3=3'b100; //状态机编码(格雷码) always@(posedgeclk or posedgerst_n) begin if(rst_n) begin

stop_start<=1'b1; left_right<=1'b1; st<=st0; //异步高电平复位 end

else if(cnt==17'd119999) //每隔10ms执行一次 case(st) st0: begin

if(key1==1'b0) st<=st1; //如果按键按下,转状态1 else if(key2==1'b0) st<=st1; //如果按键按下,转状态1 else st<=st0; //否则,保持状态0 end

st1: begin

if(key1==1'b0) //如果按键key1按下 begin

stop_start<=~stop_start; //流水灯启动停止控制 st<=st2; //转状态2 end

else if(key2==1'b0) //如果按键key2按下 begin

left_right<=~left_right; //流水灯左移右移控制 st<=st2; //转状态2 end

else st<=st0; //否则,转状态0 end

st2: begin

if((key1==1'b1)&&(key2==1'b1)) //如果按键释放 begin

st<=st0; //转状态0 end

else st<=st2; //否则,保持状态2 end

default: st<=st0; endcase end

//*****************************************************

reg[23:0] cnt1; //分频计数器 always@(posedgeclk or posedgerst_n) begin

if(rst_n) cnt1<=24'd0; //异步高电平复位

else if(cnt1==24'd11999999) cnt1<=24'd0; //产生流水灯移动时钟 else cnt1<=cnt1+24'd1; end

//***************************************************** reg[3:0] led_r;

always@(posedgeclk or posedgerst_n) begin

if(rst_n) led_r<=4'b1000; //异步高电平复位 else if((

(cnt1==24'd3999999)|| (cnt1==24'd7999999)||

(cnt1==24'd11999999)) &&stop_start) begin

case(left_right) //控制流水灯左移右移 0: begin led_r<={led_r[2:0],led_r[3]}; end 1: begin led_r<={led_r[0],led_r[3:1]}; end default: ; endcase end end

//******************************************************** assign led=led_r; endmodule

2、编译运行中:

3、运行结果:

4、仿真波形:

六、实验总结:

通过这段时间对verilog的学习,我的收获很多。从一开始对硬件设计语言的一无所知,然后通过慢慢的学习。到现在的对verilog的熟悉以及对quartus II的熟悉,在这个过程中,自己收获很多。好多东西自己都不会,然后通过查阅相关的资料,书籍,网站,与同学们不断的交流,不断的学习。在这个过程中,自己收获了很多。谢谢在这个过程中帮助我的同学们。

本文来源:https://www.bwwdw.com/article/am0t.html

Top