当前位置:首页 >> 信息与通信 >>

中南大学EDA实验报告


中南大学
EDA 实验报告

专业班级: 电信 1303 指导老师: 姓 学 名: 号: 张俊

实验目的
通过此实验让用户进一步了解、熟悉和掌握 CPLD/FPGA 开发软件的的使用方法及 Verilog HDL 的编程方法。学习简单状态机的设计和硬件测试。

实验内容
本实验的内容是设

计一个简易的交通灯控制器,要求能实现红、绿、黄灯三种信号的控制并 通过数码管显示倒计时时间。整个设计在 SmartSOPC 实验箱上实现,用第一、第二个数码 管显示 A 方向的倒计时时间,用第七、第八个数码管显示 B 方向的倒计时时间。此外,由于 缺少交通灯模块, 本实验用第一、 第二、 第三个 LED 灯代表 A 方向的红、 绿、 黄灯三种信号, 用第六、第七、第八个 LED 灯代表 B 方向的红、绿、黄等三种信号。

实验原理
本实验设计的交通灯控制器要求实现对 A、B 两个方向的红、绿、黄灯三种信号的控制, 并能实现时间显示的倒计时。 因此每个方向的信号可用一个状态机实现 (参考交通灯.ppt) , 状态的跳转顺序为红灯-绿灯-黄灯-红灯(另一个的状态应为绿-黄-红-绿) ,同时设计一个计 时器,来记录每种灯的倒计时时间。最后将交通灯的状态信息输出至数码管和对应 LED 灯。 注意,一个方向的红灯时间应和另一个方向的绿黄灯时间总和相等。

实验步骤
1) 启 动 Quartus II 建立 一 个 空 白 工 程 ,然 后命 名 为 traffic_test.qpf ( 器 件 为 : EP3C55F484C8) 。 2) 加入并完成交通灯控制模块 traffic_ctrl.v,加入顶层模块 traffic_test.v 及交通灯 显示模块 traffic_display.v,进行综合编译,若在编译过程中发现错 误,则找出并更正错误,直至编译成功为止。 3) 运行引脚绑定脚本文件 setup.tcl; 4) 对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至 编译成功为止。 5) 确保 JP6 上的 LED0-LED7 已通过跳线与 FPGA 引脚相连。 6) 按核芯板上的复位按键,观察交通灯是否正常运作。 5. 结构图

实验结果
因实验结果是动态变化的,且课堂上已给老师检查,故此处略去

实验分析
通过本次实验,熟悉了 QuartusII 的基本用法。在课堂上学习的只是理论基础,只有上机试 验之后才能真正理解。在实验时,我的代码出现了锁存器,主要还是 if-else 语句的情况没有 写全。之前在看书与 ppt 时,有的代码是只有 if 语句的,并没有把所有情况写全,那我在自 己写代码时,也是按照这种方式写的,但是在仿真的时候就无法做出正确结果,在询问了老 师之后,才发现 if 语句的所有情况必须要写全。同时在实验过程中,还纠正了我编写代码 时的一些书写格式问题。

实验代码
module traffic_ctrl(clock,rst_n,lampa,lampb,acount,bcount); input clock; input rst_n; output [2:0] lampa; output [2:0] lampb; output [7:0] acount; output [7:0] bcount; reg [25:0] clk_cnt;

parameter

ared =8'd30, ayellow =8'd5, agreen =8'd15, bred =8'd20, byellow =8'd5, bgreen =8'd25;

always @(posedge clock) begin if(clken) clk_cnt <= 26'h0; else clk_cnt <= clk_cnt + 26'h1; end assign clken = (clk_cnt >= 26'd47999999);

reg[2:0] lampa; reg[7:0] acount; reg acount_startred, acount_startgreen, acount_startyellow;

reg[1:0] currentstate_A, nextstate_A; parameter AR=0, AG=1, AY=2,AS=3; always @(currentstate_A or acount) begin case(currentstate_A) AS: begin lampa = 3'b111; acount_startred = 1'b1; acount_startgreen = 1'b0; acount_startyellow = 1'b0; nextstate_A = AR;end AR: begin lampa=3'b110; if(acount == 0) begin nextstate_A = AG; acount_startred = 0; acount_startgreen = 1; acount_startyellow = 0; end else begin nextstate_A = AR; acount_startred = 0; acount_startgreen = 0; acount_startyellow = 0; end end AG: begin lampa=3'b101; if(acount == 0) begin nextstate_A = AY; acount_startred = 0; acount_startgreen = 0; acount_startyellow = 1; end else begin nextstate_A = AG; acount_startred = 0; acount_startgreen = 0; acount_startyellow = 0; end end AY: begin lampa=3'b011;

if(acount == 0) begin nextstate_A = AR; acount_startred = 1; acount_startgreen = 0; acount_startyellow = 0; end else begin nextstate_A = AY; acount_startred = 0; acount_startgreen = 0; acount_startyellow = 0; end end endcase end always @(posedge clock) begin if(!rst_n) currentstate_A <= AS; else currentstate_A <= nextstate_A; end

always @(posedge clock) begin if(acount_startred) acount <= ared; else if (acount_startgreen) acount <= agreen; else if (acount_startyellow) acount <= ayellow; else if (clken) acount <= acount - 1'b1; end

reg[2:0] lampb; reg[7:0] bcount; reg bcount_startred, bcount_startgreen, bcount_startyellow;

reg[1:0] currentstate_B, nextstate_B; parameter BR=2, BG=0, BY=1,BS=3; always @(currentstate_B or bcount) begin case(currentstate_B) BS: begin lampb = 3'b111; bcount_startred = 1'b0; bcount_startgreen = 1'b1; bcount_startyellow = 1'b0; nextstate_B = BG;end BR: begin lampb=3'b110; if(bcount == 0) begin nextstate_B = BG; bcount_startred = 0; bcount_startgreen = 1; bcount_startyellow = 0; end else begin nextstate_B = BR; bcount_startred = 0; bcount_startgreen = 0; bcount_startyellow = 0; end end BG: begin lampb=3'b101; if(bcount == 0) begin nextstate_B = BY; bcount_startred = 0; bcount_startgreen = 0; bcount_startyellow = 1; end else begin nextstate_B = BG; bcount_startred = 0; bcount_startgreen = 0; bcount_startyellow = 0; end end BY: begin lampb=3'b011; if(bcount == 0) begin nextstate_B = BR; bcount_startred = 1; bcount_startgreen = 0; bcount_startyellow = 0; end else begin nextstate_B = BY;

bcount_startred = 0; bcount_startgreen = 0; bcount_startyellow = 0; end end endcase end always @(posedge clock) begin if(!rst_n) currentstate_B <= BS; else currentstate_B <= nextstate_B; end

always @(posedge clock) begin if(bcount_startred) bcount <= bred; else if (bcount_startgreen) bcount <= bgreen; else if (bcount_startyellow) bcount <= byellow; else if (clken) bcount <= bcount - 1'b1; end endmodule

变 10 进制代码
//********************************************************* //** 交通灯实验 //** 显示模块:traffic_display.v //********************************************************* module traffic_display(clock,rst_n,acount,bcount,seg,dig); input clock; //系统时钟(48MHz) input rst_n; //复位信号,低电平有效 input [7:0] acount; //A 方向倒计时 input [7:0] bcount; //B 方向倒计时 output [7:0] seg; //数码管段码输出 output [7:0] dig; //数码管位码输出

//寄存器 reg[16:0] count; //计数器 wire scan_en; //数码管扫描使能信号 reg[1:0] seg_cnt; //数码管扫描计数器 reg[3:0] disp_dat; //数码管扫描数值 reg[7:0] seg; reg[7:0] dig; reg[7:0] pacount; reg[7:0] pbcount; //产生用于数码管扫描的使能信号 always @(posedge clock or negedge rst_n) begin if (!rst_n) count <= 17'h00000; else count <= count + 1'b1; end assign scan_en = &count; //以下代码参考基础实验《动态数码管显示》自己完成 always @(posedge clock) begin if (scan_en) seg_cnt <= seg_cnt + 1'b1; end always @(posedge clock) begin if(acount<=9)begin pacount = acount; end else begin pacount = acount+3'b110; end if(bcount<=9)begin pbcount = bcount; end else begin pbcount = bcount+3'b110; end case(seg_cnt) 2'd0:disp_dat = pacount[7:4]; //定义上升沿触发进程

//选择扫描显示数据 //第一个数码管

2'd1:disp_dat = pacount[3:0]; //第二个数码管 2'd2:disp_dat = pbcount[7:4]; //第七个数码管 2'd3:disp_dat = pbcount[3:0]; //第八个数码管 endcase case(seg_cnt) //选择数码管显示位 2'd0:dig = 8'b01111111; //选择第一个数码管显示 2'd1:dig = 8'b10111111; //选择第二个数码管显示 2'd2:dig = 8'b11111101; //选择第七个数码管显示 2'd3:dig = 8'b11111110; //选择第八个数码管显示 endcase end always @(disp_dat) begin case(disp_dat) 2'd0:seg = 8'hc0; 2'd1:seg = 8'hf9; 2'd2:seg = 8'ha4; 2'd3:seg = 8'hb0; 2'd4:seg = 8'h99; 2'd5:seg = 8'h92; 2'd6:seg = 8'h82; 2'd7:seg = 8'hf8; 2'd8:seg = 8'h80; 2'd9:seg = 8'h90; endcase end

//七段译码 //显示 0 //显示 1 //显示 2 //显示 3 //显示 4 //显示 5 //显示 6 //显示 7 //显示 8 //显示 9

endmodule


相关文章:
中南大学EDA实验报告
中南大学EDA实验报告_计算机软件及应用_IT/计算机_专业资料。中南大学 实验报告课班学 指导老师: 程:EDA 技术 级: 号: 姓名: 实验时间:2013 年 6 月 EDA--...
中南大学EDA实验报告
中南大学 EDA 实验报告 专业班级: 电信 1303 指导老师: 姓学名: 号: 张俊 实验目的通过此实验让用户进一步了解、熟悉和掌握 CPLD/FPGA 开发软件的的使用方法及 ...
中南大学EDA实验报告
中南大学 验报告程:eda 技术 级: 号:姓名: 指导老师: 实验时间:2013 年 6 月 eda---交通灯实验 1、实验目的 通过此实验让用户进一步了解、熟悉和掌握 cpld...
中南数据库实验报告
中南数据库实验报告_表格类模板_表格/模板_实用文档。中南大学 科目:数据库 姓名...('0000000005','eda 设计','张俊','hunandaxue',9); insert into book_...
中南大学EDA课程设计报告
中南大学EDA课程设计报告_工学_高等教育_教育专区 暂无评价|0人阅读|0次下载|举报文档 中南大学EDA课程设计报告_工学_高等教育_教育专区。数字时钟 EDA 课程设计 ...
中南大学单片机实验报告
中南大学单片机实验报告 27页 5财富值如要投诉违规内容,请到百度文库投诉中心;如...随着微电子技术、IC 设计、EDA 工具的发展,基于 SoC 的单片机应用系统 设计会...
csuEDA实验报告
中南大学 EDA 技术与应用实验报告 班级: 姓名: 学号: 指导老师: 实验地点: 完成日期: 交通灯实验 1. 实验目的通过此实验让用户进一步了解、熟悉和掌握 CPLD/...
计算机实验报告经典
数据库课程设计(改) 28页 免费 EDA程序题 13页 免费 8255A可编程并行口实验...中南大学数据库课程设计报告 指导老师: 指导老师: 院班学姓组系: 级: 号: ...
EDA技术实验报告完整版
福建农林大学金山学院 信息工程类 实验报告课程名称: 姓名: 系: 专年学业: 级: 号: EDA 技术 邱彬彬 信息与机电工程系 电子信息工程专业 2010 级 100201079 ...
单片机实验报告
单片机实验报告_工学_高等教育_教育专区。中南大学单片机试验,交通运输工程学院,试验...随着微电子技术、IC 设计、EDA 工具的发展,基于 SoC 的单片机应用系统设 计会...
更多相关标签:
南昌大学eda实验报告 | 中南大学物理实验报告 | 中南大学电工实验报告 | 中南大学大物实验报告 | 中南大学电桥实验报告 | 中南大学实验报告 | 中南大学实验报告封面 | 中南大学物化实验报告 |