一、回顾
之前我们学习了FPGA学习(第3节)-Verilog实现LED流水灯+计数器+状态机+分频
http://blog.csdn.net/fengyuwuzu0519/article/details/72457366
我们将状态机、计数器、分配模块等放到了一个.V文件中,实现了流水灯功能。代码如下:
module test(clk,rst_n,led);
input clk ;
input rst_n ;
output reg [3:0]led ;
reg[1:0] state;
reg [31:0] counter;
reg clk_show;
always @ ( posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
clk_show<=0;
counter<=0;
end
else
if(counter<49999999)
counter<=counter+1;
else
begin
counter<=0;
clk_show=~clk_show;
end
end
always @ ( posedge clk_show or negedge rst_n)
begin
if(!rst_n)
begin
led<=4'b1111;
state<=0;
end
else
begin
case(state)
0:begin
led<=4'b0111;
state<=1;
end
1:begin
led<=4'b1011;
state<=2;
end
2:begin
led<=4'b1101;
state<=3;
end
3:begin
led<=4'b1110;
state<=0;
end
default:
state<=0;
endcase
end
end
endmodule
看一下以上代码的RTL电路:
二、现在采用模块的例化,实现层次化设计。
(1)分为三个.v文件来实现。
第一个是顶层文件top.v,里面只是负责例化模块,并连线。
第二个是分频模块freq.v,里面负责分频产生1秒的时钟。
第三个是LED状态机模块led.v,实现LED的操作。
(2)框图
(3)代码实现
top.v(负责例化子模块,只进行连线 wire)
module top(clk,rst_n,led);
input clk ;
input rst_n ;
output [3:0]led ;
wire clk_show;
freq freq(
.clk(clk),
.rst_n(rst_n),
.clk_show(clk_show)
);
led(
.clk(clk_show),
.rst_n(rst_n),
.led(led)
);
endmodule
freq.v
module freq(clk,rst_n,clk_show);
input clk ;
input rst_n ;
output reg clk_show;
reg [31:0] counter;
always @ ( posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
clk_show<=0;
counter<=0;
end
else
if(counter<49999999)
counter<=counter+1;
else
begin
counter<=0;
clk_show=~clk_show;
end
end
endmodule
led.v
module led(clk,rst_n,led);
input clk ;
input rst_n ;
output reg [3:0]led ;
reg[1:0] state;
always @ ( posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
led<=4'b1111;
state<=0;
end
else
begin
case(state)
0:begin
led<=4'b0111;
state<=1;
end
1:begin
led<=4'b1011;
state<=2;
end
2:begin
led<=4'b1101;
state<=3;
end
3:begin
led<=4'b1110;
state<=0;
end
default:
state<=0;
endcase
end
end
endmodule
看下RTL图: