流水燈的簡單設計
設計要求:低位點亮一個led,下一個周期,點亮兩個led,逐次增加led的個數,全部點亮後的下一個周期,又點亮一個led
該實驗需要兩個子產品,計數器子產品和led控制子產品
計數器子產品:就是一個分頻器,頻率為2hz,系統時鐘為50mhz,50_000_000/2=25_000_000,需要25位計數器。
led控制子產品:控制移位,到達全0時,led為全1。不斷循環點亮。
頂層子產品代碼:
module ledwater(clk,rst_n,led);
input clk;
input rst_n;
output [7:0]led;
parameter max_cnt=24_999_999;
reg [24:0]cnt;//計數器
always @(posedge clk or negedge rst_n)
if(!rst_n)
cnt <=25'd0;
else if(cnt==max_cnt)
else
cnt <=cnt + 1'b1;
reg [7:0]led_r;
always@(posedge clk or negedge rst_n)
led_r <= 8'b1111_1111;
else if(cnt == max_cnt)begin
led_r <= led_r << 1;
if(led_r==8'd0)
led_r <= 8'b1111_1111;
// else
// led_r <= led_r;//此處不應該有,邏輯不對
end
led_r <= led_r;
assign led = led_r;
endmodule
測試檔案隻需設定clk和rst_n
代碼:
`timescale 1ns/1ns
`define clk_period 20
module ledwater_tb;
reg clk;
reg rst_n;
wire [7:0]led;
ledwater
#(
.max_cnt(10)
)
ledwater0(
.clk(clk),
.rst_n(rst_n),
.led(led)
);
initial clk=1;
always #(`clk_period/2)clk= ~clk;
initial begin
rst_n=0;
#(`clk_period*30+1);
rst_n=1;
end
ps:測試檔案采用參數化設計
.max_cnt(10)
.clk(clk),
.rst_n(rst_n),
.led(led)
);
仿真波形: