LAS9891 0 3 мая, 2017 Опубликовано 3 мая, 2017 (изменено) · Жалоба Возник такой тупой вопрос. Есть такой код: reg [7:0] temp = 8'h00; reg [3:0] n = 4'b0000; always@(posedge CLOCK) begin if(n<=3'b111) begin temp[n] <= 1'b1; n<=n+1'b1; end end Что будет содержаться в temp[0] при выполнении такой программы? Что произойдёт, когда случится первый фронт CLOCK: temp[0] <= 1'b1; или temp[1] <= 1'b1; ? И что будет если код переписать так: reg [7:0] temp = 8'h00; reg [3:0] n = 4'b0000; always@(posedge CLOCK) begin if(n<=3'b111) begin temp[n] = 1'b1; n<=n+1'b1; end end Изменено 3 мая, 2017 пользователем LAS9891 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Raven 11 3 мая, 2017 Опубликовано 3 мая, 2017 · Жалоба Чего вы хотели добиться вот этим: if(n<=3'b111) Ведь под это условие подпадает любой физически реализуемый код n? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 3 мая, 2017 Опубликовано 3 мая, 2017 · Жалоба Чего вы хотели добиться вот этим: if(n<=3'b111) Ведь под это условие подпадает любой физически реализуемый код n? Исправил. Но это и не важно. Меня интересует, что произойдёт, когда случится первый фронт CLOCK: temp[0] <= 1'b1; или temp[1] <= 1'b1; ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 3 мая, 2017 Опубликовано 3 мая, 2017 · Жалоба Приветствую! Возник такой тупой вопрос. Есть такой код: reg [7:0] temp = 8'h00; reg [3:0] n = 4'b0000; always@(posedge CLOCK) begin if(n<=3'b111) begin temp[n] <= 1'b1; n<=n+1'b1; end end Что будет содержаться в temp[0] при выполнении такой программы? Что произойдёт, когда случится первый фронт CLOCK: temp[0] <= 1'b1; или temp[1] <= 1'b1; ? ... Во общем случае зависит от значения n в момент CLOCK :) Если предположить что n=0 то temp[0] <= 1'b1 Уже говорилось что неблокирующие присваивания (<=) исполняются в конце дельта цикла симуляции. Если по коду то грубо в точке end (которая от always begin) А точка назначения и значение присваивания вычисляется до этого момента. Блокирующие присваивания (=) исполняются мгновенно в момент присваивания. Ну а теперь думаю Вы сможете ответить что же будет и во втором случае. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 3 мая, 2017 Опубликовано 3 мая, 2017 · Жалоба Во общем случае зависит от значения n в момент CLOCK :) Если предположить что n=0 то temp[0] <= 1'b1 А если учесть что значение n (n<=n+1'b1) и значение temp (temp[n] <= 1'b1;) должны измениться одновременно? Какая переменная изменится раньше? Если n раньше, то temp[0] останется нулём, а если temp раньше, то temp[0] будет равно 1. Как это предугадать? Блокирующие присваивания (=) исполняются мгновенно в момент присваивания. Ну а теперь думаю Вы сможете ответить что же будет и во втором случае. Во втором случае, я полагаю temp[0] будет равно 1'b1. Я прав? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 3 мая, 2017 Опубликовано 3 мая, 2017 · Жалоба Приветствую! ... Уже говорилось что неблокирующие присваивания (<=) исполняются в конце дельта цикла симуляции. Если по коду то грубо в точке end (которая от always begin) А точка назначения и значение присваивания вычисляется ДО этого момента. .... Да. Впрочем как и в первом случае. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 3 мая, 2017 Опубликовано 3 мая, 2017 · Жалоба Да. Впрочем как и в первом случае. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться