output register对输出时序的影响
rom ip核可选择是否使用输出寄存器(output register),这会影响从rom读取数据的时序。
- 不使用output register
在不使用output register时,在时钟第一个上升沿,在ADDRA上采样得到数据地址为AA。在时钟第二个上升沿处,对读出数据douta采样,得到数据为Data(AA)。 - 使用output register
在使用output register时,在时钟的第一个上升沿,在ADDRA上采样得到数据地址为AA,在时钟的第三个上升沿处,对读出数据douta采样,得到数据为Data(AA)。
因此,使用output register时,读数据会比不使用output register晚一个时钟。
举例
- 设计文件代码(使用output register)
`timescale 1ns / 1ps
module bit(
input rst ,
input bit_clk ,
output bit ,
output bit_valid
);
reg [7:0] addra;
reg bit_valid0;
reg bit_valid1;
bit_rom u_bit_rom(
.clka(bit_clk), // input wire clka
.ena(1'b1), // input wire ena
.addra(addra), // input wire [7 : 0] addra
.douta(bit) // output wire [0 : 0] douta
);
always@(posedge bit_clk)begin
if(rst)begin
addra<=8'b0;
bit_valid0<=1'b0;
bit_valid1<=1'b0;
end
else begin
addra<=addra+1'b1;
bit_valid0<=1'b1;
bit_valid1<=bit_valid0;
end
end
assign bit_valid=bit_valid1;
endmodule
- 仿真文件代码
`timescale 1ns / 1ps
module tb_bit();
reg rst;
reg bit_clk;
wire bit;
wire bit_valid;
initial begin
rst=1;
bit_clk=0;
#200
rst=0;
end
always #10 bit_clk=~bit_clk;
bit u_bit(
.rst (rst ),
.bit_clk (bit_clk ),
.bit (bit ),
.bit_valid(bit_valid)
);
integer bit_file;
initial begin
bit_file=$fopen("G:/graduation_project/verilog/project_bpsk/bpsk_dsss/bpsk_dsss.srcs/txt/bit.txt");
end
always@(posedge bit_clk)begin
if(bit_valid)
$fdisplay(bit_file,"%d",bit);
end
// 注意斜杠方向,每次仿真都会清空txt然后重新写入
endmodule