RightShifter.v.html 684 B

123456789101112131415161718192021222324
  1. `timescale 1ns / 1ps // NW 9.11.2016
  2. module RightShifter(
  3. input [31:0] x,
  4. input [4:0] sc,
  5. input md,
  6. output [31:0] y);
  7. // shifter for ASR and ROR
  8. wire [1:0] sc0, sc1;
  9. wire [31:0] s1, s2;
  10. assign sc0 = sc[1:0];
  11. assign sc1 = sc[3:2];
  12. assign s1 = (sc0 == 3) ? {(md ? x[2:0] : {3{x[31]}}), x[31:3]} :
  13. (sc0 == 2) ? {(md ? x[1:0] : {2{x[31]}}), x[31:2]} :
  14. (sc0 == 1) ? {(md ? x[0] : x[31]), x[31:1]} : x;
  15. assign s2 = (sc1 == 3) ? {(md ? s1[11:0] : {12{s1[31]}}), s1[31:12]} :
  16. (sc1 == 2) ? {(md ? s1[7:0] : {8{s1[31]}}), s1[31:8]} :
  17. (sc1 == 1) ? {(md ? s1[3:0] : {4{s1[31]}}), s1[31:4]} : s1;
  18. assign y = sc[4] ? {(md ? s2[15:0] : {16{s2[31]}}), s2[31:16]} : s2;
  19. endmodule