Verilog プログラミング - イベント/パルス融合



序章

今年の海康のインターンシップ機械テストに関する別の質問を記録しましょう。これは比較的簡単です。異なる時間に到来する複数のインパルス信号の融合について。

トピックの説明

eof は 1 つのイベントの終了パルスを示します。順序が不確かな 2 つのイベントが終了したことを示すには、2 つの終了パルスを融合して 1 つのパルスを出力する必要があり、次のコードをクリアして改善する必要があります。 

module event_merge(
input 				clk,
input 				rst_n,
input 				eof1,//脉冲信号,时长:1个clock
input 				eof2,//脉冲信号,时长:1个clock
output wire 		eof
    );

一連の考え

最も単純なアイデアはパルスをカウントすることですが、もちろん、バグを避けるためにイベント パルスの同時到着も考慮する必要があります。他にアイデアがある場合は、コメント欄にコメントしてください~~

問題解決

設計コード:


// ========================================================================
// 功能描述:-1- 将两个事件脉冲融合为1个脉冲
// 作者:Xu Y. B.
// 时间:2023-05-08
// ========================================================================

`timescale 1ns / 1ps
module event_merge(
input 				clk,
input 				rst_n,
input 				eof1,//脉冲信号,时长:1个clock
input 				eof2,//脉冲信号,时长:1个clock
output wire 		eof
    );

reg [1:0] count;

always @ (posedge clk)
begin
	if(~rst_n)
	begin
		count <= 0;
	end
	else if(count == 2)
	begin
		count <= 0;
	end
	else if(&{eof1,eof2})
	begin
		count <= 2;
	end
	else if(|{eof1,eof2})
	begin
		count <= count + 1;
	end
end

assign eof = count == 2;
endmodule

シミュレーションコード:


// ========================================================================
// 功能描述:-1- 仿真测试模块 event_merge 功能
// 作者:Xu Y. B.
// 时间:2023-05-08
// ========================================================================

`timescale 1ns / 1ps
module tb_event_merge();

reg 				clk;
reg 				rst_n;
reg 				eof1;//脉冲信号,时长:1个clock
reg 				eof2;//脉冲信号,时长:1个clock
wire 				eof;

initial clk = 0;
always #10 clk = ~clk;

initial
begin
	rst_n = 0;
	eof1 = 0;
	eof2 = 0;
	#103;
	@(posedge clk)
	rst_n <= 1'b1;

// case1  :  eof2 先到来 ,eof1 后到来 
	#1034;
	@(posedge clk)
	eof2 <= 1'b1;
	@(posedge clk)
	eof2 <= 1'b0;
	#2098;
	@(posedge clk)
	eof1 <= 1'b1;
	@(posedge clk)
	eof1 <= 1'b0;

// case2  :  eof1 先到来 ,eof2 后到来 
	#1034;
	@(posedge clk)
	eof1 <= 1'b1;
	@(posedge clk)
	eof1 <= 1'b0;
	#2098;
	@(posedge clk)
	eof2 <= 1'b1;
	@(posedge clk)
	eof2 <= 1'b0;

// case3  :  eof1 ,eof2 同时到来 
	#1034;
	@(posedge clk)
	eof1 <= 1'b1;
	eof2 <= 1'b1;
	@(posedge clk)
	eof1 <= 1'b0;
	eof2 <= 1'b0;
	#2309;
	$finish;
end

event_merge INST_event_merge (.clk(clk), .rst_n(rst_n), .eof1(eof1), .eof2(eof2), .eof(eof));

endmodule

シミュレーション結果:



おすすめ

転載: blog.csdn.net/qq_43045275/article/details/130580840