逻辑设计
共八个LED灯,每隔一秒亮一个。时钟为10MHz,0~9999999为1秒,表示到9999999需要2进制24位。8位LED灯用一个8位数组表示,24位数组来计数,依次点亮使用左移寄存器来实现;按键按下SW7开始工作,按下SW4停止工作,且寄存器不变
**TIPS:**兆赫只是一定义上的名词,在量度单位上作100万解。
模块设计
整体分为三个模块:
- light_flow_clk_rst:负责系统的时钟和复位;
- light_flow_top:顶层模块:
- light_flow:主模块,负责整体的控制程序
1.light_flow_clk_rst
`timescale 1ns/1ps
module light_flow_clk_rst(
//clk&rst
input I_sys_clk_50M, //外部时钟晶振为50MHz
input I_sys_rst_50M, //复位,按键控制,按下之后复位有效
output O_row0_en, //
output O_clk, //输出的10MHz时钟
output O_rst //输出复位信号
);
wire sys_rst_50M; //PLL的复位信号,高有效
wire clk;
wire rst;
wire pll_locked; //pll的输出有效信号,类似一个使能信号
reg rst_d1; // 这里的解释是为了防止复位信号亚稳态,将rst寄存
reg rst_d2; //两拍
assign sys_rst_50M=~I_sys_rst_50M;//因为按键按下去才为低信号,取反
assign rst=sys_rst_50M|~pll_locked;//在复位信号有效或者pll输出无效时进行复位
//防止亚稳态将复位信号进行寄存
always@(posedge clk,posedge sys_rst_50M)
begin
if(sys_rst_50M)
begin
rst_d1<=1'b1;
rst_d2<=1'b1;
end
else
begin
rst_d1<=rst;
rst_d2<=rst_d1;
end
end
assign O_rst=rst_d2;
assign O_clk=clk;
assign O_row0_en = 1'b0;
//例化PLL ip核
pll pll_inst(
.clk_in1(I_sys_clk_50M),
.reset(sys_rst_50M),
.clk_out1(clk), //输出10MHz
.locked(pll_locked)
);
endmodule
2.light_flow_mytest
`timescale 1ns/1ps
module light_flow(
input I_clk, //10M的时钟
input I_rst, //复位信号
input I_start, //按键SW7开始按键
input I_stop, //按键SW4停止按键
output

该博客详细介绍了使用FPGA实现跑马灯实验的逻辑设计,包括时钟和复位模块light_flow_clk_rst、主逻辑模块light_flow以及顶层模块light_flow_top。设计中使用了8个LED,每秒点亮一个,并通过按键SW7启动和SW4停止。时钟频率为10MHz,采用24位计数器实现秒计数,利用左移寄存器控制LED的循环点亮。同时,博客还包含了约束文件light_flow_mytest.xdc,用于配置引脚分配。
最低0.47元/天 解锁文章
4954

被折叠的 条评论
为什么被折叠?



