verilog- присвояване на изявление reg към изходна променлива, която не е присвоена

Опитвам се да използвам FPGA като преместващ регистър към някои светодиоди с pwm, но попаднах на грешка, докато се опитвах да присвоя reg, съдържащ стойността, изместена в изходна променлива. Когато го кача на FPGA (използвам mojo от вграден микро), той не прави нищо. когато използвам симулатора, той съобщава, че всички изходни променливи никога не са присвоени и имат стойност X, докато всички други променливи вътре в модула работят добре. ето моят код за модула за превключване:

module shifting(
    input clk,
    input shiftingpin,//data to be shifted in
    input rst,
    output done,
    output [3:0]data//pwm compare value output
    );
reg [2: 0] ctr_d, ctr_q;
reg don;
reg [3:0]datas;
always @(*) begin
     if(ctr_q == 3'b100) begin
        ctr_d[2:0] = 3'b0;
        don = 1'b1;
     end else begin
       ctr_d = ctr_q + 1'b1;
        don = 1'b0;
     end
end
always @(posedge clk) begin
     datas[ctr_q] = shiftingpin;// assign value to the output
    if (rst) begin
        ctr_q <= 1'b0;
    end else begin
        ctr_q <= ctr_d;
    end
end
assign data = datas;
assign done = don;
endmodule 

done казва на съдържащия модул кога да актуализира и присвои стойността на pwm.


person FPGA    schedule 11.10.2014    source източник
comment
Можете ли да добавите вашия tb код, който симулира входовете? (Също така имайте предвид, че редът, който съхранява щифта за превключване към данни, трябва да бъде неблокиращ: datas[ctr_q] <= shiftingpin; )   -  person Unn    schedule 12.10.2014


Отговори (1)


Ако съм разбрал правилно въпроса, имате синтактична грешка, когато се опитвате да управлявате портове от always блока.

Когато декларирате портове, те обикновено са свързани по подразбиране, което може да се управлява само от портове или присвояване. В резултат на кода по-долу

module shifting(
    input        clk,
    input        shiftingpin,
    input        rst,
    output       done,
    output [3:0] data
);
reg           don; 
reg [3:0]     datas;
assign done = don;    
assign data = datas;

Решение

Решението е да дефинирате портовете като reg, логиката е за предпочитане, ако можете да поддържате System Verilog. logic ефективно ще превключва между wire и reg, както е необходимо, за да улесни преработването на кода.

module shifting(
    input             clk,
    input             shiftingpin,
    input             rst,
    output reg        done,
    output reg  [3:0] data
);
always @(posedge clk) begin
 data[ctr_q] <= shiftingpin; // <-- data port used directly
//...

NB: регистрите за смяна могат да бъдат направени само с

always @(posedge clk) begin
  datas[3:0] <= {datas[2:0], shiftingpin};
person Morgan    schedule 12.10.2014