2016-04-30 3 views
-1

Я делаю LOTTT конвейерной обработки с различными сигналами ширины и хотел получить модуль SYNTHESIZEABLE, в котором я мог бы передать 2 параметра: 1) количество труб (L) и 2) ширину сигнала (W).Синтезируемый модульный сдвиговый регистр Verilog

Таким образом, мне просто нужно создать экземпляр модуля и передать 2 значения, которые являются настолько простыми и надежными, чем ввод нагрузок и нагрузок распространения сигнала через фиктивные регистры ... подверженные ошибкам и все.

У меня HALF написана код Verilog, любезно попросите вас исправить меня, если я ошибаюсь.

I AM FACING COMPILE ERROR ... SEE COMMENTS 

***************************************************************** 
PARTIAL VERILOG CODE FOR SERIAL IN SERIAL OUT SHIFT REGISTER WITH 
1) Varying number of shifts/stages : L 
2) Varying number of signal/register width : W 
***************************************************************** 

module SISO (clk, rst, Serial_in, Serial_out); // sIn -> [0|1|2|3|...|L-1] -> sOut 
parameter L = 60; // Number of stages 
parameter W = 60; // Width of Serial_in/Serial_out 

input clk,rst; 
input reg Serial_in; 
output reg Serial_out; 


// reg [L-1:0][W-1:0] R; 
reg [L-1:0] R;   // Declare a register which is L bit long 

always @(posedge clk or posedge rst) 
begin 
    if (rst)     // Reset = active high 
//********************** 
    begin 
     R[0] <= 'b0;   // Exceptional case : feeding input to pipe 
     Serial_out <= 'b0;  // Exceptional case : vomiting output from pipe 

    genvar j; 
    for(j = 1; j<= L; j=j+1) // Ensuring ALL registers are reset when rst = 1 
    begin : rst_regs   // Block name = reset_the_registers 
     R[L] <= 'b0;   // Verilog automatically assumes destination width @ just using 'b0 
    end 
    end 
    else 
//********************** 
    begin 
     generate 
     genvar i; 
     for(i = 1; i< L; i=i+1) 
      begin : declare_reg 
       R[0] <= Serial_in; // <---- COMPILE ERROR POINTED HERE 
       R[L] <= R[L-1];  
       Serial_out <= R[L-1]; 
      end 
     endgenerate; 
    end 
//********************** 
endmodule 
//********************** 
+0

Зачем вам нужно «генерировать»? Вы просто попробовали простые циклы 'for'? – toolic

+0

Я изучаю verilog. Отправил свою первую и немедленную попытку. at for loops. – Displayname

ответ

1

Почему так сложно? Следующий код будет намного проще и легче понять:

module SISO #(
    parameter L = 60, // Number of stages (1 = this is a simple FF) 
    parameter W = 60 // Width of Serial_in/Serial_out 
) (
    input clk, rst, 
    input [W-1:0] Serial_in, 
    output [W-1:0] Serial_out 
); 
    reg [L*W-1:0] shreg; 

    always @(posedge clk) begin 
     if (rst) 
      shreg <= 0; 
     else 
      shreg <= {shreg, Serial_in}; 
    end 

    assign Serial_out = shreg[L*W-1:(L-1)*W]; 
endmodule 

Однако, глядя на ваш код есть следующие проблемы:

  1. Вы объявляете Serial_in в input reg. Это невозможно, input не может быть reg.

  2. Вы используете generate..endgenerate внутри всегда блока. Генерирующий блок является элементом модуля и не может использоваться в всегда блоке. Просто удалите операторы generate и endgenerate и объявите i как integer.

  3. Очевидно, что Serial_in и Serial_out должны быть объявлены как векторы размера [W-1:0].

  4. Вы используете R как память. Объявите это как таковое: reg [W-1:0] R [0:L-1].

  5. Вы не используете i для вас. Очевидно, вы хотели связать все элементы R вместе, но вы просто получаете доступ к 0-му, (L-1) -му и L-му элементу. (Очевидно, что элемент Lth является несуществующим, этим массив будет идти от 0 до L-1.

Я сейчас пишу останавливая этот список, потому что, я извиняюсь, я думаю, что на самом деле не так много получить улучшенный код, который вы опубликовали.

+0

Все в порядке, я увлекаюсь конечным результатом. Думаю, я попытаюсь использовать петли и совершенно другую реализацию. Я тоже занимался параллельными циклами. – Displayname

+1

Эй, Клиффорд, синтезировал и моделировал ваш код, Он отлично работает. ks много за помощь. Надеюсь, я смогу визуализировать коды с такой ясностью, используя параметры. – Displayname

Смежные вопросы