流水灯并行设计
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:
。。。
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:
相关文章推荐
- 并行流水灯设计方法
- 并行口设计花样流水灯实验
- 并行口设计花样流水灯实验
- 基于HBASE的并行计算架构之rowkey设计篇
- 利用8031单片机,设计跑马灯和流水灯
- Java程序性能优化 读书笔记(十二)并行设计模式:Guarded Suspension模式
- 用于并行计算的多线程数据结构,第 2 部分: 设计不使用互斥锁的并发数据结构
- 并行口设计数字键盘实验
- 并行编程的设计模式
- 用于并行计算的多线程数据结构,第 1 部分: 设计并发数据结构
- 深入浅出多线程(6)分析并行包线程池的设计与实现
- Tiger Concurrent Practice --日志分析并行分解设计与实现
- 指令集并行流水线CPU设计
- [FPGA]基于Qsys的Nios II流水灯系统设计
- 基于FPGA与PCI总线的并行计算平台设计实现
- 多周期CPU设计——流水灯
- 并行JAVA程序设计模式Future模式
- FSM设计之二-----并行数据流转特殊串行数据流
- ASIC设计中一种通用型并行设计方法
- 单片机基础强化第一课 简单设计一个LED流水灯