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

вопрос по созданию сумматора (helloworld)

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

В качестве хелловорлда написал проектик-сумматор.

Суть его в том, что на:

1) сигнал reset - зануляются счетчики.

2) сигнал clc - происходит заполнение 10-елементного массива интов извне. По окончанию заполнения считается ксор всех бит и выводится.

 

Вот код:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    15:02:32 01/04/2011 
// Design Name: 
// Module Name:    mod 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////

module mod(
   input [0:0] reset,
 input [0:0] clc,
   input [0:31] in,
   output reg [0:0] out
   );

reg[0:31] array[0:9];

reg[0:31] counter;

reg[0:31] i;



task summator;  // процедура суммирования

begin

for(i=1;i<10;i=i+1)array[0]=array[0]^array[i];

array[0][0:15]=array[0][0:15]^array[0][16:31];

array[0][0:7]=array[0][0:7]^array[0][8:15];

array[0][0:3]=array[0][0:3]^array[0][4:7];

array[0][0:1]=array[0][0:1]^array[0][2:3];

array[0][0:0]=array[0][0:0]^array[0][1:1];

end

endtask



always @(posedge reset) counter=0; //зануление счетчика массива



always @(posedge clc)

begin

if(counter>=10)

begin
// суммирование, если елементы массива закончились
summator();

out=array[0][0:0];

end



else



begin
// заполнение массива в противном случае
array[counter]=in;

counter=counter+1;

end



end

endmodule

 

Ах да, среда разаработки ISE WebPack 12.

 

Ошибка выдается:

ERROR:Map:116 - The design is empty. No processing will be done.

ERROR:Map:52 - Problem encountered processing RPMs.

 

Посдкажите, пожалуйста, что я делал неправильно и что нужно переделать.

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


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

Ваш дезайн вообще не должен был синтезироваться - у вас присваивания в counter в 2х разных always блоках

 

PS. Ваш xor - это жесть ;)

xor всех битов array[0] записывается как ^array[0]

 

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


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

Ваш дезайн вообще не должен был синтезироваться - у вас присваивания в counter в 2х разных always блоках

 

PS. Ваш xor - это жесть ;)

xor всех битов array[0] записывается как ^array[0]

Привычка, взятая из С :laughing:

Методом втыка понял, что ошибка в такокого рода конструкциях:

 

array[0][0:0]=array[0][0:0]^array[0][1:1]; //типа x[n:m] = F( x[n:m] )

 

Странно, ведь "i = i + 1" - работает :cranky:

 

Ваш дезайн вообще не должен был синтезироваться - у вас присваивания в counter в 2х разных always блоках

Кстати, а где сказано, что нельзя? Вот, например, iverilog все съедает. Да и в Полякове такого не встречал...

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


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

А почему Вы не хотите просто написать простой сумматор:

 

Following is the VHDL code for an unsigned 8-bit adder.

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all;


entity adder is 
  port(A,B : in std_logic_vector(7 downto 0); 
      SUM : out std_logic_vector(7 downto 0)); 
end adder; 
architecture archi of adder is 
  begin 
    SUM <= A + B; 
end archi;


Following is the Verilog code for an unsigned 8-bit adder.

module adder(A, B, SUM); 
input  [7:0] A; 
input  [7:0] B; 
output [7:0] SUM;


  assign SUM = A + B;

 

Я бы для первого проекта взял бы счетчик и старшие разряды вывел бы на светодиоды - результат мигание светодиодов. Разрядность счетчика рассчитывал исходя из тактовой частоты.

 

Following is VHDL code for a 4-bit unsigned Up counter with asynchronous clear.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;


entity counter is
  port(C, CLR : in  std_logic; 
        Q : out std_logic_vector(3 downto 0)); 
end counter;
architecture archi of counter is 
  signal tmp: std_logic_vector(3 downto 0);
  begin 
      process (C, CLR)
        begin 
          if (CLR='1') then 
            tmp = "0000"; 
          elsif (C'event and C='1') then 
            tmp <= tmp + 1;
          end if; 
      end process;
      Q <= tmp; 
end archi;

Verilog Code

Following is the Verilog code for a 4-bit unsigned Up counter with asynchronous clear.

module counter (C, CLR, Q);
input C, CLR;
output [3:0] Q;
reg [3:0] tmp;


  always @(posedge C or posedge CLR)
    begin
      if (CLR)
        tmp = 4'b0000;
      else
        tmp = tmp + 1'b1;
      end
  assign Q = tmp;
endmodule

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


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

Привычка, взятая из С :laughing:
Отвыкайте - Verillog - это не С!

Кстати, а где сказано, что нельзя?
Везде.

Вот, например, iverilog все съедает.
Симулировать можно, синтезировать нельзя.

 

Кстати, ваш дезайн синтезатор полностью выбрасывает, получается константа на выходе out ;)

 

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


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

А почему Вы не хотите просто написать простой сумматор:

такой уже писал, он работал. Теперь хочу усложнить до более сложной функции (нпр, реализовать какой-нить помехоустойчивое кодирование)

 

Я бы для первого проекта взял бы счетчик и старшие разряды вывел бы на светодиоды - результат мигание светодиодов. Разрядность счетчика рассчитывал исходя из тактовой частоты.

Так такой я тоже делал и он тоже работал.

 

Отвыкайте - Verillog - это не С!

...чем сейчас и занимаюсь :)

 

Кстати, ваш дезайн синтезатор полностью выбрасывает, получается константа на выходе out ;)

Пересмотрел замечания по поводу дизайна. Переделал таким образом (не обращайте внимание, что сумматор в процедуре сделан - это для возможности дальнейшего расширения):

`timescale 1ns / 1ps
module mod(
   input [0:0] reset,
   input [0:0] clc,
   input [0:31] in,
   output  reg[0:0] out
   );

reg[0:31] array[0:9];
reg[0:31] counter;
reg[0:31] i;

task summator;
begin
for(i=0;i<9;i=i+1)array[9]=array[9]^array[i];
array[0][0:0]=(^array[9]);
end
endtask

always @(posedge clc or posedge reset)
begin
if(clc==1)
begin
if(counter>=10)
begin
summator();
out=(array[0][0:0]);
end

else

begin
array[counter]=in;
counter=counter+1;
end
end

if(reset==1)counter=0;
end
endmodule

 

В результате, бихевирал симуляция прошла на ура, но вот Post-Map и Post-Route - на выходе, в переменной out заначение долгое время прыгало с 0 на 1 и обратно, а потом, после нескольких десятков наносекунд, устаканилось в правильный ответ (при чем не факт, что он попросту не угаданый системой моделирования). С чем это может выть связанно (там же, вроде, уже все синтезируется)?

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


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

У вас получилась логика, а не тригера, из за неправильно записанного условия в блоке aways. Должно быть так:

always @(posedge clc or posedge reset)
begin
if(reset)
counter=0;
else
begin
if(counter>=10)
begin
summator();
out=(array[0][0:0]);
end

else

begin
array[counter]=in;
counter=counter+1;
end

end

Кстати, присваивания в блоках always нужно делать асинхронными (<=)

(А в вашем task'е - синхронными, т.е. там правильно)

 

 

И еще - массивы вида [0:0] - это оксюморон, используйте обычные провода (без массивов)

 

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


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

У вас получилась логика, а не тригера, из за неправильно записанного условия в блоке aways.

 

Ого, надо же, заработало, спасибо. Вот только моя встроенная логика сопротивляется осознавать такие шаманские ритуалы :)

Заменил сумматор более навороченной функцией. Случайно поставил вместо "always(posedge clc or posedge reset)" - "always(posedge clc, posedge reset)" (думал, что одно и тоже). Опять в бихевереле норм, в построуте - бред.

Вернул на место "always(posedge clc or posedge reset)". Поставил симулировать - винда зависла. Перегрузился, опять запустил симуляцию, опять зависла... :angry2:

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


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

У вас получилась логика, а не тригера, из за неправильно записанного условия в блоке aways.

Вообщем в построуте таки и повесилось, но в постмапе начало выдавать правильные результаты. Большое спасибо за помощь!

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


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

Грешу на память вашего компьютера и на плохой теплоотвод от процессора, просто так кратко выразил мысль.

У меня от симулятора система не виснет.

 

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


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

Грешу на память вашего компьютера и на плохой теплоотвод от процессора, просто так кратко выразил мысль.

У меня от симулятора система не виснет.

У меня тоже, КАК ПРАВИЛО, не виснет :) Память? Выдавало аксес виолатион на какой-то экзешник, может заводская бага? Раньше такого не было, но и правильных проектов я раньше не запускал :)

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


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

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

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

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

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

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

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

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

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

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