Xilinx FPGA BRAM 实践笔记(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24815615/article/details/89843000

本笔记实现的功能是:

通过BRAM中的16位位宽的数据,控制16个LED等闪烁。

BRAM的配置为single dual BRAM

16位位宽,深度也是16位

初始化文件 mem.coe

memory_initialization_radix=16;
memory_initialization_vector=fff0 ff0f f0ff 0fff fff0 ff0f f0ff 0fff fff0 ff0f f0ff 0fff fff0 ff0f f0ff 0fff;
 

top文件 ov5640_top.v

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2019/05/04 21:38:16
// Design Name: 
// Module Name: ov5640_top
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module ov5640_top(
    input clk,
    input rst_n,
    input sw0,
    output reg[15:0]led
    );

reg         ena;

reg         enb;

reg         wea;

reg[3:0]    addra;

reg[3:0]    addrb;

reg[15:0]   dina;

// blk_mem_gen_0  outputs

wire[15:0]  douta;

wire[15:0]  doutb;

/**************简单双端口RAM   A进B出**************/

blk_mem_gen_0   blk_mem_gen_m0

(

    .clka(clk),                //BRAM 输入时钟信号

    .ena(ena),                  //BRAM 时钟使能信号

    .wea(wea),                  //写使能信号

    .addra(addra),              //地址信号

    .dina(dina),                //数据输入接口   写入

         

    .clkb(clk),                 //BRAM 输入时钟信号

    .enb(enb),                  //BRAM 时钟使能信号

    .addrb(addrb),              //地址信号

    .doutb(doutb)    

);

initial
    begin
    ena = 0;
    
    enb = 0;
    
    wea = 0;
    
    addra = 0;
    
    addrb = 0;
    
    dina = 0;
    end

reg [31:0] cnt = 32'h0;

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        cnt = 32'h0;
    else if(cnt == 32'h2fa_f080)
        begin
            cnt <= 32'h0;
            if(addrb == 4'h3)
                addrb = 4'h00;
            else
                addrb <= addrb + 1;
        end
    else
        begin
            cnt <= cnt+1;
    //        addrb  = 1;
            enb <= 1;
            led <= doutb;
        end
end

endmodule
 

约束文件 

set_property -dict {PACKAGE_PIN P17 IOSTANDARD LVCMOS33} [get_ports clk]
set_property -dict {PACKAGE_PIN P15 IOSTANDARD LVCMOS33} [get_ports rst_n]
set_property -dict {PACKAGE_PIN P5 IOSTANDARD LVCMOS33} [get_ports sw0]

set_property -dict {PACKAGE_PIN F6 IOSTANDARD LVCMOS33} [get_ports {led[0]}]
set_property -dict {PACKAGE_PIN G4 IOSTANDARD LVCMOS33} [get_ports {led[1]}]
set_property -dict {PACKAGE_PIN G3 IOSTANDARD LVCMOS33} [get_ports {led[2]}]
set_property -dict {PACKAGE_PIN J4 IOSTANDARD LVCMOS33} [get_ports {led[3]}]
set_property -dict {PACKAGE_PIN H4 IOSTANDARD LVCMOS33} [get_ports {led[4]}]
set_property -dict {PACKAGE_PIN J3 IOSTANDARD LVCMOS33} [get_ports {led[5]}]
set_property -dict {PACKAGE_PIN J2 IOSTANDARD LVCMOS33} [get_ports {led[6]}]
set_property -dict {PACKAGE_PIN K2 IOSTANDARD LVCMOS33} [get_ports {led[7]}]
set_property -dict {PACKAGE_PIN K1 IOSTANDARD LVCMOS33} [get_ports {led[8]}]
set_property -dict {PACKAGE_PIN H6 IOSTANDARD LVCMOS33} [get_ports {led[9]}]
set_property -dict {PACKAGE_PIN H5 IOSTANDARD LVCMOS33} [get_ports {led[10]}]
set_property -dict {PACKAGE_PIN J5 IOSTANDARD LVCMOS33} [get_ports {led[11]}]
set_property -dict {PACKAGE_PIN K6 IOSTANDARD LVCMOS33} [get_ports {led[12]}]
set_property -dict {PACKAGE_PIN L1 IOSTANDARD LVCMOS33} [get_ports {led[13]}]
set_property -dict {PACKAGE_PIN M1 IOSTANDARD LVCMOS33} [get_ports {led[14]}]
set_property -dict {PACKAGE_PIN K3 IOSTANDARD LVCMOS33} [get_ports {led[15]}]

猜你喜欢

转载自blog.csdn.net/qq_24815615/article/details/89843000