次のように右にシフトする可変シフトレジスタを設計したいと思います。
module sr(N,int,out);
input [2:0] N;
input [7:0] in;
output [7:0] out;
assign out={N'b0,input[7,N]}
endmodule
ただし、残念ながら、Verilogではこの種の書き込みは許可されていません。Nは一定でなければなりません。入力からシフト反復を取得する方法について何かアイデアはありますか?
次のように右にシフトする可変シフトレジスタを設計したいと思います。
module sr(N,int,out);
input [2:0] N;
input [7:0] in;
output [7:0] out;
assign out={N'b0,input[7,N]}
endmodule
ただし、残念ながら、Verilogではこの種の書き込みは許可されていません。Nは一定でなければなりません。入力からシフト反復を取得する方法について何かアイデアはありますか?
Verilog には右シフト演算子があるため、次のように簡単に記述できます。
assign out = in >> N;
余分なビットは自動的にゼロで埋められます。
in
とのサイズout
が実際に8ビットに固定されている場合、これを行う簡単な方法の1つは次のとおりです。
module sr(N, in, out);
input [2:0] N;
input [7:0] in;
output [7:0] out;
assign out = (N == 7) ? {7'b0, in[7:7]} :
(N == 6) ? {6'b0, in[7:6]} :
(N == 5) ? {5'b0, in[7:5]} :
(N == 4) ? {4'b0, in[7:4]} :
(N == 3) ? {3'b0, in[7:3]} :
(N == 2) ? {2'b0, in[7:2]} :
(N == 1) ? {1'b0, in[7:1]} :
in[7:0];
endmodule
always
これは、次のように、ブロック内のcaseステートメントを使用してコーディングすることもできます。
reg [7:0] out_reg;
assign out = out_reg;
always @(N or in) begin
case (N)
7 : out_reg <= {7'b0, in[7:7]};
6 : out_reg <= {6'b0, in[7:6]};
5 : out_reg <= {5'b0, in[7:5]};
4 : out_reg <= {4'b0, in[7:4]};
3 : out_reg <= {3'b0, in[7:3]};
2 : out_reg <= {2'b0, in[7:2]};
1 : out_reg <= {1'b0, in[7:1]};
0 : out_reg <= in[7:0];
endcase
end
すべての値を書きたくない場合は、for
ループを使用できます。私は合成ツールがこれをどのように処理するかについての専門家ではありませんが、これ(または同様のもの)は問題なく合成されるはずです。
always @(N or in) begin
for (i = 0; i < 8; i = i + 1) begin
if (i+N < 8) begin
out_reg[i] <= in[i+N];
end else begin
out_reg[i] <= 1'b0;
end
end
end
ループを使用してコーディングする利点の1つは、カットアンドペーストのタイプミスが発生しにくいことです。
parameter
さらに重要なことに、モジュールで入力と出力の一般的なビット幅をサポートする場合は、モジュールでを使用し、割り当てに同様のループを使用できます。