2010-11-14 13 views
6

में किसी संख्या को साइन-इन करने के लिए कैसे करें मैं कंप्यूटर आर्किटेक्चर के लिए बना रहे प्रोसेसर के लिए वेरिलोग में एक साधारण साइन-एक्सेंडर पर काम कर रहा हूं।Verilog

यहाँ क्या मैं अब तक मिल गया है: [संपादित करें: चयन बयान बदल दिया थोड़ा]

`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 

मैं जबकि (CLK == 1) सोच है कि मेरी समस्या है, जो मेरा मानना ​​है कि है को हल किया जा जोड़ा एक अनंत पाश। जब मैं आईएसआईएम में इसका परीक्षण करने की कोशिश करता हूं, तो सर्किट कभी शुरू नहीं होता है।

मैंने प्रतिलिपि वाक्यविन्यास को हटाने की कोशिश की और [8] = [15] आदि के लिए विस्तारित [8] = विस्तार [7] इत्यादि भी किया, लेकिन एक ही परिणाम होता है, इसलिए मुझे पूरा यकीन है कि आंतरिकतम वाक्यविन्यास सही है।

यहाँ परीक्षण फ़ाइल है:

`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 

कोई भी विचार कैसे मैं इस सफलतापूर्वक कर सकते हैं?

+0

देखो अपने 'begin's और' end's ... – Marty

उत्तर

13

आप लगभग यह मिल गया ...

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

तुम भी '40' परीक्षण के लिए एक घड़ी बढ़त खो रहे हैं। इस प्रयास करें

+0

धन्यवाद, कि वास्तव में मैं क्या याद आ रही थी है! –

10

हम हस्ताक्षर करने के लिए वाक्य रचना $signed उपयोग कर सकते हैं का विस्तार

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

ध्यान दें कि कुछ टूल चौड़ाई विसंगति के बारे में चेतावनी उठाएंगे, क्योंकि '$ हस्ताक्षरित (अनदेखा)' अभी भी 8 बिट्स है जो इसे 'विस्तारित' – minexew

2

वैसे अपने मॉड्यूल असाइन शुद्ध संयोजन है, इसलिए यह एक clk शामिल नहीं होना चाहिए, & मुझे बताएं कि कैसे आप पर मिलता है ... , यह आपके मॉड्यूल करने का एक और तरीका है:

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 

;) 
संबंधित मुद्दे