Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.naic.edu/~phil/hardware/pdev/fpga/gx/sp/src/vshift.v
Дата изменения: Thu Jun 26 04:27:55 2008
Дата индексирования: Sat Sep 6 19:52:54 2008
Кодировка:

Поисковые слова: п п п п п п п п п п п п п п п п п п п п п п п п п п

// Jeff Mock
// 2030 Gough St.
// San Francisco, CA 94109
// jeff@mock.com
//
// Copyright 2005,2006
//
// $URL: https://www.mock.com/svn/pdev/trunk/gx/sp/src/vshift.v $
// $Id: vshift.v 913 2007-02-24 01:09:40Z jeff $

// 0-7 bit signed upshift with saturation.
//

module vshift (
ck,
shift,
a,
sat,
x
);
input ck;
input [2:0] shift;

input [`N_PFB-1:0] a;
output sat;
output [`N_PFB-1:0] x;

reg [`N_PFB-1:0] a_d1;
reg [2:0] shift_d1;

always @(posedge ck)
shift_d1 <= shift;

always @(posedge ck)
a_d1 <= a;

// Up shift 0..7 bits, keep all of the bits in this stage.
//
reg [`N_SFT-1:0] a_d2;
always @(posedge ck)
case (shift_d1)
3'd0: a_d2 <= { {7{a_d1[`N_PFB-1]}}, a_d1 };
3'd1: a_d2 <= { {6{a_d1[`N_PFB-1]}}, a_d1, 1'b0 };
3'd2: a_d2 <= { {5{a_d1[`N_PFB-1]}}, a_d1, 2'b0 };
3'd3: a_d2 <= { {4{a_d1[`N_PFB-1]}}, a_d1, 3'b0 };
3'd4: a_d2 <= { {3{a_d1[`N_PFB-1]}}, a_d1, 4'b0 };
3'd5: a_d2 <= { {2{a_d1[`N_PFB-1]}}, a_d1, 5'b0 };
3'd6: a_d2 <= { {1{a_d1[`N_PFB-1]}}, a_d1, 6'b0 };
3'd7: a_d2 <= { a_d1, 7'b0 };
endcase

// Figure out if result is saturated
//
reg [`N_PFB-1:0] a_d3;
reg apos;
reg aneg;
always @(posedge ck) begin
a_d3 <= a_d2[`N_PFB-1:0];
apos <= ~a_d2[`N_SFT-1] & (|a_d2[`N_SFT-2:`N_SFT-8]);
aneg <= a_d2[`N_SFT-1] &
(~(&a_d2[`N_SFT-2:`N_SFT-8]) |
(a_d2[`N_PFB-1:0] == { 1'b1, `N_PFB-1'b0 }));
end

// Take either shifted value or maximum positive integer, or
// maximum negative integer.
//
reg [`N_PFB-1:0] x;
reg sat;
always @(posedge ck) begin
x <= apos ? { 1'b0, {`N_PFB-1 {1'b1}}} :
aneg ? { 1'b1, {`N_PFB-2 {1'b0}}, 1'b1} : a_d3;
sat <= apos | aneg;
end

endmodule