verilog도 버젼이 몇가지가 있죠. 새로운 2001버젼에서 나온 배럴 쉬프터 짜는 부분이 있어서 옮겨봅니다.
기존에 저도 짜던 방식이 그냥 for문 돌리던지 아니면 case문으로 해당 쉬프트 비트수 만큼 옮기는 방법인지라... 이런 방법이 있다는 게 신기하기도 하는군요.
[CODE type=verilog]{y,tmp} = {a,a} << rotate_cnt[/CODE]
방식은 다음과 같습니다. 배럴 쉬프터라는게 원하는 수만큼 쉬프트를 해주는 로직인지라 저처럼 무식하게 하지 않는 이상 보통은 다음과 같이 만들죠
[CODE type=verilog]{y,tmp} = { a[(WIDTH-1)-rotate_cnt:0], a[(WIDTH-1):0], {rotate_cnt(1'b0)} }[/CODE]
이거 줄여놓은게 위에꺼 입니다. 참 쉽죠? (밥로스 선생님의 추억이... -_-)
뭐... 2001새로운 문법이랄꺼야 rotate_cnt(1'b0) 정도인데 이거 그냥 rotate_cnt의 수만큼 1비트짜리 0를 나열해 주는 겁니다.
뭐.. 신호 이름 화서 아시겠지만 y값이 결과값이고 a가 입력 WIDTH가 워드구성 비트수이고, rotate_cnt가 옮길 비트수입니다.
구현 자체는 RSR만 되어있는데 마찬가지로 RSL도 구현할 수 있겠죠. ^^