Перейти к содержанию
    

spi буфер ошибка синтаксиса

module avrout(
    input    clock,
    input   clk_avr,
    input ena_avr,
    input [12:0]  FAZ,
    input [12:0] AMP,
    input [7:0] mode,
    output reg TX
);

reg [39:0] TRIG;  

if (ena_avr) begin
   always @(posedge clk_avr) begin
   TX <= TRIG[0];    
   TRIG[0:38] <= TRIG[1:39];
   TRIG[39] <= 0;
   end         
end
else begin
   always @(posedge clock) begin
   TRIG[0:7] <= mode[7:0];
   TRIG[8:20] <= FAZ[12:0];
   TRIG[21] <= FAZ[12];
   TRIG[22] <= FAZ[12];
   TRIG[23] <= FAZ[12];
   TRIG[24:36] <= AMP[12:0];
   TRIG[37] <= 0;
   TRIG[38] <= 0;
   TRIG[39] <= 0;
   end
end

endmodule

 

очень странная ругань компилятора Error (10170): Verilog HDL syntax error at avrout.v(32) near text "end"; expecting "endmodule"

может always блок нельзя вставлять в условия if else

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

if (ena_avr) begin

always @(posedge clk_avr) begin

.....

else begin

always @(posedge clock) begin

....

end

end

 

endmodule[/code]

 

Вообще все это очень плохо. Вы под ena_avr коммутируете тактовую на входе регистра TRIG, причем не факт, что clk_avr и clock коммутируются без глитчей и метастабильности.

На мой взгляд это совершенно бессмысленно, поскольку наверняка clk_avr намного медленнее, чем clock. А потому я рекомендую сделать CDC прямо на входе в ПЛИС по данным и по клоку от АВР...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ena_avr конечно медленнее основного clk

суть какая по основному клоку происхоит паралельная загрузка в буфер

когда ena_avr 1 тогда паралельная запись блокируеться и побитово выгружаеться в avr

через avr_clk

а как сделать по другому ?

avr ведь может делать чтение абсолютно асинхронно в зависимости о загружености другими задачами

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ловите состояния ena_avr и clk_avr стробируя тактовой частотой (clock). Тогда не придется мучиться с появлением сигналов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а как сделать по другому ?

avr ведь может делать чтение абсолютно асинхронно в зависимости о загружености другими задачами

У меня на сайте "Краткий Курс", глава об асинхронных частотах.

В момент прихода данных и клока от АВР пропускаете их через триггера под системный клок. Тоже и с ena_avr.

И тогда останется только одна частота для обработки внутри ПЛИС...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще все это очень плохо. Вы под ena_avr коммутируете тактовую на входе регистра TRIG, причем не факт, что clk_avr и clock коммутируются без глитчей и метастабильности.

На мой взгляд это совершенно бессмысленно, поскольку наверняка clk_avr намного медленнее, чем clock. А потому я рекомендую сделать CDC прямо на входе в ПЛИС по данным и по клоку от АВР...

always @(posedge clock) begin
   sinxr_avr_ena <= ena_avr;
   sinxr_clk_avr <= clk_avr; 
      if (sinxr_avr_ena == 0) begin
       TRIG[0:7] <= mode[7:0];
       TRIG[8:20] <= FAZ[12:0];
       TRIG[21] <= FAZ[12];
       TRIG[22] <= FAZ[12];
       TRIG[23] <= FAZ[12];
       TRIG[24:36] <= AMP[12:0];
       TRIG[37] <= 0;
       TRIG[38] <= 0;
       TRIG[39] <= 0;
      end 
      else begin
         if ((~sinxr_clk_avr & clk_avr)) begin
          TX <= TRIG[0];    
          TRIG[0:38] <= TRIG[1:39];
          TRIG[39] <= 0;
         end
               
      end  
   
end


endmodule

переделал ругани нет завтра буду пробовать

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

always @(posedge clock) begin
   sinxr_avr_ena <= ena_avr;
   sinxr_clk_avr <= clk_avr; 
.....
         if ((~sinxr_clk_avr & clk_avr)) begin

   
end


endmodule

переделал ругани нет завтра буду пробовать

Теперь эти два места переделать надо!

В синхронизаторе - 2 триггера на сигнал.

А это - ~sinxr_clk_avr & clk_avr даст метастабильность. Надо выделять из clk_avr передний фронт. Т.е. делать импульс длительностью 1 clock

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

попробовал скомпилить опять пошли ошибки компиляции

причем ну очень странного содержания

 

TRIG[0:7] <= mode[7:0];

Error (10198): Verilog HDL error at avrout.v(42): part-select direction is opposite from prefix index direction

вроде что то с разрядностью

причем ошибки везде где шина развернута если же

прямо

TRIG[7:0] <= mode[7:0]; все ок никаких проблем

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

TRIG[0:7] <= mode[7:0];

Error (10198): Verilog HDL error at avrout.v(42): part-select direction is opposite from prefix index direction

....

прямо

TRIG[7:0] <= mode[7:0]; все ок никаких проблем

Вот возьмите себе за правило. Чем меньше "разнообразия", тем меньше вероятность ошибки. Это относится и к логическим активным уровням, и к нумерации шин и к написанию текстов файлов и к комментариям. А особенно к названиям сигналов...

В чем необходимость перекручивать сигналы в шине TRIG[0:7] <= mode[7:0]; ???

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну если с mode[7:0]; особых проблем нет я потом в avr переверну то как сделать это TRIG[0:38] <= TRIG[1:39];

такая же проблема

 

я вобще не професионал и вряд ли им стану

восновном делаю для себя разные девайсы типа хобби и все

но на мой субективный взгяд верилог тяжелый язык для новичка

тут надо точно знать что как делаеться

в соседней ветке про

управляемый гребенчатый фильтр

где нужно сделать вычисляемый отвод от цепочки регистров

та конструкция через for что я везде ставил оказалось не работает

еслиб не помощь я б решения не нашел

по поводу разнообразия полностью согласен нужен один стандарт на язык програмирования

ну понятно что отличия все равно будут но одни и те-же по смыслу функции очень желательно чтоб везде были одинаковыми

например фигурные скобки {} а здесь begin и end

зачем так сделали непонятно

 

 

вобщем решил не связываться с for

вместо TRIG[0:38] <= TRIG[1:39];

 

           TX <= TRIG[0];
          TRIG[0] <= TRIG[1];
          TRIG[1] <= TRIG[2];
          TRIG[2] <= TRIG[3];
          TRIG[3] <= TRIG[4];
          TRIG[4] <= TRIG[5];
          TRIG[5] <= TRIG[6];
          TRIG[6] <= TRIG[7];
          TRIG[7] <= TRIG[8];
          TRIG[8] <= TRIG[9];
          TRIG[9] <= TRIG[10];
          TRIG[10] <= TRIG[11];
          TRIG[11] <= TRIG[12];
          TRIG[12] <= TRIG[13];
          TRIG[13] <= TRIG[14];
          TRIG[14] <= TRIG[15];
          TRIG[15] <= TRIG[16];
          
          TRIG[16] <= TRIG[17];
          TRIG[17] <= TRIG[18];
          TRIG[18] <= TRIG[19];
          TRIG[19] <= TRIG[20];
          TRIG[20] <= TRIG[21];
          TRIG[21] <= TRIG[22];
          TRIG[22] <= TRIG[23];
          TRIG[23] <= TRIG[24];
          TRIG[24] <= TRIG[25];
          TRIG[25] <= TRIG[26];
          TRIG[26] <= TRIG[27];
          TRIG[27] <= TRIG[28];
          TRIG[28] <= TRIG[29];
          TRIG[29] <= TRIG[30];
          TRIG[30] <= TRIG[31];
          
          TRIG[31] <= TRIG[32];
          TRIG[32] <= TRIG[33];
          TRIG[33] <= TRIG[34];
          TRIG[34] <= TRIG[35];
          TRIG[35] <= TRIG[36];
          TRIG[36] <= TRIG[37];
          TRIG[37] <= TRIG[38];
          TRIG[38] <= TRIG[39];
          TRIG[39] <= 0;

напрямую написал

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

TRIG[38:0]<=TRIG[39:1]; проще и понятнее будет

Для вашего mode:

TRIG[7:0]<={mode[0],mode[1],mode[2],mode[3],mode[4],mode[5],mode[6],mode[7]};

или с использованием generate:

genvar i;
generate
for(i=0; i<8; i=i+1)
begin
  TRIG[i]<= mode[7-i];
end
endgenerate

Еще есть System Verilog...

Изменено пользователем bugdesigner

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну если с mode[7:0]; особых проблем нет я потом в avr переверну то как сделать это TRIG[0:38] <= TRIG[1:39];

такая же проблема

 

я вобще не професионал и вряд ли им стану

восновном делаю для себя разные девайсы типа хобби и все

но на мой субективный взгяд верилог тяжелый язык для новичка

тут надо точно знать что как делаеться

в соседней ветке про

управляемый гребенчатый фильтр

где нужно сделать вычисляемый отвод от цепочки регистров

та конструкция через for что я везде ставил оказалось не работает

еслиб не помощь я б решения не нашел

по поводу разнообразия полностью согласен нужен один стандарт на язык програмирования

ну понятно что отличия все равно будут но одни и те-же по смыслу функции очень желательно чтоб везде были одинаковыми

например фигурные скобки {} а здесь begin и end

зачем так сделали непонятно

 

 

вобщем решил не связываться с for

вместо TRIG[0:38] <= TRIG[1:39];

 

 

напрямую написал

 

Да нет, Верилог не виноват.

Вы же написали:

reg [39:0] TRIG;

Вот он и хочет видеть выборку частей вектора именно в таком порядке, а не наоборот. Написали бы наоборот и он бы горя не знал...

И не про "фигурные скобки {} а здесь begin и end " я Вам пытался объяснить, а про то, что Вы сами себе жизнь усложняете разными выкрутасами...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...