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

 
 
 
Reply to this topicStart new topic
> Generate Verilog
Vacik
сообщение Jan 10 2017, 13:19
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 2-10-10
Из: Москва
Пользователь №: 59 883



Приветствую.

Подскажите:

1. Есть модуль на VHDL с параметром 16 bit.
Код
entity module_01 is
    generic (
            BASE_ADDR       : STD_LOGIC_VECTOR(15 downto 0) := x"e000"
            );
        Port (
            clk : in  STD_LOGIC;
            
            data : in  STD_LOGIC;
            ce : in  STD_LOGIC;
            
            clk_cfg : in  STD_LOGIC;
            addr_cfg : in  STD_LOGIC_VECTOR (15 downto 0);
            dann_cfg : in  STD_LOGIC_VECTOR (15 downto 0);
            dann_cfg_out: out  STD_LOGIC_VECTOR (15 downto 0);
            
            dann_o : out  STD_LOGIC
            );
end module_01;



2. Второй файл на Verilog, через generate, создаю несколько первых модулей.
Код
  generate
    genvar i;

    for (i=0;i<8;i=i+1) begin:for_module_0
        module_01
        #(
            .BASE_ADDR(16'h2000+i*16)
        )
        module_01_I(
            .clk(clk_G),// : in  STD_LOGIC;
            
            .data(data_in_0[i]),// : in  STD_LOGIC;
            .ce(ce_in_0[i]),// : in  STD_LOGIC;
            
            .clk_cfg(clk_ISA),// : in  STD_LOGIC;
            .addr_cfg(addr_ISA_S),// : in  STD_LOGIC_VECTOR (15 downto 0);
            .dann_cfg(data_ISA_in),// : in  STD_LOGIC_VECTOR (15 downto 0);
            .dann_cfg_out(),//: out  STD_LOGIC_VECTOR (15 downto 0);
            
            .dann_o(data_in_0[i+1])// : out  STD_LOGIC;
        );
    end
    endgenerate


Vivado выдает ошибку во втором файле на строке
Код
.BASE_ADDR(16'h2000+i*16)
, пишет что разрядность входа 16 бит, а данные 32 бита.

Подскажите, что делать.

Go to the top of the page
 
+Quote Post
Realking
сообщение Jan 10 2017, 13:41
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 425
Регистрация: 4-10-04
Из: Нижний Новгород
Пользователь №: 771



Цитата(Vacik @ Jan 10 2017, 16:19) *
Приветствую.

Подскажите:

1. Есть модуль на VHDL с параметром 16 bit.
Код
entity module_01 is
    generic (
            BASE_ADDR       : STD_LOGIC_VECTOR(15 downto 0) := x"e000"
            );
        Port (
            clk : in  STD_LOGIC;
            
            data : in  STD_LOGIC;
            ce : in  STD_LOGIC;
            
            clk_cfg : in  STD_LOGIC;
            addr_cfg : in  STD_LOGIC_VECTOR (15 downto 0);
            dann_cfg : in  STD_LOGIC_VECTOR (15 downto 0);
            dann_cfg_out: out  STD_LOGIC_VECTOR (15 downto 0);
            
            dann_o : out  STD_LOGIC
            );
end module_01;



2. Второй файл на Verilog, через generate, создаю несколько первых модулей.
Код
  generate
    genvar i;

    for (i=0;i<8;i=i+1) begin:for_module_0
        module_01
        #(
            .BASE_ADDR(16'h2000+i*16)
        )
        module_01_I(
            .clk(clk_G),// : in  STD_LOGIC;
            
            .data(data_in_0[i]),// : in  STD_LOGIC;
            .ce(ce_in_0[i]),// : in  STD_LOGIC;
            
            .clk_cfg(clk_ISA),// : in  STD_LOGIC;
            .addr_cfg(addr_ISA_S),// : in  STD_LOGIC_VECTOR (15 downto 0);
            .dann_cfg(data_ISA_in),// : in  STD_LOGIC_VECTOR (15 downto 0);
            .dann_cfg_out(),//: out  STD_LOGIC_VECTOR (15 downto 0);
            
            .dann_o(data_in_0[i+1])// : out  STD_LOGIC;
        );
    end
    endgenerate


Vivado выдает ошибку во втором файле на строке
Код
.BASE_ADDR(16'h2000+i*16)
, пишет что разрядность входа 16 бит, а данные 32 бита.

Подскажите, что делать.


напиши
.BASE_ADDR(16'(16'h2000+i*16))





--------------------
Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается.
Go to the top of the page
 
+Quote Post
Vacik
сообщение Jan 10 2017, 15:09
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 2-10-10
Из: Москва
Пользователь №: 59 883



Не работает.
дает ошибку на
Код
'

которая после первого 16

Вроде нашел:

Код
generate
    genvar i;

    for (i=0;i<8;i=i+1) begin:for_module_0
                                                        localparam [15:0]ddd = i*16;
        module_01
        #(
            .BASE_ADDR(16'h2000+ddd)
        )
        module_01_I(
            .clk(clk_G),// : in  STD_LOGIC;
            
            .data(data_in_0[i]),// : in  STD_LOGIC;
            .ce(ce_in_0[i]),// : in  STD_LOGIC;
            
            .clk_cfg(clk_ISA),// : in  STD_LOGIC;
            .addr_cfg(addr_ISA_S),// : in  STD_LOGIC_VECTOR (15 downto 0);
            .dann_cfg(data_ISA_in),// : in  STD_LOGIC_VECTOR (15 downto 0);
            .dann_cfg_out(),//: out  STD_LOGIC_VECTOR (15 downto 0);
            
            .dann_o(data_in_0[i+1])// : out  STD_LOGIC;
        );
    end
    endgenerate
Go to the top of the page
 
+Quote Post
Tausinov
сообщение Jan 10 2017, 15:26
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 19-10-13
Пользователь №: 78 795



The default integer size is 32 bit in Verilog - проблема в этом.
Go to the top of the page
 
+Quote Post
Fitc
сообщение Jan 10 2017, 19:17
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 21-10-11
Пользователь №: 67 894



Цитата(Vacik @ Jan 10 2017, 18:09) *
Не работает.
дает ошибку на
Код
'

которая после первого 16

Вроде нашел:

Код
generate
    genvar i;

    for (i=0;i<8;i=i+1) begin:for_module_0
                                                        localparam [15:0]ddd = i*16;
        module_01
        #(
            .BASE_ADDR(16'h2000+ddd)
        )
        module_01_I(
            .clk(clk_G),// : in  STD_LOGIC;
            
            .data(data_in_0[i]),// : in  STD_LOGIC;
            .ce(ce_in_0[i]),// : in  STD_LOGIC;
            
            .clk_cfg(clk_ISA),// : in  STD_LOGIC;
            .addr_cfg(addr_ISA_S),// : in  STD_LOGIC_VECTOR (15 downto 0);
            .dann_cfg(data_ISA_in),// : in  STD_LOGIC_VECTOR (15 downto 0);
            .dann_cfg_out(),//: out  STD_LOGIC_VECTOR (15 downto 0);
            
            .dann_o(data_in_0[i+1])// : out  STD_LOGIC;
        );
    end
    endgenerate


А попробуйте ради интереса написать: .BASE_ADDR(16'h2000+i*16'h10)

Еще возможно синтезнется такое (хотя это тоже не очень удобное решение):
typedef logic[15:0] my_type;//написать перед generate
...
.BASE_ADDR(my_type'(16'h2000+i*16))

Go to the top of the page
 
+Quote Post
Kopart
сообщение Jan 10 2017, 19:39
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 592
Регистрация: 1-03-05
Из: Spb
Пользователь №: 2 972



Цитата(Vacik @ Jan 10 2017, 16:19) *
Подскажите, что делать.

Код
.BASE_ADDR(16'h2000+i[15:0]*16'd16)


--------------------
Насколько проще была бы жизнь, если бы она была в исходниках
Go to the top of the page
 
+Quote Post
Vacik
сообщение Jan 11 2017, 09:36
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 2-10-10
Из: Москва
Пользователь №: 59 883



Цитата(Kopart @ Jan 10 2017, 22:39) *
Код
.BASE_ADDR(16'h2000+i[15:0]*16'd16)


Спасибо.
Это работает.
Решение простое.
Go to the top of the page
 
+Quote Post
Opex
сообщение Feb 13 2017, 07:06
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 71
Регистрация: 13-03-11
Из: Екатеринбург
Пользователь №: 63 574



Еще можно так писать

Код
.BASE_ADDR({'h2000+i*16}[15:0])
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 29th March 2017 - 11:14
Рейтинг@Mail.ru


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