Ошибка кода накопления Verilog

У меня проблема с кодом аккумулятора в Verilog. Я просто генерирую псевдослучайные сигналы. Затем измените уровень случайного сигнала с -1 на 1 с 0 на 1, чтобы он был подписан. Позже получил 'acmin'. На этом этапе мне нужно накапливать сигналы "acmin". Отладчик не выдаёт мне ошибок, но я не вижу результатов. Можете ли вы помочь мне найти проблему?

module lfsr(clk, rst, seed, load, R, acc);
   input [3:0] R;
   input [26:0] seed;
   input load;
   input rst;
   input clk;
   reg [3:0]q;
   wire [3:0] S;
   wire overflow;
   wire [3:0] acmin ;
   wire [26:0] state_out;
   wire [26:0] state_in;
   output [7:0] acc;
   reg [7:0] acc;

   flipflop F[26:0] (state_out, clk, rst, state_in);
   mux M1[26:0] (state_in, load, seed, {state_out[25],state_out[24],state_out[23],state_out[22],state_out[21],state_out[20],state_out[19],state_out[18],state_out[17],state_out[16],state_out[15],state_out[14],state_out[13],state_out[12],state_out[11],state_out[10],state_out[9],state_out[8],state_out[7],state_out[6],state_out[5],state_out[4],state_out[3],state_out[2], state_out[1], state_out[0], nextbit});
   xor G1(nextbit, state_out[5], state_out[2], state_out[1], state_out[26]); 

   // Pseudorandom generator
   always@(clk) begin
      if (state_out[26]==0)  
         q=4'b1111;  // 0 to -1
      else
         q=4'b0001;  //1 to 1 
   end

   assign acmin= R*q; // accumulator input

   always@(clk) begin
      if(rst)
         acc = 8'b00000000;
      else
         acc = acc + acmin;
   end
endmodule

Испытательный стенд;

module lfsrtst;
reg [3:0] R;
reg clk;
reg rst;
reg [26:0] seed;
reg load;
wire [7:0] acc;
lfsr lfsr(clk, rst, seed, load, R, acc);
initial
begin
clk = 0;
load = 0;
seed = 0;
rst = 0;
R=0;
#10 rst = 1;
#10 rst = 0;
#50 R = 4'b0111;
#50 R = 4'b0010;
#100 R = 4'b1111;
#50 R = 4'b1011;
#150 R = 4'b1101;
#50 R = 4'b1000;
end
// drive clock
always
#50 clk = !clk;
// program lfsr
initial begin
#100 seed = 27'b000000110000011000001000001;
load = 1;
#100 load = 0;
#1400 $stop;
end
endmodule

У меня есть "acmin", как я хотел. Я хочу накапливать переменную 'acmin' каждый раз, когда край часов поднимается и опускается. Однако 'acc' ничего не дает, так в чем же ошибка? Благодарю.

2 ответа

Основная проблема, которую я вижу, состоит в том, что у вас есть синхронный сброс:

always@(clk) begin
  if(rst)
     acc = 8'b00000000;
  else
     acc = acc + acmin;
end

Но в вашем тестовом стенде вы только стробируете сброс для #20

#10 rst = 1;
#10 rst = 0;

Это слишком коротко, и сброс никогда не обнаруживается.

Если вы увеличите эти задержки, проблема должна быть устранена.

#100 rst = 1;
#100 rst = 0;

// then later
// program lfsr
initial begin
   # also delay this so that it comes after the reset
   #300 seed = 27'b000000110000011000001000001;

В качестве альтернативы вы можете сделать сброс асинхронным.

always@(clk or posedge rst) begin

Я хотел бы попытаться использовать здесь триггер, добавив ставку и преобразовав в '<='

always@(posedge clk) begin
  if(rst)
     acc <= 8'b00000000;
  else
     acc <= acc + acmin;
end
Другие вопросы по тегам