реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> $readmemh в Верилоге
sherr
сообщение Apr 5 2010, 17:25
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 10-06-06
Из: Ставрополь
Пользователь №: 17 955



создаю в BRAM (xc3s-50an) RAM 32768*1, Пытаюсь ее проинициализировать :
Код
module sram32_1

(  input wire clkm ,
    input wire we ,
    input wire [14:0] addr,
     input wire  din,
     output wire  dout );
// signal declaration
    reg  ram [32767:0];
    reg [14:0] addr_reg;
// body

   initial
   $readmemd("xilinx_NEG_4k.hex",ram);
   always @(posedge clkm)
      begin
        if (we) // write operation
              ram [addr] <= din;
          addr_reg <= addr;
     end
// read operation
   assign dout = ram[addr_reg];
  
endmodule


Файл HEX точно соответствует размеру массива (4096 байт) - файл прилагаюПрикрепленный файл  xilinx_NEG_4k.zip ( 1.75 килобайт ) Кол-во скачиваний: 105


После синтеза и заливки ничего ожидаемого не происходит - содержимое файла не выводится (на экран)
Более того - выводится странный ворнинг :
Node <sram32/Mram_ram2> of sequential type is unconnected in block <pong>.
- хотя все адреса памяти обвязаны а ее общий обьем = 2 блока BRAM.

Подскажите, что не так (до подключения памяти видеотест работал на реальном железе) -
может файл не такой ?

На всякий случай прикладываю остальные модули
синхрогенератор
Код
module hvsg(clk, clk25, vga_h_sync, vga_v_sync, inDisplayArea, CounterX, CounterY);
input clk;
output vga_h_sync, vga_v_sync;
output inDisplayArea;
output [9:0] CounterX;
output [9:0] CounterY;
output  clk25;
//////////////////////////////////////////////////
reg clk25;
always @(posedge clk)// VGA  clock
clk25 = ~(clk25);

reg [9:0] CounterX;
reg [9:0] CounterY;
wire CounterXmaxed = (CounterX==799);

always @(posedge clk25) begin
    if (CounterXmaxed)
      CounterX <= 0;
    else
      CounterX <= CounterX + 1;
end


always @(posedge clk25) begin
if(CounterXmaxed) begin
    if(CounterY == 520)
         CounterY <= 0;
    else
  CounterY <= CounterY + 1;
  end
end


и основной модуль
Код
module pong(clk, vga_h_sync, vga_v_sync, vga_R, vga_G, vga_B, Ledcont);
input clk;
output vga_h_sync, vga_v_sync, vga_R, vga_G, vga_B, Ledcont;


wire inDisplayArea;
wire [9:0] CounterX;
wire [9:0] CounterY;

hvsg  syncgen(.clk(clk),.clk25(clk25), .vga_h_sync(vga_h_sync), .vga_v_sync(vga_v_sync),
  .inDisplayArea(inDisplayArea), .CounterX(CounterX), .CounterY(CounterY));
sram32_1 sram32(.clkm(clkm), .we(we), .addr(addr), .din(din), .dout(dout));  
  

reg [9:0] Timer1;
wire clk1 =  (vga_v_sync == 0);
assign  addr = {CounterY[8:2],CounterX[9:2]}; // do pixels 4*4
assign  we = 0;// RAM  as ROM
assign  din = 0;  
assign clkm = clk;
reg Ledcont;  // control  LED

  always @( posedge clk1)  // slow  counter
   Timer1 <= Timer1 + 1;
    
reg vga_R,vga_G,vga_B;
  always @(posedge clk )
  
        begin
     vga_G <= dout & inDisplayArea;// memory  to  pixels
      vga_R <= Timer1[6] & inDisplayArea;
      vga_B <= Timer1[8]& inDisplayArea;
      Ledcont <= Timer1[8];
        end
      
endmodule


p.s. извините, что так длинно rolleyes.gif

Сообщение отредактировал sherr - Apr 5 2010, 17:28
Go to the top of the page
 
+Quote Post
Putnik
сообщение Apr 5 2010, 18:37
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 214
Регистрация: 4-09-07
Из: Зеленоград
Пользователь №: 30 272



Новую тему, по-моему, зря создали

Вы немного невнимательны:
-
Цитата(sherr @ Apr 5 2010, 21:25) *
Файл HEX точно соответствует размеру массива (4096 байт)

массив вы объявили у себя как 32768x1, чувствуете разницу? посмотрите еще раз пример..

- файл с хексами, а вы считываете их как десятичные - readmemd -> -||-h

И отладку с помощью тестбенчей Вам придется освоить, если не хотите вечно делать один проект

---------
может много критики, но так получилось.. главное - не бросайте


--------------------
за Навального!
Go to the top of the page
 
+Quote Post
sherr
сообщение Apr 13 2010, 18:12
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 257
Регистрация: 10-06-06
Из: Ставрополь
Пользователь №: 17 955



Отвечаю сам себе - при такой разрядности памяти только $readmemb , причем файл должен быть строго следующего вида:
0
1
1
0
1
..... и строго байт- в - байт нужного размера,
дополнительный глюк был простой и глупый - при включении в код модуля нижнего уровня надо обьявлять в верхнем
модуле входящие шины , а отдельные проводники - не обязательно, так компилятор вместо того чтобы вопить об ошибке,
урезает шину до одного провода и ограничивается невнятным предупреждением.
Цитата
И отладку с помощью тестбенчей Вам придется освоить, если не хотите вечно делать один проект

может много критики, но так получилось.. главное - не бросайте


Тестбенчи начал осваивать, спасибо за поддержку, не брошу.
Go to the top of the page
 
+Quote Post
Putnik
сообщение Apr 14 2010, 07:20
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 214
Регистрация: 4-09-07
Из: Зеленоград
Пользователь №: 30 272



не проще ли вам сделать память с 16-ти разрядными данными - reg [15:0] ram [2047:0];
использовать readmemh, и не переделывать входной файл


--------------------
за Навального!
Go to the top of the page
 
+Quote Post
Djony1987
сообщение Apr 22 2010, 03:43
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 129
Регистрация: 3-01-10
Из: Россия
Пользователь №: 54 611



Здравствуйте!
Чтоб новую тему не создвать сюда вопрос задам.
Как инициализировать массив reg [3:0] sin [0:15];
Если для симуляции можно:
Код
initial
    begin
        sin[0]  = 4'b0000;    
        sin[1]  = 4'b0001;
        sin[2]  = 4'b0010;
                        ...
        sin[15] = 4'b0111;     
    end


А для синтеза? Сколько вариантов есть и какие? (я так понимаю можно через $readmemb, в Simlify по крайней мере, как выше описано)

Спасибо!
Go to the top of the page
 
+Quote Post
Putnik
сообщение Apr 22 2010, 10:14
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 214
Регистрация: 4-09-07
Из: Зеленоград
Пользователь №: 30 272



Знаю только что в чистом Verilog можно сделать начальную инициализацию массива регистров через readmemx, или установить их при сбросе типа
CODE
always @(posedge CLK)
if (RESET)
begin
SIN_6K[0] <= 10'b0_000_111_111;
SIN_6K[1] <= 10'b0_001_101_100;
SIN_6K[2] <= 10'b0_001_111_111;
SIN_6K[3] <= 10'b0_001_101_100;
end


По идее должен быть и способ иницилизации по типу иницилизации регистров - reg [3:0] ff = 0;
Возможно в SV добавили такую возможность

Сообщение отредактировал Putnik - Apr 22 2010, 10:17


--------------------
за Навального!
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Apr 22 2010, 10:27
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата
Как инициализировать массив reg [3:0] sin [0:15];

Обсуждалось уже много раз на форуме, поищите.
Ну или воспользуйтесь хелпом, очень хорошие примеры на ISE есть, просто ваши начальные значения будут записаны в файле в двоичном или 16-ричном виде. А в функции readmemb (или h) указывается тупо путь к файлу (.txt) где и хранятся эти значения, единстенное, не забывайте что в файле должно быть строго 2 в степени n значений прописано, даже если вы будете использовать меньшее кол-во значений. Данная конструкция будет использоваться и для синтеза и для моделирования.

Пост 35 посмотрите
http://electronix.ru/forum/index.php?showt...dmemb&st=30

Сообщение отредактировал bogaev_roman - Apr 22 2010, 10:31
Go to the top of the page
 
+Quote Post
Putnik
сообщение Apr 22 2010, 11:39
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 214
Регистрация: 4-09-07
Из: Зеленоград
Пользователь №: 30 272



Во всех верилоговских примерах инициализация массивов только через readmemx, что мне впрочем всегда хватало.
Но Djony1987 спрашивает про альтернативные способы, типа им приведенного, где для небольших массивов или массивов иницилизируемых нулевыми значениями не надо дополнительных файлов делать, в SV может это и сделали, видел похожее в его стандарте для структур, но пока не разобрался


--------------------
за Навального!
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Apr 22 2010, 12:20
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата
для небольших массивов или массивов иницилизируемых нулевыми значениями не надо дополнительных файлов делать

Тогда через цикл for для его конкретного примера sin[i] <= i; А вот если зависимости значения элемента массива от его номера нет, то только через файл или вручную для каждого конкретного элемента.
Go to the top of the page
 
+Quote Post
Djony1987
сообщение Apr 22 2010, 13:04
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 129
Регистрация: 3-01-10
Из: Россия
Пользователь №: 54 611



Цитата(Putnik @ Apr 22 2010, 15:29) *
По идее должен быть и способ иницилизации по типу иницилизации регистров - reg [3:0] ff = 0;

Я так сразу попробовал. Ошибку пишет, и в Active-HDL, и в Modelsim.


Цитата(Putnik @ Apr 22 2010, 15:29) *
Знаю только что в чистом Verilog можно сделать начальную инициализацию массива регистров через readmemx, или установить их при сбросе типа

Первое посмотрю. Второе не желательно - хотелось бы записать 1 раз в начале и все.

Цитата(Putnik @ Apr 22 2010, 16:54) *
Во всех верилоговских примерах инициализация массивов только через readmemx, что мне впрочем всегда хватало.
Но Djony1987 спрашивает про альтернативные способы, типа им приведенного, где для небольших массивов или массивов иницилизируемых нулевыми значениями не надо дополнительных файлов делать, в SV может это и сделали, видел похожее в его стандарте для структур, но пока не разобрался


А SV это что? SystemVerilog? я если честно не знаю.

Цитата(bogaev_roman @ Apr 22 2010, 15:42) *
Обсуждалось уже много раз на форуме, поищите.
Ну или воспользуйтесь хелпом, очень хорошие примеры на ISE есть, просто ваши начальные значения будут записаны в файле в двоичном или 16-ричном виде. А в функции readmemb (или h) указывается тупо путь к файлу (.txt) где и хранятся эти значения, единстенное, не забывайте что в файле должно быть строго 2 в степени n значений прописано, даже если вы будете использовать меньшее кол-во значений. Данная конструкция будет использоваться и для синтеза и для моделирования.

Пост 35 посмотрите
http://electronix.ru/forum/index.php?showt...dmemb&st=30

Спасибо за ссылку!

Просинтезировал в Simlify. Вроде норм.
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Apr 22 2010, 13:04
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата
Я так сразу попробовал. Ошибку пишет, и в Active-HDL, и в Modelsim

Так правильно делает, что ругается, у Вас двумерный массив, откуда он знает, что именно вы хотите обнулить - разряды элемента или конкретные элементы.
Тут если по тупому, то обнуление (инициализация в самом начале) будет выглядеть как
Цитата
reg [3:0] sin_0=4'b0000;
reg [3:0] sin_1=4'b0001;
reg [3:0] sin_2=4'b0010;
...
reg [3:0] sin_15=4'b1111;

Ну и работать соответственно придется уже не с элементами массива, а с регистрами.
А по другому только через память или цикл. Поправьте меня, пожалуйста, если я неправ...

Сообщение отредактировал bogaev_roman - Apr 22 2010, 13:06
Go to the top of the page
 
+Quote Post
Djony1987
сообщение Apr 22 2010, 13:11
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 129
Регистрация: 3-01-10
Из: Россия
Пользователь №: 54 611



Я делал генератор синуса косинуса, вначале я задал полностью все значения синуса, косинуса в кейсе:
В итоге на кристалле заняло:

Код
---------------------------------------
Resource Usage Report for sin_cos3

Mapping to part: xc6vlx75tlff484-1l
Cell usage:
FD              22 uses
GND             1 use
MUXCY_L         21 uses
RAMB18E1        1 use
VCC             1 use
XORCY           21 uses
LUT1            22 uses

I/O ports: 9
I/O primitives: 9
IBUFG          1 use
OBUF           8 uses

BUFG           1 use

I/O Register bits:                  0
Register bits not including I/Os:   22 (0%)

RAM/ROM usage summary
Block Rams : 1 of 156 (0%)


Global Clock Buffers: 1 of 32 (3%)


Number of unique control sets:              1
C(Clk1x_c), CLR(GND), PRE(GND), CE(VCC)        : 22

Total load per clock:
   sin_cos3|Clk1x: 23

Mapping Summary:
Total  LUTs: 22 (0%)

Mapper successful!
Process took 0h:00m:01s realtime, 0h:00m:01s cputime


Потом я записал только 1/4 периода (через $readmemb), а остальное получал через них:
Код
---------------------------------------
Resource Usage Report for sin_cos5

Mapping to part: xc6slx16csg225-2
Cell usage:
FD              30 uses
GND             1 use
MUXCY_L         21 uses
VCC             1 use
XORCY           21 uses
LUT1            22 uses
LUT2            1 use
LUT6            6 uses

I/O ports: 9
I/O primitives: 9
IBUFG          1 use
OBUF           8 uses

BUFG           1 use

I/O Register bits:                  0
Register bits not including I/Os:   30 (0%)

Global Clock Buffers: 1 of 16 (6%)


Number of unique control sets:              1
C(Clk1x_c), CLR(GND), PRE(GND), CE(VCC)        : 30

Total load per clock:
   sin_cos5|Clk1x: 30

Mapping Summary:
Total  LUTs: 29 (0%)

Mapper successful!
Process took 0h:00m:01s realtime, 0h:00m:01s cputime


Во втором случа он вообще BRAM не использовал как я понял, почему так?

Спасибо!
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Apr 22 2010, 13:17
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата
Во втором случа он вообще BRAM не использовал как я понял, почему так?

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

Сообщение отредактировал bogaev_roman - Apr 22 2010, 13:18
Go to the top of the page
 
+Quote Post
Djony1987
сообщение Apr 22 2010, 13:19
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 129
Регистрация: 3-01-10
Из: Россия
Пользователь №: 54 611



Цитата(bogaev_roman @ Apr 22 2010, 18:32) *
А он синтезатор умный, зараза, массив маленький и использование брам нерационально с точки зрения ксайлинкса, он его на регистрах по идее должен был сделать. Если хотите все-таки брам использовать, то можете в настройках покапаться, там есть пункт принудительного использования в похожих конструкциях ну или в самом верилоге указатель поставить, чтоб синтезатор данную конструкцию сразу в блочную память пихал (щас сходу и не вспомню как это пишется).

Спасибо! Поищу, а то вроде хотел сэкономить объем, а в итоге больше оказалось smile.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th June 2024 - 00:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01512 секунд с 7
ELECTRONIX ©2004-2016