[资料分享] verilog动态驱动1602

kobe1941   2012-10-30 21:04 楼主
调了很久终于调出来了,累屁我了,,
说下大概的思路,我现在完成的是可以往1602的指定地址写入指定的数据,每个只写入一次,避免重复操作,,我是从单片机的思路转过来的,,比较麻烦,用标志位来控制状态机的循环状态,不太好的地方就是当需要连续写入多个数据时需要采用时分复用的方式,,当然也可以不管地址端,直接改变数据端口,,看你的应用了,,刚刚下载测试过,暂时没发现有什么问题,代码写的不规范,欢迎拍砖。
附上代码,芯币懒的收了,又不是人民币,我也搞不明白为什么有些人下载资源时不愿意付出芯币,懒的理,希望有更多的人开源自己的非机密性代码,大家共同进步

    verilog_1602.zip (2012-10-30 21:04 上传)

    2.64 KB, 下载次数: 50

    verilog_1602

回复评论 (5)

写代码的时候很容易被一个固定的思路卡住好久,想不清楚问题,有时候一觉睡醒突然就想明白了,也有时候一直想不明白,,所以个人觉得开源代码相互交流很重要
点赞  2012-10-30 21:06
顶!!!
点赞  2012-10-31 08:48
我也是推荐代码公开化,这样的话更加容易优化代码。
点赞  2012-11-1 17:35
谢谢你的代码给我的帮助, 使我不再纠结于所谓时序的问题, 呵呵!

礼尚往来, 我有一些建议要给楼主:
1. 尽量使用case, 避免巨大的if
2. case的状态量, 没必要使用枚举值, 可以用数字, 只是要注释一下功能, 如果使用枚举值, 反而在case比较大时, 调试时不好掌控.
3. datagen和lcd显示的状态位, flag, 建议改成write_en, 更直观一些.

====================================================
不过你太狠了, 每一步要2ms, 可以试试100us的结果如何, 应该也可以显示.

always @(posedge clk or negedge rst_n)
begin
        if(!rst_n)
                begin
                        cnt<=16'd0;
                        lcd_clk<=1'b0;
                end
        else if(cnt==16'd2500) //1ms delay
                begin
                        cnt<=16'd0;
                        lcd_clk=~lcd_clk;
                end
        else          cnt<=cnt+1'b1;
end

[ 本帖最后由 osoon2008 于 2013-8-16 07:33 编辑 ]
www.ctdisk.com/u/1283024 个人书库,持续更新中。
点赞  2013-8-16 07:22

回复 5楼osoon2008 的帖子

沉下去的帖子竟然又被翻出来了,,,
仅是不同往日,计划总是赶不上变化,非常感谢你的建议,不过楼主已经没做FPGA了,以后的方向也不一定在嵌入式这一块,祝你好运
点赞  2013-8-29 17:23
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复