From 6a21034db457c3595bb68007bded58936c15b6ac Mon Sep 17 00:00:00 2001 From: Djadik Date: Sun, 10 May 2026 14:25:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=A08:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=82=D1=8C=20=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20p=5Fdat=5Fo=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20APB-=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В текущей реализации `p_dat_o` формируется комбинаторно только во время импульса `cs`. Из-за этого данные на выходе появляются раньше, чем приходит `p_ready`, а затем `p_dat_o` сразу обнуляется. В результате к моменту завершения APB-транзакции, когда `p_ready = 1`, на выходе уже может быть `0`. Текущий вариант: ```systemverilog always_comb begin p_dat_o = '0; if (cs & (~p_we_i) & (p_adr_i[3:0] == 4'd4)) p_dat_o = {24'd0, crc_o}; else if (cs & (~p_we_i)& (p_adr_i[3:0] == 4'd8)) p_dat_o = {30'd0, state}; end ``` Предлагаемое исправление: ```systemverilog always_ff @(posedge p_clk_i) begin if (!p_rstn_i) begin p_dat_o <= '0; end else begin if (cs & (~p_we_i) & (p_adr_i[3:0] == 4'd4)) begin p_dat_o <= {24'd0, crc_o}; end else if (cs & (~p_we_i) & (p_adr_i[3:0] == 4'd8)) begin p_dat_o <= {30'd0, state}; end end end ``` --- Labs/08. APB and CRC/README.md | 35 ++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/Labs/08. APB and CRC/README.md b/Labs/08. APB and CRC/README.md index 2f31bf1..37f7d66 100644 --- a/Labs/08. APB and CRC/README.md +++ b/Labs/08. APB and CRC/README.md @@ -374,10 +374,19 @@ assign cs = cs_1_ff & (~cs_2_ff); ```verilog // Формирование выходных данных системной шины -always_comb -begin //Для чтения crc используем адрес 1 - if (cs & (~p_we_i) & (p_adr_i[3:0] == 4'd4)) - p_dat_o = {24'd0, crc_o}; +always_ff @(posedge p_clk_i) +begin + if (!p_rstn_i) begin + p_dat_o <= '0; + end + else begin + if (cs & (~p_we_i) & (p_adr_i[3:0] == 4'd4)) begin + p_dat_o <= {24'd0, crc_o}; + end + else if (cs & (~p_we_i) & (p_adr_i[3:0] == 4'd8)) begin + p_dat_o <= {30'd0, state}; + end + end end // Формирование сигналов на модуль-вычислитель @@ -497,13 +506,19 @@ module wrapper_crc8 assign p_ready = p_ready_ff; - always_comb + always_ff @(posedge p_clk_i) begin - p_dat_o = '0; - if (cs & (~p_we_i) & (p_adr_i[3:0] == 4'd4)) - p_dat_o = {24'd0, crc_o}; - else if (cs & (~p_we_i)& (p_adr_i[3:0] == 4'd8)) - p_dat_o = {30'd0, state}; + if (!p_rstn_i) begin + p_dat_o <= '0; + end + else begin + if (cs & (~p_we_i) & (p_adr_i[3:0] == 4'd4)) begin + p_dat_o <= {24'd0, crc_o}; + end + else if (cs & (~p_we_i) & (p_adr_i[3:0] == 4'd8)) begin + p_dat_o <= {30'd0, state}; + end + end end assign data_valid_i = (cs & p_we_i & p_adr_i[3:0] == 4'd0);