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

Здравствуйте!

Вопрос, можноли выводить данные следующим образом:

input ZPR1; 
input ZPR2;
input CLK;
output reg [9:0]OUT;
always@(posedge CLK)
begin
    if((ZPR1==1)&&(ZPR2==0))
    begin
        OUT[9:0]=10'd100;
    end
    if((ZPR1==0)&&(ZPR2==1))
    begin
        OUT[9:0]=10'd200;
    end
    if((ZPR1==0)&&(ZPR2==0))
    begin
        OUT[9:0]=10'd0;
    end
end

 

Если вывожу следующим образом данные, то модуль не работает, стоит закоментировать OUT[9:0]=10'd200; и все работает.

Запросы приходят следующим образом

post-86990-1448300936_thumb.png

Если дергаю ножкой в одном из условий, часто идут провалы, пускал счетчик место констат - счет происходил неверно.

Можно ли выводить данные на одну линию поочереди по таким условиям, или проблема может быть в чем-то другом?

Спасибо

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


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

Здравствуйте!

Рекомендую ознакомиться с темой присваиваний в Verilog

http://svo.2.staticpublic.s3-website-us-ea...og/assignments/

 

Я бы использовал оператор Case или комбинационную запись:

assign out _nxt = ( ) ? : ;

Если Вы используете If, то должны быть операторы else.

Должно быть определено значение по умолчанию.

Третье условие можно использовать, как дефолтное.

Погуглите "if verilog". Информации, как правильно использовать, предостаточно.

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


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

или проблема может быть в чем-то другом?

Клок пропускаете через логику? Если да, то проблема в асинхронщине.

 

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


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

Проблема в синхронизации - надо оба входных сигнала синхронизировать к CLK.

Да, и стоит использовать "<=" вместо "=".

 

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


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

Проблема в синхронизации - надо оба входных сигнала синхронизировать к CLK.

Почему Вы решили, что они не синхронизированы? Вроде явно это ниоткуда не следует.

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


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

Почему Вы решили, что они не синхронизированы? Вроде явно это ниоткуда не следует.

Это правда, но из фразы "дергаю ножкой в одном из условий, часто идут провалы" можно предположить, что что-то не то с синхронизацией.

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


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

По поводу синхронизации, пробовал следующим образом, результат был такой же

input ZPR1; 
input ZPR2;
input CLK;
output reg [9:0]OUT;
always@(ZPR1 or ZPR2) //////////////////////////////////////
begin
    if((ZPR1==1)&&(ZPR2==0))
    begin
        OUT[9:0]=10'd100;
    end
    if((ZPR1==0)&&(ZPR2==1))
    begin
        OUT[9:0]=10'd200;
    end
    if((ZPR1==0)&&(ZPR2==0))
    begin
        OUT[9:0]=10'd0;
    end
end

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


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

По поводу синхронизации, пробовал следующим образом, результат был такой же

input ZPR1; 
input ZPR2;
input CLK;
output reg [9:0]OUT;
always@(ZPR1 or ZPR2) //////////////////////////////////////
begin
    if((ZPR1==1)&&(ZPR2==0))
    begin
        OUT[9:0]=10'd100;
    end
    if((ZPR1==0)&&(ZPR2==1))
    begin
        OUT[9:0]=10'd200;
    end
    if((ZPR1==0)&&(ZPR2==0))
    begin
        OUT[9:0]=10'd0;
    end
end

Это не синхронизация. Такая конструкция не может быть исполнена в железе.

 

Как сказали ранее, нужно более детальное описание. Не понятно что, откуда и куда.

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


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

Здравствуйте!

Рекомендую ознакомиться с темой присваиваний в Verilog

http://svo.2.staticpublic.s3-website-us-ea...og/assignments/

 

Я бы использовал оператор Case или комбинационную запись:

assign out _nxt = ( ) ? : ;

Если Вы используете If, то должны быть операторы else.

Должно быть определено значение по умолчанию.

Третье условие можно использовать, как дефолтное.

Погуглите "if verilog". Информации, как правильно использовать, предостаточно.

input ZPR1; 
input ZPR2;
input CLK;
output reg [9:0]OUT;
output reg TEST1;
always@(posedge CLK)
begin
    if(ZPR1==1)
    begin
        OUT<=10'd101;    
        TEST1<=~TEST1;
    end
    else if(ZPR2==1)
    begin
        OUT<=10'd100;
    end
    else
    begin
        OUT<=10'b0;
    end
end

не очень представляю как описать это через assign

Результат выполнения такой:

post-86990-1448350681_thumb.jpg

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

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


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

Входы ZPR1 и ZPR2 необходимо синхронизировать, как посоветовали.

И выделить из них фронты, которые уже заводить в блок always.

А может не нужно. Ибо какой конкретно необходим результат исполнения, не указали.

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


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

не очень представляю как описать это через assign

Это курсовик или хотите научиться?

Могу предложить персональные занятия...

 

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


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

Я вывожу на одну шину вначале один кусок данных, потом второй, по 2м запросам (10бит+10бит).

Проверяю на счетчике, в данном случае у меня счетчик инкрементируется не на 1, а бывает на 2.

По ножке TEST1, вижу что бывают сбои и блок выполняется чаще, как на скриншотах выше.

Сейчас попробовал так:

Проблема не пропала

input ZPR1; 
input ZPR2;
output reg TEST1;
output wire [9:0] OUT;
assign OUT[9:0] = ZPR1?(DATA_CH1[0:9]):(ZPR2?(DATA_CH2[0:9]):0);
always@(negedge ZPR11)
begin
    TEST1=~TEST1;
    DATA_CH1=DATA_CH1+1;
    if(DATA_CH1==0)
    begin
        DATA_CH2=DATA_CH2+1;
    end
end

 

Пробовал синхронизировать ZPR1 и ZPR2

assign zpr = ZPR11|ZPR21;
always@(zpr)
begin
    if(ZPR11==1)
    begin
       TEST1=1;
       OUT=DATA_CH1[0:9];    
       DATA_CH1=DATA_CH1+1;
       if(DATA_CH1==0)
       begin
        DATA_CH2=DATA_CH2+1;
       end
    end
    else if(ZPR2==1)
    begin
        TEST1=1;
        OUT=DATA_CH2[0:9];
    end
    else
    begin
        TEST1=0;
        OUT=10'b0;
    end
end

Проблема остается

post-86990-1448358301_thumb.jpg

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

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


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

Я вывожу на одну шину ...

Пока все довольно плохо...

Почитайте хотя бы "Краткий Курс" у меня на сайте...

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


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

простейший синхронизатор для сигналов ZPR1 и ZPR2

module in_out_flag
(
input  in_flag,
input  out_clk,
output ena_out_flag
);

reg          dff_a = 1'b0;
reg [1:0] shift_rg = 2'b00;

always @(posedge out_clk or posedge in_flag)
begin
if(in_flag)            dff_a <= 1'b1;
else                dff_a <= 1'b0;
end

always @(posedge out_clk)
begin
shift_rg <= {shift_rg[0], dff_a};
end

assign ena_out_flag = ~shift_rg[1] && shift_rg[0];

endmodule

 

читаем "синхронизаторы сигналов, пересекающих клоковый домен (CDC, Clock Domain Cross)"

 

 

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


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

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

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

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

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

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

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

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

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

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