搜索
bottom↓
回复: 3

看了一篇verilog建模的文章,就写了个led左移三次,右移三次的程序,一直不行,麻烦帮帮忙,程

[复制链接]

出0入0汤圆

发表于 2011-8-4 09:32:22 | 显示全部楼层 |阅读模式
看了一篇verilog建模的文章,就写了个led左移三次,右移三次的程序,一直不行,麻烦帮帮忙,程序很短的。。谢谢
程序和那篇文章如下。。。。文章说是一种低级建模的思想。。。。我的程序一直都是左移一次,马上又右移了。。接着就听了。。试了一晚不知道什么问题。。。T T 麻烦帮帮忙。。谢谢。。


可能有人觉得简单,这样问吧,我想:实现左移3次,右移5次,再左移1次,再右移10次,再左移30次(后面随便我调用)。。。这样如果不用多模块的话,怎么弄? 我初学,所以理解就是只能好像单片机一样设两个子程序,然后用根据不同状态不断调用。。。不知道对不对。。。



module runled_kongzhi(clk,led);                     //主程序
                input clk;
                output reg [7:0] led;                                                        //led显示
               
        //        reg [23:0] cout=0;                                                               
                reg start_L=0,start_R=0,done;                                        //左移开始信号,右移开始信号
               
                wire done_L,done_R;                                                     //左移结束信号,右移结束信号
                wire [7:0] out_L,out_R;                                                        //连接子程序左移右移输出端口

                reg [5:0] i=0;                                                                                       


        always@(posedge clk)        begin                                                                                                //2
       
                                case(i)
                                        1'd0,1'd1,2'd2:begin if(done_R) begin start_R<=0;i<=i+1;end else begin start_R<=1;end end
                                        2'd3,3'd4,3'd5:begin if(done_L) begin start_L<=0;i<=i+1;end else begin start_L<=1; end end
                                        default: begin if(done==1) begin done<=0;i<=0;end else begin done<=1;i<=i+1 ;end end
                                endcase
                       
                        end                                                                //2      
                                        always@(*)        begin                                                                                                //3
                                                        if(start_R) led<=out_R;
                                                        else if(start_L)        led<=out_L;
                                                        else led<=3'dx;
                                                end                                                                                                //3
                       

led_left led_left1 (
    .clk(clk),
    .start_L(start_L),
    .done_L(done_L),
    .out_L(out_L)
    );
                  
led_right led_right1 (
    .clk(clk),
    .start_R(start_R),
    .done_R(done_R),
    .out_R(out_R)
    );

endmodule


module led_left(clk,start_L,done_L,out_L);                    //左移子程序
                input clk;
                input start_L;
                output reg done_L;
                output reg [7:0] out_L;
               
                reg [23:0] cout_L;
                reg [3:0] j;
                reg clk_50ms_L;                                                //分频
               
                always@(posedge clk)
                        begin                         //1
                                if(cout_L<12500000) begin       
                                if(start_L) cout_L<=cout_L+1;
                                else cout_L<=0;
                                end
                                else begin cout_L<=0;clk_50ms_L<=~clk_50ms_L; end
                        end                                                                //1

                always@(posedge clk_50ms_L)
                        begin                                                                                                        //2
                       
                                        if(start_L) begin                                                                                                //4
                                                case(j)
                                                0: begin out_L<=8'b1111_1110; j<=j+1; end
                                                1'd1,2'd2,2'd3,3'd4,3'd5,3'd6,3'd7:begin out_L<=out_L<<1; j<=j+1;end
                                                4'd8:        begin j<=j+1; done_L<=1; end
                                                default:        begin j<=0; done_L<=0; end
                                                endcase
                                        end                                                                                                //4
                        end                                                                                                        //2
endmodule


module led_right(clk,start_R,done_R,out_R);                //右移子程序
                input clk;
                input start_R;
                output reg done_R;
                output reg [7:0] out_R;                                                                //分频
               
                reg [23:0] cout_R;
                reg [3:0] k;
                reg clk_50ms_R;
               
                always@(posedge clk)
                        begin                                                                                        //1
                                if(cout_R<12500000) begin
                                if(start_R) cout_R<=cout_R+1;
                                else cout_R<=0;
                                end
                                else begin cout_R<=0;clk_50ms_R<=~clk_50ms_R; end
                        end                                                                                        //1

                always@(posedge clk_50ms_R)
                        begin                                                                                                        //2
                                        if(start_R)begin
                                                case(k)
                                                0: begin out_R<=8'b0111_1111; k<=k+1; end
                                                1'd1,2'd2,2'd3,3'd4,3'd5,3'd6,3'd7:begin out_R<=out_R>>1; k<=k+1;end
                                                4'd8:begin        k<=k+1; done_R<=1; end
                                                default:        begin k<=0; done_R<=0; end
                                                endcase
                                        end
                        end                                                                                                        //2
endmodule







点击此处下载 ourdev_664032HO3D28.doc(文件大小:741K) (原文件名:Verilog_HDL_建模技巧.doc)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-8-4 19:00:09 | 显示全部楼层
挺简单个事,让你写成这样,哎。。。。

出0入0汤圆

 楼主| 发表于 2011-8-4 21:05:38 | 显示全部楼层
回复【1楼】chenming1989  
-----------------------------------------------------------------------
额。。。如果觉得简单麻烦指点一下,谢谢,或者麻烦给个例板:实现左移3次,右移5次,再左移1次,再右移10次,再左移30次(本来题目是这样的)。。。其实我就是想通过复杂的流水灯,学习一下多文件建模。。。初学两个星期,所以水平有限。。。麻烦这位大哥方便的话帮帮忙。。谢谢。。

出0入0汤圆

发表于 2011-8-8 00:46:59 | 显示全部楼层
LZ的代码很纠结 verilog用得不多,一直用的VHDL
思路 实现个8位的moore型状态机 输入clk reset 输出q[7..0]   
状态1: 左移,计时3 clocks 后进入状态2
状态2:右移,计时5 clocks 后进入状态3
状态3: 左移,计时1 clocks 后进入状态4
...依次类推
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 13:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表