例化MMCM ip核,产生100Mhz,100Mhz并相位偏移180,50Mhz,25Mhz的时钟信号。
例化单口ram,并编写读写控制器,实现32个数据的写入与读出。
模块框图:
代码:
module ip_top(
input wire sys_clk ,
input wire sys_rst_n ,
output wire [7:0] douta ,
output wire clk_100Mhz ,
output wire clk_100Mhz_180Phase ,
output wire clk_50Mhz ,
output wire clk_25Mhz
);
// 例化间连�??
wire locked ;
// wire clk_50Mhz ;
//ila_0 ila_0_inst(
// .clk ( clk_100Mhz ) ,
// .probe0 ( clk_100Mhz ) ,
// .probe1 ( clk_100Mhz_180Phase ) ,
// .probe2 ( clk_50Mhz ) ,
// .probe3 ( clk_25Mhz )
//);
wire ENA ;
wire WEA ;
wire [4:0] ADDRA ;
wire [7:0] DATA_INA;
wire rst_n ;
assign rst_n = sys_rst_n && locked ;
clk_wiz_0 clk_wiz_0_inst(
.clk_in1 ( sys_clk ) ,
.resetn ( sys_rst_n ) ,
.locked ( locked ) ,
.clk_out1 ( clk_100Mhz ) ,
.clk_out2 ( clk_100Mhz_180Phase ) ,
.clk_out3 ( clk_50Mhz ) ,
.clk_out4 ( clk_25Mhz )
);
ram_wrA ram_wrA_inst(
.sys_clk ( clk_50Mhz ) ,
.sys_rst_n ( rst_n ) ,
.ENA ( ENA ) ,
.WEA ( WEA ) ,
.ADDRA ( ADDRA ) ,
.DATA_INA ( DATA_INA )
);
blk_mem_gen_0 blk_mem_gen_0_inst(
.clka ( clk_50Mhz ) ,
.ena ( ENA ) ,
.wea ( WEA ) ,
.addra ( ADDRA ) ,
.dina ( DATA_INA ) ,
.douta ( douta )
);
endmodule
module ram_wrA (
input wire sys_clk ,
input wire sys_rst_n ,
output reg ENA ,
output reg WEA ,
output wire [4:0] ADDRA ,
output wire [7:0] DATA_INA
);
parameter DATA_NUM = 32 ;
reg [4:0] cnt_wr ; // 读写计数器。
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n)
cnt_wr <= 5'd0 ;
else if(ENA && (cnt_wr == DATA_NUM - 1))
cnt_wr <= 5'd0 ;
else if(ENA)
cnt_wr <= cnt_wr + 1'b1 ;
else
cnt_wr <= 5'd0 ;
end
// output reg ENA ,
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n)
ENA <= 1'b0 ;
else
ENA <= 1'b1 ;
end
// output reg WEA ,
always @(posedge sys_clk or negedge sys_rst_n) begin
if(~sys_rst_n)
WEA <= 1'b1 ;
else if(cnt_wr == DATA_NUM - 1)
WEA <= ~WEA ;
end
// output wire [4:0] ADDRA ,
// output wire [4:0] DATA_INA
assign ADDRA = cnt_wr ;
assign DATA_INA = {3'b000,cnt_wr} ;
endmodule
`timescale 1ns/1ns
module test();
reg sys_clk ;
reg sys_rst_n ;
wire [7:0] douta ;
wire clk_100Mhz ;
wire clk_100Mhz_180Phase ;
wire clk_50Mhz ;
wire clk_25Mhz ;
ip_top ip_top_inst(
.sys_clk ( sys_clk ) ,
.sys_rst_n ( sys_rst_n ) ,
.douta ( douta ) ,
.clk_100Mhz ( clk_100Mhz ) ,
.clk_100Mhz_180Phase ( clk_100Mhz_180Phase ) ,
.clk_50Mhz ( clk_50Mhz ) ,
.clk_25Mhz ( clk_25Mhz )
);
parameter CYCLE = 20 ;
initial begin
sys_clk = 1'b1 ;
sys_rst_n <= 1'b0 ;
#( CYCLE * 10 ) ;
sys_rst_n <= 1'b1 ;
#(CYCLE * 3000) ;
$stop ;
end
always #( CYCLE / 2 ) sys_clk = ~sys_clk ;
endmodule
// `timescale 1ns/1ns
// module test();
// reg sys_clk ;
// reg sys_rst_n ;
// wire clk_100Mhz ;
// wire clk_100Mhz_180Phase ;
// wire clk_50Mhz ;
// wire clk_25Mhz ;
// ip_top ip_top_inst(
// .sys_clk ( sys_clk ) ,
// .sys_rst_n ( sys_rst_n ) ,
// .clk_100Mhz ( clk_100Mhz ) ,
// .clk_100Mhz_180Phase ( clk_100Mhz_180Phase ) ,
// .clk_50Mhz ( clk_50Mhz ) ,
// .clk_25Mhz ( clk_25Mhz )
// );
// parameter CYCLE = 20 ;
// initial begin
// sys_clk = 1'b1 ;
// sys_rst_n <= 1'b0 ;
// #( CYCLE * 10 ) ;
// sys_rst_n <= 1'b1 ;
// #(CYCLE * 3000) ;
// $stop ;
// end
// always #( CYCLE / 2 ) sys_clk = ~sys_clk ;
// endmodule