Ошибка кода накопления 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