看了一篇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) 挺简单个事,让你写成这样,哎。。。。 回复【1楼】chenming1989
-----------------------------------------------------------------------
额。。。如果觉得简单麻烦指点一下,谢谢,或者麻烦给个例板:实现左移3次,右移5次,再左移1次,再右移10次,再左移30次(本来题目是这样的)。。。其实我就是想通过复杂的流水灯,学习一下多文件建模。。。初学两个星期,所以水平有限。。。麻烦这位大哥方便的话帮帮忙。。谢谢。。 LZ的代码很纠结 verilog用得不多,一直用的VHDL
思路 实现个8位的moore型状态机 输入clk reset 输出q
状态1: 左移,计时3 clocks 后进入状态2
状态2:右移,计时5 clocks 后进入状态3
状态3: 左移,计时1 clocks 后进入状态4
...依次类推
页:
[1]