Soy bastante nuevo en Verilog y en general Diseño Digital. Estoy trabajando en un proyecto que tiene una máquina de estado. El módulo, en un estado particular, recibe un paquete de solicitud de lectura de otro módulo y tengo que descodificar el tamaño de datos de respuesta de lectura requerido y devolver tantos bytes de datos en la carga útil. Ahora tengo que hacer esto cada n ciclos.
Me resulta difícil entender dónde se debe actualizar mi conteo y dónde se debe asignar el siguiente valor de conteo. Aquí está la estructura general de mi código.
always@(posedge clk_i or negedge resetn_i) begin
if (resetn_i == 1'b0) begin
reg_read_en <= 1'b0;
reg_write_en <= 1'b0;
count <= 3'b111;
next_count <= 3'b111;
state <= S_INITIAL;
end else begin
state <= next_state;
count <= next_count;
end
Este es el bloque secuencial. Ahora en mi bloque combinacional
always@(*) begin
next_state = state;
next_count = count;
.......
........
M_PASSIVE:begin
if(count == 3'b000)
begin
//Update some registers with new data values
end else begin
next_count = count - 3'b001;
end
No puedo entender. Espera el recuento requerido de ciclos y luego actualizo los valores de registro o me estoy perdiendo algo aquí.
Apreciaría mucho algo de claridad sobre esto.
P.S. Perdóneme si me faltan algunos aspectos fundamentales del diseño de comportamiento con respecto a la diferencia entre bloques secuenciales y combinacionales.
Aquí hay un código completo de lo que estoy tratando de hacer. Esencialmente quiero leer un paquete, girar la lectura de paquetes, esperar 7 u 8 ciclos de reloj o N clk ciclos y luego enviar una respuesta de lectura con los datos en los registros que se asignan a los puertos de salida continuamente.
always@(posedge clk_i or negedge resetn_i) begin
if (resetn_i == 1'b0) begin
reg_read_en <= 1'b0;
reg_write_en <= 1'b0;
count <= 3'b111;
state <= S_INITIAL;
end else begin
state <= next_state;
count <= next_count;
end
end
always@(*) begin
next_state = state;
next_count = count;
case(state)
S_INITIAL: begin //not enabled
if(enable_i == 1'b1) begin
next_state = S_ENABLED;
end
reg_read_en <= 1'b0;
reg_write_en <= 1'b0;
end
S_ENABLED: begin
if(enable_i == 1'b0) begin
next_state = S_INITIAL;
end
case(mode_i)
M_PASSIVE:begin
reg_read_en = dnoc_packet_ready;
//pkt_type = dnoc_packet_pld_header[]
if(dnoc_packet_ready)
begin
reg_read_en = 1'b0;
if(count == 3'b000)
begin
reg_write_en = 1'b1;
read_resp_tx_data_size = 3'b001;
read_resp_tx_qpe_dest = 6'b000010;
read_resp_tx_mod_dest = 5'b00000;
read_resp_tx_c_routing = 0;
read_resp_tx_pld_header = 17'b00100101000000000;
read_resp_tx_pld_address = 32'h0001;
read_resp_tx_pld_data = 256;
//count = 3'b111;
reg_write_en = 1'b0;
end
next_count = count - 3'b001;
end
end