lsjshengll 发表于 2011-8-4 09:32:22

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

看了一篇verilog建模的文章,就写了个led左移三次,右移三次的程序,一直不行,麻烦帮帮忙,程序很短的。。谢谢
程序和那篇文章如下。。。。文章说是一种低级建模的思想。。。。我的程序一直都是左移一次,马上又右移了。。接着就听了。。试了一晚不知道什么问题。。。T T 麻烦帮帮忙。。谢谢。。


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



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

                reg 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 out_L;
               
                reg cout_L;
                reg 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 out_R;                                                                //分频
               
                reg cout_R;
                reg 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)

chenming1989 发表于 2011-8-4 19:00:09

挺简单个事,让你写成这样,哎。。。。

lsjshengll 发表于 2011-8-4 21:05:38

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

volevole 发表于 2011-8-8 00:46:59

LZ的代码很纠结 verilog用得不多,一直用的VHDL
思路 实现个8位的moore型状态机 输入clk reset 输出q   
状态1: 左移,计时3 clocks 后进入状态2
状态2:右移,计时5 clocks 后进入状态3
状态3: 左移,计时1 clocks 后进入状态4
...依次类推
页: [1]
查看完整版本: 看了一篇verilog建模的文章,就写了个led左移三次,右移三次的程序,一直不行,麻烦帮帮忙,程