完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
初学verilog,手头正好有EPM240核心板和LCD1602,参考了一些资料尝试着用三段式状态机写得,但通电后LCD没有显示,请大神帮忙看看程序有什么问题,不胜感激。代码如下:
module lcd1602( clk_50, rst, lcd_rs, lcd_rw, lcd_en, lcd_data ); input clk_50; input rst; output lcd_rs; output lcd_rw; output lcd_en; output [7:0]lcd_data; reg clk_lcd; reg lcd_rs; reg [7:0]lcd_data; reg [7:0]current_state; reg [7:0]next_state; reg [15:0]count; wire lcd_en; wire lcd_rw; /*************状态编码**************/ parameter idle =8'b0000_0000; parameter displaymode =8'b0000_0010; parameter displayoff =8'b0000_0100; parameter displayclear =8'b0000_1000; parameter displayshift =8'b0001_0000; parameter displayon =8'b0010_0000; parameter setddram =8'b0100_0000; parameter writeram =8'b1000_0000; /*************50M分频至500Hz**************/ always@(posedge clk_50) begin if(!rst) begin count<=0; clk_lcd<=0; end else if(count<49999) begin count<=count+1'b1; end else begin count<=0; clk_lcd<=~clk_lcd; end end /****************LCD初始化****************/ assign lcd_en=clk_lcd; assign lcd_rw=1'b0; always@(posedge clk_lcd or negedge rst) begin if(!rst) current_state<=idle; else current_state<=next_state; end always@(*) begin case(current_state) idle :next_state=displaymode; displaymode :next_state=displayoff; displayoff :next_state=displayclear; displayclear :next_state=displayshift; displayshift :next_state=displayon; displayon :next_state=setddram; setddram :next_state=writeram; writeram :next_state=setddram; default :next_state=idle; endcase end always@(posedge clk_lcd or negedge rst) begin if(!rst) begin lcd_rs<=0; lcd_data<=8'bzzzz_zzzz; end else begin case(next_state) idle : lcd_rs<=0; displaymode : lcd_rs<=0; displayoff : lcd_rs<=0; displayclear: lcd_rs<=0; displayshift: lcd_rs<=0; displayon : lcd_rs<=0; setddram : lcd_rs<=0; writeram : lcd_rs<=1; default : lcd_rs<=0; endcase case(next_state) idle : lcd_data<=8'bzzzz_zzzz; displaymode : lcd_data<=8'b0011_1000;//38h,显示模式设置 displayoff : lcd_data<=8'b0000_1000;//08h,显示关闭 displayclear: lcd_data<=8'b0000_0001;//01h,显示清屏 displayshift: lcd_data<=8'b0000_0110;//06h,显示光标移动设置 displayon : lcd_data<=8'b0000_1100;//0ch,显示开及光标设置 setddram : lcd_data<=8'b1000_0000;//设置第一行第一个地址 writeram : lcd_data<="A";//显示字符"A" endcase end end endmodule |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1421 浏览 1 评论
1215 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
1426 浏览 0 评论
913 浏览 0 评论
2229 浏览 0 评论
1426 浏览 34 评论
5612 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:43 , Processed in 0.521969 second(s), Total 67, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号