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

Область чуствительности компаратора

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

Помогите разобраться в вопросе о цифровам компараторе.

Пишу компаратор вида:

 

module comparate #(parameter NBIT =8, parameter NBIT_G = 4)
(
input clk,
input [NBIT-1:0] A, B,
input [NBIT_G-1:0] G, 
OUT
);

Так вобщим обычный компаратор, но тут есть параметер "G" который задаёт область чуствительности сровнения.

Допустим шина А и шина В сравниваются между собой, но к шине В применяется область чуствительности G (разрядность которой кстати меньше сравниваемых шин) и если А попадает в эту область чуствительности то на выходе высокий уровень.

Я решил что нужно значение G разделить на 2 и полученый результат прибавить к В, сохранив сие в регистре. Затем от В отнять этот результат и сохранить в другом регистре.

Но тут разная разрядность шин и потом если В = 254, а G = 14 при сложении получится не то что надо.

Помогите составить алгоритм или может пример подобный есть или ресурсы интересные???...

За ранее спасибо!!!!!

 

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


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

Вобщем нужно чтото типа программируемого гистеризиса для цифрового компаратора...

 

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


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

По ходу мыслей нет :(

Вот я тут написал модуль, не особо наверное!

Глянте может кто подскажет, модуль компилируется, но нутром чувстваю - чтото упустил :blush:

module trig_ADC      
(
input  clk,
input  clk_adc,
input  [7:0]adc_data,      
input  [7:0]cpu_data,      
input  [3:0]gisterezis,    
output Q                   
//...........
);

reg [7:0]min=0;
reg [7:0]max=0;

always @(posedge clk)    //or negedge 
begin
if(clk_adc)
  begin
   if(cpu_data==8'b1)
    begin
    max <= cpu_data + (gisterezis/2);
    end
   else
    begin
    max <= 1;
    end
  end
end
//
always @(posedge clk)    //or negedge 
begin
if(clk_adc)
  begin
   if(cpu_data==8'b0)
    begin
    min <= cpu_data - (gisterezis/2);
    end
   else
    begin
    min <= 0;
    end
  end
end

assign Q = ((adc_data>min) & (adc_data<max)) ? 1'b1 : 1'b0; // Процедура сравнения

endmodule

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

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


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

По ходу мыслей нет :(

вариант:

module trig_ADC      
(
input  clk,
input  clk_adc,
input  [7:0]adc_data,      
input  [7:0]cpu_data,      
input  [3:0]gisterezis,    
output Q                   
);
reg [7+1:0]cpu_data_up_temp;
reg [7+1:0]adc_data_bott_temp;
reg below_up_bound,above_bott_bound;

always@(*)cpu_data_up_temp={1'b0,cpu_data}+gisterezis[3:1];
always@(*)adc_data_bott_temp={1'b0,adc_data}+gisterezis[3:1];
//
always @(posedge clk)begin     
    if(clk_adc)begin
        below_up_bound<= cpu_data_up_temp>{1'b0,adc_data};//если включать границы то сравнение '>',иначе '>='
        above_bott_bound<=adc_data_bott_temp>={1'b0,cpu_data};//если включать границы то сравнение '>=',иначе '>'
    end
end

assign Q = below_up_bound & above_bott_bound; // Процедура сравнения
endmodule

Я, правда, не проверял. Гляньте.

PS. C русским у Вас гораздо хуже, чем у меня :)

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


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

barabek Огромное спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

PS. C русским у Вас гораздо хуже, чем у меня :)

Да, это правда...

Пару вопросов по вашему варианту кода:

 

{1'b0, cpu_data} // Что делает подобная строчка
gisterezis[3:1]     // Зачем "1" когда пин был объявлен так 
input  [3:0]gisterezis

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

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


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

Пару вопросов по вашему варианту кода:

 

1)    {1'b0, cpu_data} // Что делает подобная строчка


2)    gisterezis[3:1]     // Зачем "1" когда пин был объявлен так  input  [3:0]gisterezis

1. Конкатенация. Явно привел ширину слова, добавив 0 в качестве 9-го бита, к ширине слова слева.

 

2. Упростил работу синтезатору, так как gisterezis[3:1]== (gisterezis/2 ).

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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