FPGA基础入门篇(七) 多路分频器的实现(一)

FPGA基础入门篇(七) 多路分频器的实现(一)
本次实验实现多路分频器的设计,包括2分频、3分频、4分频、8分频,及2Hz的信号的实现。时钟采用100Mhz的系统系统时钟。
并实现仿真测试。

一、设计思路

FPGA的时钟采用100MHz,通过分频,设计如下的系统。然后通过chipscope在线调试分频的结果, 通过板子上的LED灯来显示2Hz的信号的时钟。
FPGA基础入门篇(七) 多路分频器的实现(一)_第1张图片

  1. 2分频:在每个时钟上升沿翻转一次,实现2分频。
  2. 3分频:定义两个2bit的计数器,分别对上升沿和下降沿进行计数累加。在定义两个寄存器,当计数器小于1时,两个寄存器均复制为1,其他情况均为0。最后将两个寄存器逻辑或,可以得到3分频。
  3. 4分频:定义一个2bit的计数器,对时钟计数,当计数为1或3时,信号翻转一次,其他保持,可实现4分频。
  4. 8分频:在2bit的计数器的基础上,可以在2’b00的情况下翻转,其他情况保持,可实现8分频
  5. 对于时钟为100MHz的FPGA,实现2hz的时钟,定义一个计数器,信号周期50倍的系统时钟周期,所以当计数24999999时,计数清零,并且信号反转,实现周期为0.5s的2Hz的周期。
二、程序设计
  1. verilog实现
module div_clk(
input clk_i,
input rst_n_i,
output div_2_o,
output div_4_o,
output div_8_o,
output div_3_o,
output div_2hz_o
);

//div_2 module
reg div_2;
always @(posedge clk_i or negedge rst_n_i)
begin
    if (! rst_n_i)begin
        div_2 <= 1'b0;
    end
    else 
        div_2 <= ~ div_2;
end
assign div_2_o = div_2;

//count module for div_4 div_8
reg [1:0]div_cnt;
always @(posedge clk_i or negedge rst_n_i)
begin
    if (! rst_n_i)begin
        div_cnt <= 2'b00;
    end
    else if (div_cnt == 2'b11)begin
        div_cnt <= 2'b00;
    end
    else
        div_cnt <= div_cnt + 1'b1;
end

reg div_4,div_8;

//div_4 mudule, 四分频可以二分频的基础上继续取反,类似二分频的方法得到
always @(posedge clk_i or negedge rst_n_i)
begin
    if (! rst_n_i)begin 
        div_4 <= 1'b0;
    end
    else if (div_cnt == 2'b00 || div_cnt == 2'b10)begin   
        div_4 <= ~ div_4;
    end
    else 
        div_4 <= div_4;
end
assign div_4_o = div_4;

//div_8 mudule
always @(posedge clk_i or negedge rst_n_i)
begin
    if (! rst_n_i)begin
        div_8 <= 1'b0;
    end
    else if ((~div_cnt[1]) && (~ div_cnt[0]))begin  //此处等价于 else if (div_cnt == 2'b00) begin
        div_8 <= ~ div_8;
    end
    else 
        div_8 <= div_8;
end
assign div_8_o = div_8;

//div_3 module
//pos_count module
reg [1:0] pos_cnt,neg_cnt;
always @(posedge clk_i or negedge rst_n_i)
begin
    if (! rst_n_i)begin
        pos_cnt <= 2'b00;
    end
    else if (pos_cnt == 2'b10)begin
        pos_cnt <= 2'b00;
    end
    else
        pos_cnt <= pos_cnt + 1'b1;
end

//neg_count module
always @(negedge clk_i or negedge rst_n_i)
begin
    if (! rst_n_i)begin
        neg_cnt <= 2'b00;
    end
    else if (neg_cnt == 2'b10)begin
        neg_cnt <= 2'b00;
    end
    else
        neg_cnt <= neg_cnt + 1'b1;
end

//count code
reg div_3_o1,div_3_o2;
always @(posedge clk_i or negedge rst_n_i)
begin
    if (! rst_n_i)begin
        div_3_o1 <= 1'b0;
    end
    else if (div_3_o1 < 1'b1)begin
        div_3_o1 <= 1'b1; 
    end
    else 
        div_3_o1 <= 1'b0;
end

always @(negedge clk_i or negedge rst_n_i)
begin
    if (! rst_n_i)begin
        div_3_o2 <= 1'b0;
    end
    else if (div_3_o2 < 1'b1)begin
        div_3_o2 <= 1'b1; 
    end
    else 
        div_3_o2 <= 1'b0;
end

assign div_3_o = div_3_o1 | div_3_o2; //div_3

//2hz module
//
reg [25:0] div_2hz_cnt;
reg div_2hz;
always @(posedge clk_i or negedge rst_n_i)
begin
    if (! rst_n_i)begin
        div_2hz_cnt <= 26'b0;
        div_2hz <= 1'b0;
    end
    else if (div_2hz_cnt == 26'd24_999999) begin
        div_2hz_cnt <= 26'b0;
        div_2hz <= ~ div_2hz;
    end
    else
    begin
        div_2hz_cnt <= div_2hz_cnt + 1'b1;
        div_2hz <= div_2hz;
    end
end
assign div_2hz_o = div_2hz;

endmodule

三、仿真测试
  1. 行为级仿真
    对于2、3、4、8分频的结果:
    FPGA基础入门篇(七) 多路分频器的实现(一)_第2张图片
    对于2hz的时钟:
    FPGA基础入门篇(七) 多路分频器的实现(一)_第3张图片
  2. 综合时序仿真
    1)先进行综合,然后进行综合时序仿真
    FPGA基础入门篇(七) 多路分频器的实现(一)_第4张图片
    FPGA基础入门篇(七) 多路分频器的实现(一)_第5张图片
    2)结果如下
    FPGA基础入门篇(七) 多路分频器的实现(一)_第6张图片
  3. 布局布线后时序仿真
    1)先编译,然后执行编译后时序仿真
    FPGA基础入门篇(七) 多路分频器的实现(一)_第7张图片
    FPGA基础入门篇(七) 多路分频器的实现(一)_第8张图片
    2)仿真结果:
    FPGA基础入门篇(七) 多路分频器的实现(一)_第9张图片
四、在线逻辑分析仪chipscope在线debug

前面一节在按键防抖电路设计中我们使用在信号前加(mark_debug = “true”)来标记信号。
本次介绍采用Xilinx的 ILA IP core 来实现被观察信号的采集。本质上和之前是一样的。

  1. 选择IP catalog ,找到debug中的ILA
    FPGA基础入门篇(七) 多路分频器的实现(一)_第10张图片
    FPGA基础入门篇(七) 多路分频器的实现(一)_第11张图片
  2. 双击打开ILA,并进行设置。
    FPGA基础入门篇(七) 多路分频器的实现(一)_第12张图片
  3. general options中观察信号设置为两组,一组用于放置触发信号,另一组用于放置普通端口信号。
    采样深度设置1024,数值越大,代表FPGA消耗的BRAM越大,采样深度越大,编译速度越慢。
    FPGA基础入门篇(七) 多路分频器的实现(一)_第13张图片
    probe ports 探针类似于示波器的表笔,只是,这里是FPGA的内部,我们用probe0检查2hz的信号,probe1检查其他端口的信号。
  4. 最后设置好后创建即可。
    FPGA基础入门篇(七) 多路分频器的实现(一)_第14张图片
    FPGA基础入门篇(七) 多路分频器的实现(一)_第15张图片
  5. 打开下面的文件
    FPGA基础入门篇(七) 多路分频器的实现(一)_第16张图片FPGA基础入门篇(七) 多路分频器的实现(一)_第17张图片
  6. 将上面的模块修改好后添加至顶层文件如下(probe1中用{}连接内部信号端口):
    FPGA基础入门篇(七) 多路分频器的实现(一)_第18张图片
  7. 最后进行综合>编译>产生bit流。
五、在线逻辑分析仪的使用
  1. 给开发板通电,接好JTAG接口。
    FPGA基础入门篇(七) 多路分频器的实现(一)_第19张图片
  2. 然后program device 可以看到有一个led会以2hz的频率闪烁。同时软件界面会出现如下:
    1:设置采样的启动停止和采样的方式
    2:设置触发信号
    3:被观察信号的名字
    4:被观察的信号波形
    5:触发模式的设置
    6:capture设置

FPGA基础入门篇(七) 多路分频器的实现(一)_第20张图片
FPGA基础入门篇(七) 多路分频器的实现(一)_第21张图片

你可能感兴趣的:(数字IC设计-FPGA)