2010-11-14 9 views
6

Pracuję nad prostym przedłużeniem znaku w Verilog dla procesora, który tworzę dla architektury komputerowej.Jak podpisywać-rozszerzać liczbę w Verilog

Oto co mam do tej pory: [EDIT: Zmieniono oświadczenie wyboru nieznacznie]

`timescale 1ns/1ps 

module SignExtender(CLK, extend, extended); 
input[7:0] extend; 
input CLK; 
output[15:0] extended; 

reg[15:0] extended; 
wire[7:0] extend; 

always 
begin 
    while (CLK == 1) 
    extended[7:0] = extend[7:0]; 
    extended[15:8] = {8{extend[7]}}; 
end 
endmodule 

dodałem while (CLK == 1) myślenia, które rozwiązać mój problem, który moim zdaniem jest nieskończona pętla. Kiedy próbuję to sprawdzić w iSim, obwód nigdy się nie inicjuje.

Próbowałem również usunąć składnię kopiowania i po prostu zrobić rozszerzony [8] = przedłużyć [7] itp. Dla [8] - [15], ale ten sam wynik występuje, więc jestem prawie pewien, że najgłębsza składnia jest poprawne.

Tutaj jest plik testowy:

`timescale 1ns/1ps 
module SignExtender_testbench0; 

    // Inputs 
    reg [7:0] extend; 
    reg CLK; 

    // Outputs 
    wire [15:0] extended; 

    // Instantiate the Unit Under Test (UUT) 
    SignExtender uut (
     .extend(extend), 
     .extended(extended) 
    ); 

    initial begin 
     // Initialize Inputs 
     extend = 0; 

     #100; // Wait 100 ns for global reset to finish 

     extend = -30; 
     CLK = 1; 
     #10; 
     CLK = 0; 
     if (extended == -30) 
      $display("okay 1"); 
     else 
      $display("fail 1"); 

     extend = 40; 
     #10; 
     if (extended == 40) 
      $display("okay 2"); 
     else 
      $display("fail 2"); 

    end 

endmodule 

Wszelkie pomysły jak można zrobić to skutecznie?

+0

Oglądaj 'begin's i' end's ... – Marty

Odpowiedz

13

Prawie got it ...

always @(posedge clk) begin 
    extended[15:0] <= { {8{extend[7]}}, extend[7:0] }; 
end 

Ty też brakuje krawędź zegara do badania '40'. Spróbuj tego, & Daj mi znać, jak dostać się na ...

+0

Dzięki, że rzeczywiście jest to, czego brakuje! –

10

Możemy użyć składni $signed do podpisania przedłużenia

module signextender(
    input [7:0] unextended,//the msb bit is the sign bit 
    input clk, 
    output reg [15:0] extended 
); 

[email protected](posedge clk) 
    begin 
    extended <= $signed(unextended); 
    end 
endmodule 
+1

Należy zauważyć, że niektóre narzędzia podnoszą ostrzeżenie o niedopasowaniu szerokości, ponieważ '$ signed (unnextended)' jest wciąż tylko 8 bitami, zanim zostanie przypisane do 'extended' – minexew

2

Nawiasem mówiąc Twój moduł przypisać to czysta kombinowanych więc nie powinno zawierać CLK jest to kolejny sposób prowadzenia modułu:

module sign_ext 
      (
       unextend, 
       extended 
      ); 

input [15:0] unextend; 
output [31:0] extended; 

assign extended = {{16{unextend[15]}}, unextend}; 

endmodule 

//TB 

module tb_sign_ext; 

reg [15:0] unex; 
wire [31:0] ext; 

sign_ext TBSIGNEXT 
        (
        .unextend(unex), 
        .extended(ext) 
       ); 

initial 
begin 
    unex = 16'd0; 
end 


initial 
begin 
    #10 unex = 16'b0000_0000_1111_1111; 
    #20 unex = 16'b1000_0000_1111_1111; 
end 

endmodule 

;) 
Powiązane problemy