2010-11-14 5 views
6

Ich arbeite an einem einfachen Sign-Extender in Verilog für einen Prozessor, den ich für Computer Architecture erstelle.Wie zeichne ich eine Zahl in Verilog aus?

Hier ist, was ich habe, so weit: [EDIT: Changed die Auswahl Aussage leicht]

`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 

ich während (CLK == 1) Denken hinzugefügt, die mein Problem lösen würde, was ich glaube, ist eine Endlosschleife. Wenn ich versuche, dies in iSim zu testen, wird die Schaltung niemals initialisiert.

Ich habe auch versucht, die Kopiersyntax zu entfernen und nur extended [8] = extend [7] usw. für [8] - [15], aber das gleiche Ergebnis auftritt, so bin ich mir ziemlich sicher, dass die innerste Syntax ist richtig.

Hier ist die Testdatei:

`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 

Irgendwelche Ideen, wie ich dies erfolgreich tun kann?

+0

Passen Sie Ihre 'begin's und' end's ... – Marty

Antwort

13

Sie es fast bekam ...

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

Sie sind auch eine Taktflanke für die '40' Test fehlt. Versuchen Sie dies, & lassen Sie mich wissen, wie Sie bekommen ...

+0

Danke, das ist in der Tat, was ich fehlte! –

10

Wir die Syntax verwenden können $signed anmelden erweitern

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

Beachten Sie, dass einige Tools eine Warnung über nicht übereinstimmende Breite auslösen, da '$ signed (unausgedehnt)' immer noch nur 8 Bit lang ist, bevor 'Extended' zugewiesen wird – minexew

2

Durch die Art und Weise Ihr Modul assign ist rein kombinatorische, so dass es keine clk enthalten sollte diese andere Art und Weise zu tun, Ihr Modul ist:

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 

;)