コード:
module bit1_bit4(
input clk_50M_i,
input rst_n_i,
input data_i,
input data_en_i,
output [3:0]data_o,
output data_en_o
);
reg data_i_tmp1;
reg data_i_tmp2;
reg data_en_i_tmp1;
reg data_en_i_tmp2;
reg [3:0]data_o_tmp;
reg data_en_o_tmp;
reg [3:0]cnt;
always@(posedge clk_50M_i or negedge rst_n_i)
if(!rst_n_i)begin
data_i_tmp1 <= 1'b0;
data_i_tmp2 <= 1'b0;
data_en_i_tmp1 <= 1'b0;
data_en_i_tmp2 <= 1'b0;
end
else begin
data_i_tmp1 <= data_i;
data_i_tmp2 <= data_i_tmp1;
data_en_i_tmp1 <= data_en_i;
data_en_i_tmp2 <= data_en_i_tmp1;
end
always@(posedge clk_50M_i or negedge rst_n_i)
if(!rst_n_i)
data_o_tmp <= 4'b0;
else if(data_en_i_tmp2)
data_o_tmp <= {data_o_tmp[2:0],data_i_tmp2};
else
data_o_tmp <= 4'b0;
always@(posedge clk_50M_i or negedge rst_n_i)
if(!rst_n_i)
cnt <= 4'b0;
else if(data_en_i_tmp2)
cnt <= cnt + 1'b1;
else
cnt <= 4'b0;
always@(posedge clk_50M_i or negedge rst_n_i)
if(!rst_n_i)
data_en_o_tmp <= 1'b0;
else if(cnt == 4-1)
data_en_o_tmp <= 1'b1;
else
data_en_o_tmp <= 1'b0;
assign data_o = data_o_tmp;
assign data_en_o = data_en_o_tmp;
endmodule
テスト:
`timescale 1ns/1ns
module bit1_bit4_tb();
parameter clk_period = 20;
reg clk_50M_i;
reg rst_n_i;
reg data_i;
reg data_en_i;
initial begin
clk_50M_i = 1'b0;
rst_n_i = 1'b0;
data_i = 1'b0;
data_en_i = 1'b0;
#100
rst_n_i = 1'b1;
#200
#clk_period data_i = 1'b1; data_en_i = 1'b1;
#clk_period data_i = 1'b1;
#clk_period data_i = 1'b0;
#clk_period data_i = 1'b1;
#clk_period data_en_i = 1'b0;
#200
#clk_period data_i = 1'b0; data_en_i = 1'b1;
#clk_period data_i = 1'b1;
#clk_period data_i = 1'b1;
#clk_period data_i = 1'b0;
#clk_period data_en_i = 1'b0;
#200
#clk_period data_i = 1'b1; data_en_i = 1'b1;
#clk_period data_i = 1'b1;
#clk_period data_i = 1'b1;
#clk_period data_i = 1'b0;
#clk_period data_en_i = 1'b0;
#200
#clk_period data_i = 1'b0; data_en_i = 1'b1;
#clk_period data_i = 1'b0;
#clk_period data_i = 1'b0;
#clk_period data_i = 1'b1;
#clk_period data_en_i = 1'b0;
#200
#clk_period data_i = 1'b1; data_en_i = 1'b1;
#clk_period data_i = 1'b0;
#clk_period data_i = 1'b0;
#clk_period data_i = 1'b0;
#clk_period data_en_i = 1'b0;
end
always #(clk_period/2) clk_50M_i = ~clk_50M_i;
bit1_bit4 bit1_bit4_inst(
.clk_50M_i(clk_50M_i),
.rst_n_i(rst_n_i),
.data_i(data_i),
.data_en_i(data_en_i),
.data_o(),
.data_en_o()
);
endmodule
シミュレーションのスクリーンショット:
注:一部のブログで誤ってデータのシリアルからパラレルへの変換を見たことがありますが、基本的には論理的に実現できますが、それらのほとんどは使用できません。基本的な信号の有効化、タイミングビートがなく、信号の命名は非常にカジュアルです。シフトレジスタは単純に実装されており、直接多重化の値はほぼゼロなので、私の2つのブログが誕生しました。時間が比較的短いので、時間のあるときに後で最適化し、全員が一緒に学ぶための標準化された実用的なコードのアイデアを提供したいと考えています