2024-08-29 23:31阅读: 12评论: 0推荐: 0

bink LED

FPGA 学习笔记1

本系列文章用于记录FPGA学习过程, 类似流水账,不做总结提炼.

设计

模块化设计, 这里分为 分频器, 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

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 中国大陆许可协议进行许可。

posted @   天刚刚破晓  阅读(12)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起