#verilog #fpga #vlsi
Вопрос:
Я писал код для регистра DAC, и требуется задержка. Однако в состоянии задержки DAC_counter_2
значение не увеличивается, и задержка не достигается. Я скопировал код в другой проект и попытался проверить. Проблема все еще существует. Любая помощь была бы очень кстати.
module dac_card
( output reg DAC_SCLK,
output reg SYNC,
output reg SDIN,
input MHZ_50_CLK,
input RST,
output reg [7:0] DAC_counter_1,
output reg [7:0] DAC_counter_2
);
reg [7:0] pst_state, nxt_state;
reg [23:0] DAC_reg;
always @(posedge MHZ_50_CLK)
begin
if (RST)
begin
DAC_reg <= 24'hEEEEEE;
SYNC <= 1'b1;
DAC_SCLK <= 1'b0;
SDIN <=1'b0;
DAC_counter_1 <= 8'd0;
DAC_counter_2 <= 8'd0;
pst_state <= 8'd0;
end
else
begin
pst_state <= nxt_state;
DAC_counter_1 <= DAC_counter_1 1'b1;
end
end
always @(pst_state or DAC_counter_2)
begin
case (pst_state)
8'd0 : begin
if (DAC_counter_2 == 8'd24)
begin
DAC_counter_2 = 8'd0;
SYNC = 1'b1;
SDIN = 1'b0;
nxt_state = 8'd2;
end
else
begin
SYNC = 1'b0;
DAC_SCLK = 1'b1;
DAC_counter_2 = DAC_counter_2 1'b1;
SDIN = DAC_reg [23]; //Writing DAC register
DAC_reg = DAC_reg << 1;
nxt_state = 8'd1;
end
end
8'd1 : begin
DAC_SCLK = 1'b0;
nxt_state = 8'd0;
end
8'd2 : begin
if (DAC_counter_2 == 8'd10) //Minimum delay for SYNC to be low for write mode
begin
SYNC = 1'b1;
DAC_counter_2 = 8'd0;
nxt_state = 8'd3;
end
else
begin
SYNC = 1'b0;
//Not incrementing
DAC_counter_2 = DAC_counter_2 1'b1;
end
end
8'd3 : begin
nxt_state = 8'd0;
end
default : begin
nxt_state = 8'd0;
end
endcase
end
endmodule
Вот испытательный стенд
module test_bench
();
//Analog Card DAC wires and registers
reg MHZ_50_CLK;
reg RST;
wire DAC_SCLK;
wire SYNC;
wire SDIN;
wire [7:0] DAC_counter_1;
wire [7:0] DAC_counter_2;
//Instatntiate DAC
dac_card dc (.DAC_SCLK(DAC_SCLK),
.SYNC(SYNC),
.SDIN(SDIN),
.MHZ_50_CLK(MHZ_50_CLK),
.RST(RST),
.DAC_counter_1(DAC_counter_1),
.DAC_counter_2(DAC_counter_2)
);
initial
begin
MHZ_50_CLK = 1'b0;
#10 RST = 1'b1;
#20 RST = 1'b0;
end
always
begin
#10 MHZ_50_CLK <= ~MHZ_50_CLK;
end
endmodule
Вот форма сигнала. После 24 отсчетов DAC_counter_2
задержка для 8’d10 не достигается.
Ответ №1:
Вам необходимо выполнить назначение nxt_state
во всех разделах вашего case
заявления. Это также позволяет избежать вывода о непреднамеренных защелках. Например, обратитесь к строке // MISSING nxt_state =
ниже:
8'd2 : begin
if (DAC_counter_2 == 8'd10) //Minimum delay for SYNC to be low for write mode
begin
SYNC = 1'b1;
DAC_counter_2 = 8'd0;
nxt_state = 8'd3;
end
else
begin
SYNC = 1'b0;
//Not incrementing
DAC_counter_2 = DAC_counter_2 1'b1;
// MISSING nxt_state =
end
end
Как показывают ваши волны, как только вы входите в состояние 2, вы остаетесь в состоянии 2. Поскольку DAC_counter_2
в состоянии 2 не 10, вы всегда выполняете else
предложение, которое не меняется nxt_state
.
Есть пара других проблем, которые также могут вызывать проблемы.
Хорошие методы кодирования рекомендуют назначать a reg
из одного always
блока. DAC_counter_2
назначается в 2 разных блоках.
Кроме того, один и тот же сигнал не должен появляться как на LHS, так и на RHS задания в комбинационном always
блоке, поскольку он создает петлю обратной связи. Например, DAC_counter_2 = DAC_counter_2 1
вероятно, должно быть в последовательном always
блоке, например DAC_counter_1
.