图表 47
4. 建立约束文件进行、管脚分配布局布线,生成bit文件
图表 48
5. 通过JTAG口下载实验代码进行实验观察,之后进行实验程序的改进。
36
4.4 实验结果分析
1. 仿真结果波形功能验证:
1)下图显示的刚开始的时候,初始化后即将06H命令传送完后第一次扫描输出的结果如图所示:84H,30h,30h,3ah,30h,30h,3ah,30h,30h,84h。验证了输出的可靠性。
图表 49
2)如图显示的是数字秒表显示为00:00:07的状态
图表 50
4) 如图显示的是一个扫描周期的LCD显示00:01:12
37
图表 51
2. 仿真波形的时序验证,及LCD时序模块的波形,由于一直处于写模式,所以lcd_rw一直为低电平,当触发时能信号wrce来临后,整个读写时序开始形成,经图形可验证时序控制模块正常工作。
图表 52
4. 时钟发生器的波形仿真,从时钟计数器的波形可以看出,时钟计数正常工作。
图表 53
5. 周期性变化的高八位和低四位数据交换标志,以及8位传送结束应答信号
图表 54
6. 其余的众多信号都可以通过波形得到验证。 7. 实验过程中遇到的问题和解决方法
1) 功能仿真通过了,但LCD还是无法正常显示:首先检查LCD是否正常工作,其次检验
38
程序的各类接口约束时间与LCD手册是否相符
2) LCD重复多次显示多段显示时钟:这可能是由于没有进行写地址为操作造成的
3) 时钟走的比预期慢很多,在40S的时候出现很奇怪的现象,时钟卡住,走的很慢:在这
个问题上卡了很久很久,一直通过波形寻找答案,最后发现原来是时钟发生器的程序设计和键盘进行接口时发生混乱造成的。
4) 状态机一直无法跳入下一个状态:首先找出跳入下一状态的条件,检查程序文件,分析
是否错误,进行仿真,查看波形。将每一个信号与预期进行对应,找出问题的根源。 5) 开机后秒表不是从零开始:这是由于在复位后和开机后默认时钟发生器工作,而LCD
需要进行一段时间的初始化,因此才导致这个问题的存在。解决方法有两种:第一种是设置两个异步复位信号,一个使系统复位,一个是时钟的复位信号;第二种方法是将系统开机和复位后默认时钟是停止的,只是比较简答和快捷的做法,只有按下开始/暂停的功能键,时钟才进入运行。
6) 提示大量的警告:可以忽略也可以进行查看
7) 还未解决的一问题:在这次设计的过程中,我曾在modelsim进行功能仿真通过后,在
ise 里面调用modelsim进行仿真,可是没有出错,但功能一直没实现,全部显示为零。 8. 实验心的和体会:
这是本学期学完逻辑设计和硬件描述语言后第一次真正意义上的代码编写和测试,在这个短短的时间里,让我体会到数字系统的魅力时,更让我深深的感受到:只有投入常人不想投入的时间,才会作出常人做不到的事情。在本次实验中有一下几点收获和体会
1) 通过编写小的程序模块,综合进行查看门及电路结构会加深对硬件语言的了解,如阻塞
和非阻塞,优先级等
2) 只要功能仿真通过了,那么真个设计也就差不多了,这是我在本次试验中体会最深刻的
一点,反反复复的仿真、查看波形验证时序直至得到自己想要的结果。在仿真时分模块进行仿真会使设计简单化,然后再进行总体仿真。在这次仿真验证的过程中也进一步熟悉了modelsim的使用技巧,如查看内部寄存器波形等
3) 将理论上的硬件和实际硬件联系起来,才能设计出更稳定的HDL模型
4) 在编写代码之前有一个和软件非常类似的过程就是程序设计的流程,这会大大简化在设
计过程中的工作量,同时会使得思路清晰明了
5) 只有不断的实践练习,才能不断的提高和掌握理论知识。
39
附录:实验四程序清单
//数据读写发送顶层模块
module test_lcd_fsm ( rst_n , // Active low clk , // 100 MHz pause, lcd_rs , lcd_rw , lcd_en , lcd_db );
input pause; input rst_n ; // Active low input clk ; // 100 MHz output lcd_rs ; output lcd_rw ; output lcd_en ; output [7:4] lcd_db ; parameter thd_40ms = 60000, thd_2ms = 2000, thd_39us = 6; parameter idle = 3'b000, function_set = 3'b001, waits = 3'b010, disp_on = 3'b011, disp_clear = 3'b100, entry_mode_set = 3'b101, putchar = 3'b110, finish = 3'b111; parameter db_function_set = 10'b00_0010_1100; parameter db_disp_on = 10'b00_0000_1111; parameter db_disp_clear = 10'b00_0000_0001;
40
parameter db_entry_mode_set = 10'b00_0000_0110; reg [15:0] ns_cnt; reg us_pulse; reg [15:0] us_cnt; reg us_cnt_overflow; reg [2:0] cur_state; reg [2:0] next_state; reg function_set_ok; reg disp_on_ok; reg disp_clear_ok; reg entry_mode_set_ok; reg char_ok; reg char_ok_sft; reg string_ok; reg [79:0] string; reg putchar_en; reg putchar_en_sft; reg [3:0] putchar_step; reg send_cmd; reg send_cmd_sft; reg [3:0] lcd_db_in; reg nibble_swap; reg nibble_swap_sft; reg dataL_ack; reg lcd_wrce; reg [9:0] bus2ip_data; wire lcd_rs_in; wire lcd_ack; wire rst; wire lcd_en; wire lcd_rw; wire lcd_rs; wire pause,clk; wire [7:0] minu_h,minu_l,sec_h,sec_l,ms_h,ms_l; lcd_ctrl lcd_ctrl_init ( .rst (rst) , // Active high .clk (clk), // 100 MHz .lcd_rs_in(lcd_rs_in) , .lcd_db_in(lcd_db_in) ,
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库(ISE使用流程)逻辑设计实验(8)在线全文阅读。
相关推荐: