|
看了一篇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, 杜汶泽)
|