Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с несколькими источниками сигнала для одного компанента
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Lixlex
Здравствуйте, товарищи! Столкнулся при освоении QUARTUS c одной проблемой, очень неприятной для меня. Для наглядности опишу ситуацию:
У нас есть 8-битный регистр даннные в который заносятся по шине data[7..0]. Таким образом получается, что кроме как через эту шину не как не смогу занести в него данные. А мне нужно управлять отдельными битами регистра, но по другой линии. Посоветуйте пожалуйста как это по красивее сделать? Буду благодарен за пример схемы или кода на AHDL.
Напрашивается 2 способа :
1)Ставить мультиплексор, но тогда не очень удобно получится - ведь мне нужно управление лишь отдельными битами регистра
2) ставить перед входом регистра двувходовое " логическое И" на те биты, которыми надо управлять по второй линии - это пожалуй то что мне нужно но опять же не могу сделать так чтобы схема не была громоздкой.
Подскажите как это сделать правильно
barabek
Цитата(Lixlex @ Nov 8 2011, 14:47) *
...кода на AHDL....
Напрашивается 2 способа :
1)Ставить мультиплексор, но тогда не очень удобно получится - ведь мне нужно управление лишь отдельными битами регистра
2) ставить перед входом регистра двувходовое " логическое И" на те биты, которыми надо управлять по второй линии - это пожалуй то что мне нужно но опять же не могу сделать так чтобы схема не была громоздкой.
Подскажите как это сделать правильно


Ну и поставьте мультиплексор только на нужные биты. Если будете ставить свою исхему, то по одному "И" не хватит и у Вас в конечном счете получится тот-же мультиплексор. Это если, как я понял, будете рисовать в графике. А если все-таки соберетесь писать на языке, то почему выбрали AHDL, а не нормальный язык?
VladimirB
Цитата(Lixlex @ Nov 8 2011, 07:47) *
...но опять же не могу сделать так чтобы схема не была громоздкой.
Подскажите как это сделать правильно


Если вы с одним регистром так паритесь, то что же будет, когда нужно будет написать например Ethernet MAC или HD-видео кодер?
Поэтому, чтобы схема не была громоздкой - надо забить на схематик и писать на языках типа VHDL или Verilog sm.gif
Lixlex
Дело в том, что это задание по моей курсовой, а сейчас с языком времени особо разобраться нет, хотя конечно хотелось бы.
Sirko
Не зная требований к задаче, возможно скажу глупость, но если в задаче ключевое слово "управлять отдельными битами", то возможно поможет XOR.
Lixlex
Цитата
Если будете ставить свою исхему, то по одному "И" не хватит и у Вас в конечном счете получится тот-же мультиплексор.

как раз хватит. По тому, что по второй линии биты нужно только устанавливать, можно без возможности их сброса (флаг переполнения счетчика).
Но проблема не в этом. Мне немного не понятно как работать с шиной. Допустим есть шина data[7..0] можно брать от нее отдельные проводники, называя их соответственно data[0] data[1] и т.д. Но это получается на столько неудобно! Есть еще какой нибудь другой способ?
des00
Цитата(Lixlex @ Nov 8 2011, 05:51) *
Есть еще какой нибудь другой способ?

Есть, выкинуть в топку схематик и писать все ручками %)

Код
generate
for (int i = 0; i < 8; i++) begin
  always_ff @(posedge clk) begin
    if (set_bits[i] ^ write)
      data[i] <= set_bits[i] | write_data[i];
  end
endgenerate

Lixlex
по вашим совету немного поковырял верилог.
Код
module TMODE (in_dta, s_gate1, s_ct1, out_dta);

input[7:0] in_dta;
input s_gate1;
input s_ct1;

output[7:0] out_dta;

reg[7:0] out_dta; //регистр
wire s_ct1, s_gate1; //отдельные линии для установки битов
wire[7:0] in_dta; //шина по которой заносится байт целиком

always @(s_ct1, s_gate1, in_dta)
begin
    out_dta[7]=in_dta[7]|s_gate1;
    out_dta[6]=in_dta[6]|s_ct1;
    out_dta[5:0]= in_dta[5:0];
end
endmodule

В целом все работает как я хотел за исключением того что данные на выходе не фиксируются. Не подскажите как вместо регистра reg добавить dff?

barabek
Цитата(Lixlex @ Nov 9 2011, 01:18) *
по вашим совету немного поковырял верилог.



Ну так другой разговор sm.gif

Не совсем в курсе логики Вашей конкретной задачи, но это уже Вы сами справитесь.
По поводу регистра. Вы хотите, что бы данные фиксировались. Следовательно должна получиться синхронная схема (и это правильно), а это в свою очередь требует присутствие в схеме клока. И тогда Ваш код незначительно изменится:
Код
module TMODE (clk,in_dta, s_gate1, s_ct1, out_dta);
input[7:0] in_dta;
input s_gate1;
input s_ct1;
input clk;
output[7:0] out_dta;
reg[7:0] out_dta; //регистр
wire s_ct1, s_gate1; //отдельные линии для установки битов
wire[7:0] in_dta; //шина по которой заносится байт целиком
//always @(s_ct1, s_gate1, in_dta)
always @(posedge clk) //регистр, защелкивающийся по переднему фронту клока
begin
     out_dta[7]<=in_dta[7]|s_gate1;//В этих строках заменяем блокирующее (=) на неблокирующее(<=) присваивание, оно здесь больше подходит по смыслу
     out_dta[6]<=in_dta[6]|s_ct1;
     out_dta[5:0]<= in_dta[5:0];
end
endmodule
Lixlex
благодарю за помощь. Будем разбираться!
Putnik
Цитата(des00 @ Nov 8 2011, 15:57) *
Есть, выкинуть в топку схематик и писать все ручками %)

Код
generate
for (int i = 0; i < 8; i++) begin
  always_ff @(posedge clk) begin
    if (set_bits[i] ^ write)
      data[i] <= set_bits[i] | write_data[i];
  end
endgenerate

в квартусе и квесте такая конструкция заработала только при объявлении genvar i, и именовании begin:tralala

Код
genvar i;
generate
for (i = 0; i < 8; i++) begin:tralala
  always_ff @(posedge clk) begin
    if (set_bits[i] ^ write)
      data[i] <= set_bits[i] | write_data[i];
  end
endgenerate


что дает именование begin?
des00
Цитата(Putnik @ Nov 29 2011, 07:32) *
в квартусе и квесте такая конструкция заработала только при объявлении genvar i, и именовании begin:tralala

и это правильно, в моем коде были ошибки wink.gif теперь вы их нашли и устранили, а вопрос что значит ищется в стандарте минуты за 3 wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.