ミッション詳細
ミッション詳細
32ビットシフターは、32ビットの2進数を左または右にシフトできます.シフト桁数は0から31の間で自由に選択できます.右にシフトする場合は、論理
右シフト(上位ビットを0で埋める)を選択できます.
または算術右シフト (高符号拡張)。
以下は、元のデータに対して左シフト、論理右シフト、および算術右シフトをそれぞれ実行する 3 つのシフト操作の例です。
プログラミング要件
このレベルのタスクは、図に示すように、32 ビットの 2 進数で左シフト (sll)、論理右シフト (srl)、および算術右シフト (sra) を実行できる 32 ビット シフター シフトを設計することです。 0~31の間で自由に選択できます。入力ポートと出力ポートの設計要件は次のとおりです。
記号 説明 | 制御信号のハイレベルとローレベル |
---|---|
d:32ビット2進数入力端子 | |
sa: 5ビットシフト桁入力端子 | |
sh: 32ビットデータ出力端子 | |
右:コントロール端子を右に動かし、アクティブハイ | right=1 のとき右に移動、right=0 のとき左に移動 |
arith:算術シフト制御端子、アクティブハイ | arith=1のとき算術シフト、arith=0のとき論理シフト |
テスト命令
32ビットシフター
プログラミング要件
このレベルのプログラミング タスクは、シフト機能を実現するために /shift.v ファイルのコード コンテンツを完成させることです。
このレベルに含まれる /shift.v ファイルのコード フレームワークは次のとおりです。
module shift (d,sa,right,arith,sh);
input [31:0] d;
input [4:0] sa;
input right,arith;
output [31:0] sh;
/********** Begin *********/
/********** End *********/
endmodule
テスト命令
- /shift.v のコードを完成させ、[評価] をクリックすると、プラットフォームが自動的にテスト ファイルをコンパイルして実行し、標準入力を介して評価入力を提供します。
- プラットフォームはプログラムの出力を受け取り、それを期待される出力と比較し、一致する場合はテストに合格し、一致しない場合はテストに失敗します。
以下は、/shift.v のプラットフォームのサンプル シミュレーション出力です。
シフター シミュレーション
shift.v の関数シミュレーション波形は次のとおりです。
シフター シミュレーション波形
タスクを開始します。成功を祈ります!
次のコードですが、実行できません
次のコードですが、実行できません
次のコードですが、実行できません
ロジックは正しいです。モジュール モジュール mux2x32 を
次のように変更する必要があります。
module mux2x32(a0,a1,s,y);
input [31:0] a0,a1;
input s;
output [31:0] y;
assign y=s?a1:a0;
endmodule
`include "mux2x32.v"//注意在educator上引用相应的module,这里2021年之前是shift_mux
module shift (d,sa,right,arith,sh);
input [31:0] d; //d表示需要移位的数
input [4:0] sa; //sa表示移位的长度
input right,arith; //right表示判断左移还是右移,arith判断逻辑还是算术移位
output [31:0] sh; //输出结果
wire [31:0] t0,t1,t2,t3,t4,s1,s2,s3,s4; //临时变量
wire a=d[31] & arith; //arith=1,算术移位;
wire [31:0] sdl4,sdr4,sdl3,sdr3,sdl2,sdr2,sdl1,sdr1,sdl0,sdr0;
wire [15:0] e= {
16{
a}}; //取决于arith来判断移位
//parameter c=2'b11;
parameter z=16'b0; //16个0
assign sdl4={
d[15:0],z}; //shift left 16-bit
assign sdr4={
e,d[31:16]};//shift right 16-bit
// 调用32位二选一mux2x32程序补充下面代码,实现判断左移还是右移
/********** Begin *********/
mux2x32 m_right4 (sdl4,sdr4,right,t4);
/********** End *********/
/********* Explaination *********/
//如果right=1,为右移,t4=sdr4
//之后根据 ++sa:5位移位位数输入端++ 是否为1判断是否移位
//如果sa[4:0]=10000; 即sa[4]=1,证明移位16位,
//同理移位8位,4位,1位,也可以多次移位,只要相应的sa[i]==1
/********** End *********/
/******************************* ****************************/
// 上述代码调用32位二选一路多路选择器,代码在2021年之前educator可以使用,
// 但是2022年将educator将32位二选一路Multiplexer改为了,4位二选一路多路选择器
// 如果继续使用,端口port 超出指定值,代码自然报错
//
// ./shift.v:18: warning: Port 1 (a0) of mux2x32 expects 4 bits, got 32.
/******************************* ****************************/
mux2x32 m_shift4 (d,t4,sa[4],s4); //not_shift or shift
assign sdl3={
s4[23:0],z[7:0]};//shift left 8-bit
assign sdr3={
e[7:0],s4[31:8]}; //shift right 8-bit
mux2x32 m_right3 (sdl3,sdr3,right,t3);//left or right
mux2x32 m_shift3 (s4,t3,sa[3],s3);//not shift or shift
assign sdl2={
s3[27:0],z[3:0]}; //shift left 4-bit
assign sdl2={
e[3:0],s[31:4]};
mux2x32 m_right2 (sdl2,sdr2,right,t2); //left or right
mux2x32 m_shift2 (s3,t2,sa[2],s2); //not_shift or shift
assign sdl1={
s2[29:0],z[1:0]}; //shift left 2-bit
assign sdr1={
e[1:0],s2[31:2]};//shift right 2-bit
mux2x32 m_right1 (sdl1,sdr1,right,t1);//left or right
mux2x32 m_shift1(s2,t1,sa[1],s1); //not_shift or shift
assign sdl0={
s1[30:0],z[0]}; //shift left 1-bit
assign sdr0={
e[0],s1[31:1]}; //shift right 1-bit
mux2x32 m_right0 (sdl0,sdr0,right,t0); //left or right
mux2x32 m_shift0 (s1,t0,sa[0],sh); //not_shift or shift
always @(d or sa or right or arith)
begin
if(right == 0 && arith == 0 && sa == 0)
sh = 32'h0000000f;
else
sh = 32'h00000000;
end
endmodule