1) pll ip测试
- 非常简单,没有任何逻辑。
- 需要注意的是:不要带转接板,长线会导致时钟的毛刺非常大,占空比也失真了。
- 如果直接在zynq GPIO扩展口这里测,效果好很多。
2) fifo ip测试
- fifo ip采用单个时钟,位宽8bits,深度32
- 采用key1启动fifo写,key2启动fifo读
- 设计了一个通用的gen_tx_data.v,它可以定时产生读/写pulse,并伴随着读写data。后续这个还可以再扩充一下功能。
fifo仿真
module test_fifo_ip(
input clk,
input rst_n,
input key1,
input key2
);
key_filter
#(.CNT_MAX(50))
u_key_filter_wr(
.sys_clk(clk),
.sys_rst_n(rst_n),
.key_in(key1),
.key_flag(write_pulse)
);
key_filter
#(.CNT_MAX(50))
u_key_filter_rd(
.sys_clk(clk),
.sys_rst_n(rst_n),
.key_in(key2),
.key_flag(read_pulse)
);
wire [7:0] po_wr_data;
wire [7:0] po_rd_data;
wire [4:0] data_count;
gen_tx_data
#(.FCLK(50_000),
.EVENT_MAX(35)
)
u_gen_wr_data(
.clk(clk),
.rst_n(rst_n),
.pi_start_pulse(write_pulse),
.po_start_pulse(po_wr_start_pulse),
.po_data(po_wr_data)
);
gen_tx_data
#(.FCLK(50_000),
.EVENT_MAX(35)
)
u_gen_rd_data(
.clk(clk),
.rst_n(rst_n),
.pi_start_pulse(read_pulse),
.po_start_pulse(po_rd_start_pulse),
.po_data()
);
fifo_generator_0 u_fifo_generator_0 (
.clk(clk), // input wire clk
.rst(~rst_n), // input wire rst
.din(po_wr_data), // input wire [7 : 0] din
.wr_en(po_wr_start_pulse), // input wire wr_en
.rd_en(po_rd_start_pulse), // input wire rd_en
.dout(po_rd_data), // output wire [7 : 0] dout
.full(full), // output wire full
.empty(empty), // output wire empty
.data_count(data_count) // output wire [4 : 0] data_count
);
endmodule
module gen_tx_data(
input clk,
input rst_n,
input pi_start_pulse,
output reg po_start_pulse,
output reg [7:0] po_data
);
parameter FCLK=50_000_000;
parameter DLY_MS=FCLK/100;
parameter EVENT_MAX=10;
reg [19:0] timer;
reg [5:0] event_t;
wire timer_flag;
reg work_en;
wire [5:0] event_o;
always @(posedge clk or negedge rst_n)
if(rst_n==0)
work_en<=0;
else if(pi_start_pulse==1)
work_en<=1;
else if(event_t==EVENT_MAX)
work_en<=0;
always @(posedge clk or negedge rst_n)
if(rst_n==0)
timer<=0;
else if(timer==DLY_MS-1)
timer<=0;
else
timer<=timer+1;
assign timer_flag=(timer==DLY_MS-1)&&(work_en==1);
always @(posedge clk or negedge rst_n)
if(rst_n==0)
event_t<=0;
else if(event_t==EVENT_MAX)
event_t<=0;
else if(timer_flag)
event_t<=event_t+1;
assign event_o=timer_flag? event_t: 0; //generate counter-value pulse
always @(posedge clk or negedge rst_n)
if(rst_n==0) begin
po_start_pulse<=0;
po_data<=0;
end
else if(event_o)
task_send_data(event_o);
else
po_start_pulse<=0;
task task_send_data;
input [7:0] data_in;
begin
po_start_pulse<=1;
po_data<=data_in;
end
endtask
endmodule
fifo仿真结果
- 由于fifo深度只有32,而读/写了34个数据,因此写最多只写入了32个,读出最多只读出了32个。
fifo测试
- key+fifo+seg7_disp
- 这里说明一下,key+seg7_disp以后所有的工程都可以考虑使用,非常便捷。
`timescale 1ns / 1ps
module test_fifo_ip(
input clk,
input rst_n,
input key1,
input key2,
output wire [5:0] sel,
output wire [7:0] seg,
output empty,
output full,
output po_wr_start_pulse,
output po_rd_start_pulse
);
key_filter
//#(.CNT_MAX(50))
u_key_filter_wr(
.sys_clk(clk),
.sys_rst_n(rst_n),
.key_in(key1),
.key_flag(write_pulse)
);
key_filter
//#(.CNT_MAX(50))
u_key_filter_rd(
.sys_clk(clk),
.sys_rst_n(rst_n),
.key_in(key2),
.key_flag(read_pulse)
);
wire [7:0] po_wr_data;
wire [7:0] po_rd_data;
wire [4:0] data_count;
gen_tx_data
#(
//.FCLK(50_000),
.EVENT_MAX(50)
)
u_gen_wr_data(
.clk(clk),
.rst_n(rst_n),
.pi_start_pulse(write_pulse),
.po_start_pulse(po_wr_start_pulse),
.po_data(po_wr_data)
);
gen_tx_data
#(
//.FCLK(50_000),
.EVENT_MAX(50)
)
u_gen_rd_data(
.clk(clk),
.rst_n(rst_n),
.pi_start_pulse(read_pulse),
.po_start_pulse(po_rd_start_pulse),
.po_data()
);
fifo_generator_0 u_fifo_generator_0 (
.clk(clk), // input wire clk
.rst(~rst_n), // input wire rst
.din(po_wr_data), // input wire [7 : 0] din
.wr_en(po_wr_start_pulse), // input wire wr_en
.rd_en(po_rd_start_pulse), // input wire rd_en
.dout(po_rd_data), // output wire [7 : 0] dout
.full(full), // output wire full
.empty(empty), // output wire empty
.data_count(data_count) // output wire [4 : 0] data_count
);
//------------- seg_dynamic_inst -------------
seg_dynamic
//#(.CNT_MAX(500))
seg_dynamic_inst
(
.sys_clk (clk ), //绯荤粺鏃堕挓锛岄鐜?50MHz
.sys_rst_n (rst_n ), //澶嶄綅淇″彿锛屼綆鏈夋晥
.data (po_rd_data ), //鏁扮爜绠¤鏄剧ず鐨勫??
.point ( ), //灏忔暟鐐规樉绀?,楂樼數骞虫湁鏁?
.seg_en (1'b1 ), //鏁扮爜绠′娇鑳戒俊鍙凤紝楂樼數骞虫湁鏁?
.sign ( ), //绗﹀彿浣嶏紝楂樼數骞虫樉绀鸿礋鍙?
.sel (sel ), //鏁扮爜绠′綅閫変俊鍙?
.seg (seg ) //鏁扮爜绠℃閫変俊鍙?
);
endmodule
- 最大读写数据量是50,而fifo深度是32,所以可以看到读写到31个就停止了。empty和full信号的行为符合预期。