您的位置:首页 > 其它

流水灯并行设计

2015-04-15 11:56 134 查看
好纠结的流水灯设计,看完书上例子,分析模块,自己再重新编写一遍,各种错,仿真不正确。纠结三个小时,终于成功了,无语凝噎泪两行。。。先哭会

。。。

1、直接上程序吧:

(1)、led1

module Led1(clk,reset,LED_Out);

input clk,reset;

output LED_Out;

parameter T100MS=8'd40;

reg [7:0]count;

reg led_out;

always @(posedge clk,negedge reset)

if(!reset)

count<=8'd0;

else if(count==T100MS)

count<=8'd0;

else

count<=count+1'b1;

always @(count,negedge reset)

if(!reset)

led_out=1'b0;

else if(count<8'd10&&count>=8'd0)

led_out=1'b1;

else

led_out=1'b0;

assign LED_Out=led_out;

endmodule

(2)led2

module Led2(clk,reset,LED_Out);

input clk,reset;

output LED_Out;

parameter T100MS=8'd40;

reg [7:0]count;

reg led_out;

always @(posedge clk,negedge reset)

if(!reset)

count<=8'd0;

else if(count==T100MS)

count<=8'd0;

else

count<=count+1'b1;

always @(count,negedge reset)

if(!reset)

led_out=1'b0;

else if(count>=8'd10&&count<23'd20)

led_out=1'b1;

else

led_out=1'b0;

assign LED_Out=led_out;

endmodule

(3)、led3

module Led3(clk,reset,LED_Out);

input clk,reset;

output LED_Out;

parameter T100MS=8'd40;

reg [7:0]count;

reg led_out;

always @(posedge clk,negedge reset)

if(!reset)

count<=8'd0;

else if(count==T100MS)

count<=8'd0;

else

count<=count+1'b1;

always @(count,negedge reset)

if(!reset)

led_out=1'b0;

else if(count>=8'd20&&count<23'd30)

led_out=1'b1;

else

led_out=1'b0;

assign LED_Out=led_out;

endmodule

(4)、led4

module Led4(clk,reset,LED_Out);

input clk,reset;

output LED_Out;

parameter T100MS=8'd40;

reg [7:0]count;

reg led_out;

always @(posedge clk,negedge reset)

if(!reset)

count<=8'd0;

else if(count==T100MS)

count<=8'd0;

else

count<=count+1'b1;

always @(count,negedge reset)

if(!reset)

led_out=1'b0;

else if(count>=8'd30&&count<8'd40)

led_out=1'b1;

else

led_out=1'b0;

assign LED_Out=led_out;

endmodule

(5)top顶层模块

`include "Led1.v"

`include "Led2.v"

`include "Led3.v"

`include "Led4.v"

module Top_Led_module(LED_OUT,CLK,RST);

output [3:0]LED_OUT;

input CLK,RST;

wire led_out1;

Led1 led1(CLK,RST,led_out1);

wire led_out2;

Led2 led2(CLK,RST,led_out2);

wire led_out3;

Led3 led3(CLK,RST,led_out3);

wire led_out4;

Led4 led4(CLK,RST,led_out4);

assign LED_OUT={led_out4,led_out3,led_out2,led_out1};

endmodule

(6)单个led灯仿真模块

`include "Led4.v"

module stimulus1;

reg clk;

reg reset;

//wire [7:0]count;

wire LED_out;

Led4 led(clk,reset,LED_out);

initial

begin

clk=0;

forever #5 clk=~clk;

end

initial

begin

reset=0;

#10 reset=1;

#650 reset=0;

end

endmodule

(7)、顶层模块仿真:

`include "Top_Led_module.v"

module LED_stimulus;

reg clk;

reg reset;

wire [3:0]LED_out;

Top_Led_module led(LED_out,clk,reset);

initial

begin

clk=0;

forever #5 clk=~clk;

end

initial

begin

//reset=0;

#10 reset=1;

#650 reset=0;

end

endmodule

2、现在改说说仿真过程中出现的问题:

(1)、开始仿真时,一直都是手动添加激励仿真,这样效率不高,而且容易出错,以后还是别采取这种方法了。

(2)、在写顶层模块的testbench时,对reset的设值要非常注意,开始直接写成

initial

begin

reset=0;

#10 reset=1;

#150 reset=0;

#250 reset=1;

End

这样,led2,led3,led4都没能正确仿真,或者说没有等到led2~4输出1值,就重新复位了,所以要注意仿真程序里面output的一个完整的仿真周期是什么,reset值改变的延迟至少要大于这个周期。

(3)、这个地方的reset=0,相当于给局部变量count初始化赋值,一定不可以省。否则,count初值为x,led_out也为xxxx。仿真出来的波形如下:


因此 ,在写testbench时一定要注意对各变量初始值及变化值的设定

(4)、很致命的一点,在编程led1~4和定义顶层模块的端口声明时,输出端口和输入端口的顺序不一致,(这个错误犯了好多次)

Led1 :module Led1(clk,reset,LED_Out);

顶层模块:module Top_Led_module(LED_OUT,CLK,RST);

结果在顶层模块调用led1时,写成Led1 led1(led_out1,CLK,RST);

此时,顶层模块的仿真结果LED_Out的就显示为高阻值zzzz。

(5)、端口名称是区分大小写的,但编码时,大小写总是乱用。

3、各模块仿真图形:

(1)led1:



(2)led2:



(3)led3:



(4) led4:



(5)top_led:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: