レベル 3: 32 ビット シフター設計

ミッション詳細

ミッション詳細

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

おすすめ

転載: blog.csdn.net/m0_53870075/article/details/128396160