Я пытаюсь закодировать реализацию контроллера/пути данных в Verilog, и я смущен тем, что вызовет нежелательную защелку. По существу, у меня есть обновление конечного автомата на часах отката. Этот конечный автомат отправляет 5 управляющих сигналов (loadSquare, loadDelta, addDelta и т. Д.) На путь данных, основанный на том, в каком состоянии находится устройство. Ниже приведен код для пути данных и контроллера.Почему оператор If вызывает запирание в verilog?
данных путь
//Control lines
reg addSquare, addDelta, decDelta;
reg loadSquare, loadDelta;
//Input lines
reg [8:0] square, delta;
//Output register
reg [7:0] outReg;
always @(posedge clk) begin
if (loadSquare)
square = 9'h1; //used on initialization
if (loadDelta)
delta = 9'h3; //used on initialization
if (addSquare)
square = square + delta;
if (addDelta)
delta = delta + 2'h2;
if (decDelta)
outReg = (delta>>1) - 1; //used for output
else
outReg = Input;
end
Контроллер
//Output of module
assign Output = outReg;
//Finite State Machine
always @(currentState) begin
case(currentState)
2'h0: begin //initialize values, wait for start
{loadSquare, loadDelta} = 2'b11;
{addSquare, addDelta, decDelta} = 3'h0;
end
2'h1: begin
{loadSquare, loadDelta} = 2'b00;
{addSquare, addDelta, decDelta} = 3'b110; //add square and delta
end
2'h2: begin
{loadSquare, loadDelta} = 2'b00;
{addSquare, addDelta, decDelta} = 3'b001; //decrement delta, wait for reset
end
default: ; // unused
endcase
//Next state logic implemented on negedge clk (not shown)
Этот код генерирует следующие предупреждения в Xilinx:
WARNING:Xst:737 - Found 1-bit latch for signal <addDelta>. Latches may be generated from incomplete case or if statements. We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems.
WARNING:Xst:737 - Found 1-bit latch for signal <decDelta>. Latches may be generated from incomplete case or if statements. We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems.
WARNING:Xst:737 - Found 1-bit latch for signal <loadDelta>. Latches may be generated from incomplete case or if statements. We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems.
WARNING:Xst:1294 - Latch <loadDelta> is equivalent to a wire in block <ModuleName>.
WARNING:Xst:1294 - Latch <decDelta> is equivalent to a wire in block <ModuleName>.
WARNING:Xst:1294 - Latch <addDelta> is equivalent to a wire in block <ModuleName>.
Я понимаю, что неполной, если заявления вызывают защелки. Чтобы попытаться объяснить это, я пробовал две разные реализации, но они не удаляют предупреждения. Меня особенно смущает дело «decDelta», потому что я не понимаю, что я не учитываю в этом условном утверждении.
Try # 1
always @(posedge clk) begin
if (loadSquare)
square = 9'h1;
else
square = square;
if (loadDelta)
delta = 9'h3;
else
delta = delta;
//... and so on
Try # 2
always @(posedge clk) begin
square = square;
delta = delta;
if (loadSquare)
square = 9'h1;
if (loadDelta)
delta = 9'h3;
//... and so on
код работает, как ожидалось, когда я запускаю моделирования, но я хотел бы узнать немного больше о том, что вызывает эти предупреждения.
Для 'always @ (posedge clk)' вы должны использовать '<=' неблокирующие назначения для правильной имитации триггера. – Morgan
Можете ли вы показать, как управляется 'addDelta'/ – Morgan
Убедитесь, что есть инструкция« else »для« if ». Задвижки создаются, если вы не укажете состояние сигнала при некоторых условиях. Поэтому не забудьте указать все случаи. – vipin