
バレルシフタのVerilog記述について質問です。
画像のような仕様で左ローテーション回路をVerilogで作成しています。
実行結果が
0din=10000001 s=0 dout=10000001
1000din=10000001 s=1 dout=00000011
2000din=10000001 s=2 dout=00000110
3000din=10000001 s=3 dout=00001100
4000din=10000001 s=4 dout=00011000
5000din=10000001 s=5 dout=00110000
6000din=10000001 s=6 dout=01100000
7000din=10000001 s=7 dout=11000000
8000din=11111110 s=7 dout=11111111
となり、「8000din=11111110 s=7 dout=11111111」の部分を
「8000din=11111110 s=7 dout=01111111」にしたいです。
どうしたらなるのか分からなくて手詰まっています。
解説お願いします。
コード
module left_rotation(din,s,dout);
input [7:0] din;
input [2:0] s;
output [7:0] dout;
function [7:0] lrot;
input [7:0] din;
input [2:0] s;
case(s)
3'h0:lrot=din;
3'h1:lrot={1'b1,din[7]};
3'h2:lrot={1'b1,din[7:6]};
3'h3:lrot={1'b1,din[7:5]};
3'h4:lrot={1'b1,din[7:4]};
3'h5:lrot={1'b1,din[7:3]};
3'h6:lrot={1'b1,din[7:2]};
3'h7:lrot={1'b1,din[7:1]};
default:
lrot=8'bxxxxxxxx;
endcase
endfunction
assign dout=lrot(din,s);
endmodule
`timescale 1ps/1ps
module left_rotation_tp;
reg [7:0] din;
reg [2:0] s;
wire [7:0] dout;
parameter STEP=1000;
left_rotation left_rotation(din,s,dout);
initial begin
din=8'b10000001; s=3'h0;
#STEP s=3'h1;
#STEP s=3'h2;
#STEP s=3'h3;
#STEP s=3'h4;
#STEP s=3'h5;
#STEP s=3'h6;
#STEP s=3'h7;
#STEP din=8'b11111110; s=3'h7;
#STEP $finish;
end
initial $monitor($stime,"din=%b s=%h dout=%b",din,s,dout);
endmodule

No.1ベストアンサー
- 回答日時:
3'h1:lrot={1'b1,din[7]};
これは2ビットのデータを8ビットの信号に入力しようとしているわけで、残りの6ビットはどうする? って話になります。
シミュレーションの結果が途中までうまくいっているのは、lrotがおそらくregタイプになるので、上位の値が決まらないビットが以前の値を保持しているためでしょう。
あと、lrotの最上位ビットが必ず1になるわけでもないので、{1'b1, ....}と決め打ちしているのもおかしい。
case文のなかを以下のようにすれば、
3'h0:lrot=din;
3'h1:lrot={din[6:0], din[7]};
3'h2:lrot={din[5:0],din[7:6]};
3'h3:lrot={din[4:0],din[7:5]};
3'h4:lrot={din[3:0],din[7:4]};
3'h5:lrot={din[2:0],din[7:3]};
3'h6:lrot={din[1:0],din[7:2]};
3'h7:lrot={din[0],din[7:1]};
シミュレーションの結果はこうなります。
0din=10000001 s=0 dout=10000001
1000din=10000001 s=1 dout=00000011
2000din=10000001 s=2 dout=00000110
3000din=10000001 s=3 dout=00001100
4000din=10000001 s=4 dout=00011000
5000din=10000001 s=5 dout=00110000
6000din=10000001 s=6 dout=01100000
7000din=10000001 s=7 dout=11000000
8000din=11111110 s=7 dout=01111111
$finish called from file "./test.v", line 53.
$finish at simulation time 9000
あと、functionやcaseを使わずにもっと簡単にやりたければ、シフト演算を使って、
module left_rotation(din,s,dout);
input [7:0] din;
input [2:0] s;
output [7:0] dout;
wire [15:0] temp;
assign temp = {8'b0, din[7:0]} << s;
assign dout = temp[7:0] | temp[15:8];
endmodule
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(AV機器・カメラ) 一般的なDINカーオーディオの寿命は何年くらいですか。 ナビ無しのカーオーディオで、CDや、USB端 4 2022/05/07 18:35
- 地図・道路 ポータブルカーナビゲーションで、地図を永遠に無料自動更新してくれるものはありますか。 (スマホカーナ 4 2022/12/03 09:50
- HTML・CSS <input>のstep属性に違反する入力をした時にエラーメッセージを表示させない事は可能か 2 2023/02/16 04:11
- その他(車) そこそこのボリュームで音楽を聞きながら窓を開けて運転していたらDQNに絡まれて強制停車させられました 6 2022/10/16 10:53
- その他(コンピューター・テクノロジー) ブルースクリーンエラーの発生と解決手順 2 2022/10/09 13:05
- その他(プログラミング・Web制作) シェルのSTEP数について教えてください。シェルスクリプトの先頭に、#!/bin/shとか書きますよ 3 2023/06/08 19:02
- その他(スマートフォン・携帯電話・VR) Ahamoのe-simをオンラインで購入できますか? 2 2023/03/26 20:54
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
- Excel(エクセル) エクセル関数教えてください 3 2022/06/21 10:22
- Excel(エクセル) ExcelVBAの、Index matchについて 2 2023/04/18 16:57
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
値が入っているときだけ計算結...
-
VLOOKUP関数を使用時、検索する...
-
Excel 数値の前の「 ' 」を一括...
-
EXCELで条件付き書式で空白セル...
-
【Excelで「正弦波」のグラフを...
-
2つの数値のうち、数値が小さい...
-
小数点以下を繰り上げたものを...
-
検便についてです。 便は取れた...
-
尿検査前日に自慰行為した時の...
-
ワードのページ番号をもっと下...
-
エクセルのラベルの値(文字列...
-
精子に血が・・・
-
病院側から早く来てくださいと...
-
精液の落とし方を教えてください
-
彼女のことが好きすぎて彼女の...
-
EXCELで式からグラフを描くには?
-
リンク先のファイルを開かなく...
-
テスターで断線を調べる方法教...
-
MIN関数で空白セルを無視したい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
尿検査前日に自慰行為した時の...
-
至急!尿検査前日にオナニーし...
-
検便についてです。 便は取れた...
-
彼女のことが好きすぎて彼女の...
-
値が入っているときだけ計算結...
-
リンク先のファイルを開かなく...
-
EXCELで条件付き書式で空白セル...
-
2つの数値のうち、数値が小さい...
-
VLOOKUP関数を使用時、検索する...
-
尿検査の前日は自慰控えたほう...
-
MIN関数で空白セルを無視したい...
-
小数点以下を繰り上げたものを...
-
風俗店へ行く前のご飯
-
エクセルで空白セルを含む列の...
-
Excel 数値の前の「 ' 」を一括...
-
【Excelで「正弦波」のグラフを...
-
納豆食べた後の尿の納豆臭は何故?
-
EXCELで式からグラフを描くには?
-
ある範囲のセルから任意の値を...
おすすめ情報