Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Serial to parallel
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
superpriz
Здравствуйте, у меня следующая проблема. Нужно преобразовать последовательный поток в параллельный. Вот сделал набросок кода, то что сразу в голову пришло.
Код
module serial_2_parallel (clock, reset, serial_data_inp, parallel_data_out);

input wire clock, reset, serial_data_inp;
output wire [3:0] parallel_data_out;

reg [3:0] parallel_data;
reg [1:0] count;

assign parallel_data_out = (count == 'b00) ? parallel_data : parallel_data_out;

always @(posedge clock or negedge reset) begin
if(reset)
begin
  count <= 'b00;
  parallel_data <= 'd0;
end
else
  begin
    count <= count + 'd1;
    parallel_data <= {serial_data_inp, parallel_data[3:1]};
  end
end
endmodule


Вот только в туже голову не приходит как добавить в эту схему следующий функционал.
К источнику последовательных данных прилагается сигнал ser_valid, который определяет какой бит можно считывать, а какой нет.
Теперь мне нужно накопить 4 "правильных" бита и выдать их на параллельную шину, указав при этом, что выходные данные готовы - сигнал par_valid.
Причем сигнал par_valid должен длиться 1 такт не зависимо от того приходят на вход новые данные или нет. Помогите кто чем может.
barabek
 
Код
module serial_2_parallel (clock, reset, serial_data_inp,ser_valid, parallel_data_out,par_valid); 

 input clock, reset, serial_data_inp,ser_valid;
 output wire [3:0] parallel_data_out;
  output wire par_valid;
  reg [3:0] parallel_data;
  reg [1:0] count;
  reg count_prev_not_zerro;
//*****  
 assign parallel_data_out = parallel_data;
  assign par_valid=count_prev_not_zerro & ~|count;
//*****  
always @(posedge clock or negedge reset) begin
     if(!reset)begin
           count <= 'd0;
           parallel_data <= 'd0;
     end else if(ser_valid)begin
           count <= count + 1'b1;
           parallel_data <= {serial_data_inp,parallel_data[3:1]};
      end
end
//*****  
always @(posedge clock or negedge reset) begin
     if(!reset)count_prev_not_zerro<=1'b0;
     else count_prev_not_zerro<=|count;
end
endmodule

Кажется, где-то так, если не требуется регистров на выходе
superpriz
barabek, спасибо большое, результат прямо в точку. Скажите, а это решение вы сами придумали или вычитали в литературе? Если не затруднит, подскажите парочку источников с такими приемами. Я начинающий, изучаю verilog, но в той литературе, что мне попадается описано как сделать счетчик, мультиплексор, тригер и тд, а вот про такие хитрости нигде не сказано.
barabek
Цитата(superpriz @ Apr 1 2011, 18:37) *
это решение вы сами придумали или вычитали в литературе?

Сам, на все случаи в литературе ответов не найти. Я сам еще начинающий, поэтому насчет литературы боюсь советовать. Пройдитесь поиском, я тоже здесь видел советы. Правда из всех советуемых, к своему стыду, почитал "SystemVerilog-for-Verification-Second-Edition-A-Guide-to-Learning-the-Testbench-Language-Features.9780387765297.31566.pdf", другие только проглядывал, еще стандартом постоянно приходится пользоваться. Но почитать его основательно опять-таки времени не хватает. Ну и несколько чужих кодов для ознакомления с opencores. В общем, повторюсь - не советчик.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.