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

Я пытаюсь использовать FPGA в качестве регистра сдвига для некоторых светодиодов с ШИМ, но столкнулся с ошибкой при попытке назначить регистр, содержащий сдвинутое значение, выходной переменной. Когда я загружаю его в FPGA (я использую моджо от встроенного микро), он ничего не делает. когда я использую симулятор, он сообщает, что все выходные переменные никогда не назначаются и имеют значение 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