说明一下 我用的是Actel的A3PO30板 晶振是48M的 程序解释得很详细
首先是分频的模块
module clk_div
(
clk, //时钟输入,48M
reset, //异步复位输入,高电平复位
clk_out //分频时钟输出
);
parameter cnt_top=24'd24000000; //分频系数 每24000000个时钟周期变一次 刚好0.5S
input clk; //端口定义
input reset;
output clk_out;
reg clk_out; //寄存器定义
reg [24:0] clk_cnt;
always @(posedge clk or negedge reset)
begin
if(!reset) //复位
begin
clk_out <= 1'b0;
clk_cnt <= 0;
end
else
begin
if(clk_cnt==cnt_top-1)
begin
clk_out <= ~clk_out; //分频输出
clk_cnt <= 0;
end
else
clk_cnt <= clk_cnt+1'b1; //计数器加1
end
end
endmodule
接着是显示模块
module ledstate(
clk, //时钟输入,48M
reset, //复位输入,低电平有效
wei_out, //数码管的位选
data_out //数码管数据输出
);
input clk;
input reset;
output [3:0]wei_out;
reg [3:0]wei;
output [6:0]data_out; //输出段数据
reg [6:0]dout; //寄存器定义
wire clk_out; //计数的时钟,分频得到,周期:1S
reg [3:0] sts;
parameter st1 = 4'b0001, //状态机状态1参数定义
st2 = 4'b0010, //状态机状态2参数定义
st3 = 4'b0100, //状态机状态3参数定义
st4 = 4'b1000; //状态机状态4参数定义
always @(posedge clk_out or negedge reset) // 每一个状态持续一个clk_out的周期
begin
if(!reset)
begin
dout<= 7'b1111111; //复位的时候数码管全灭
wei<= 4'b1111;
sts <= st1;
end
else
case(sts)
st1: //状态1
begin
wei<= 4'b1110;
dout <= 7'b100_0000;
sts <= st2;
end
st2: //状态2
begin
wei<= 4'b1101;
dout <= 7'b111_1001;
sts <= st3;
end
st3: //状态3
begin
dout <= 7'b010_0100;
wei<= 4'b1011;
sts <= st4;
end
st4: //状态4
begin
wei<= 4'b0111;
dout <= 7'b011_0000;
sts <= st1;
end
default:
sts <= st1; //复位的时候值为st1
endcase
end
assign data_out=dout;
assign wei_out=wei;
clk_div clk_div_0( //分配得到2S的时钟,便于观察
.clk(clk), //时钟输入,48M
.reset(reset), //异步复位输入,高电平复位
.clk_out(clk_out) //分频时钟输出
);
endmodule
用户1580736 2011-3-18 11:44