bink LED
FPGA 学习笔记1
本系列文章用于记录FPGA学习过程, 类似流水账,不做总结提炼.
blink LED
设计
模块化设计, 这里分为 分频器, led控制器, 复位信号产生器.
实现
分屏器
module Clk_div
#(
parameter DIV = 5000
)(
input i_clk,
input i_rst,
output o_clk_div
);
parameter DIV_CNT = DIV/2;
reg [15:0] r_cnt = 0;
reg r_clk_div;
assign o_clk_div = r_clk_div;
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
r_cnt <= 0;
else if (r_cnt == DIV_CNT)
r_cnt <= 1;
else
r_cnt <= r_cnt + 1;
end
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
r_clk_div <= 0;
else if (r_cnt == DIV_CNT)
r_clk_div <= ~r_clk_div;
else
r_clk_div <= r_clk_div;
end
endmodule
坑: 一开始cnt没有赋初值, 还懒得写复位信号, 就会导致计数器一直不公正,因为没有处置
led 控制器
module LED_Driver
#(
parameter LED_NUMBER = 1,
parameter LED_ON = 1
)(
input i_ctl,
input i_en,
output [LED_NUMBER-1:0] o_led
);
reg [LED_NUMBER-1:0] r_led;
assign o_led = r_led;
always @ (*) begin
if(i_en) begin
r_led <= i_ctl;
end
else begin
r_led <= ~LED_ON;
end
end
endmodule
坑: 一直都是用的上升沿触发, 这里希望的是电平触发,结果没注意一直没信号
复位信号生成器
module rst_gen #(
parameter RST_CYCLE = 1
)(
input i_clk,
output o_rst
);
reg r_o_rst = 1;
reg [15:0] r_cnt = 0;
assign o_rst = r_o_rst;
always @(posedge i_clk) begin
if (r_cnt == RST_CYCLE) begin
r_o_rst <= 0;
end
else begin
r_o_rst <= 1;
end
end
always @(posedge i_clk) begin
if (r_cnt == RST_CYCLE) begin
r_cnt <= r_cnt;
end
else begin
r_cnt <= r_cnt + 1;
end
end
endmodule
作用, 每次上电后自动根据时钟生成一个RST_CYCLE长度的复位信号.因为只有每次上电的时候初值是0
blink led top
module top(
input i_clk,
output o_led
);
wire rst;
wire clk_8m;
wire clk_locked;
wire clk_1k;
wire led_ctl;
rst_gen rst_gen_inst
(
.i_clk (i_clk),
.o_rst (rst)
);
clk_8m clk_8m_inst
(
.clk_in1 (i_clk),
.clk_out1 (clk_8m),
.locked (clk_locked)
);
Clk_div #(
.DIV (8000)
) clk_div_inst0 (
.i_clk (clk_8m),
.i_rst (rst),
.o_clk_div (clk_1k)
);
Clk_div #(
.DIV (2000)
) clk_div_inst1 (
.i_clk (clk_1k),
.i_rst (rst),
.o_clk_div (led_ctl)
);
LED_Driver
#(
.LED_NUMBER (1),
.LED_ON (1)
) led_inst
(
.i_ctl (led_ctl),
.i_en (clk_locked),
.o_led (o_led)
);
用到一个IP clk, PLL, 作用是可以产生时钟? 但是却需要输入时钟, 更多的需要去了解PLL.
用到两个自己的分频器,因为好像一个不够, 不知道如果分频器的参数设置过大超出了16位寄存器的最大值会发生什么.
电平标准
- TTL: 三极管单端输出,
- COMS: MOS管单端输出--功率低,翻转快,不超过200M,建议小于150M使用
- LVDS: 低压差分信号
- LVPECL: 高速差分, 差值更大,抗干扰更强, 速度更快
- TMDS: 差分, 针对HDMI
- SSHT,HSTL:专用DDR存储器的单端输出
差分信号定义
使用原语, vivado 搜 OBUFDS. o-out, buf, DS-差分.
原语: 是fpga内部你硬核,使用电路实现的.
本文作者:天刚刚破晓
本文链接:https://www.cnblogs.com/tggpx/p/18387221
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步