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

    

OM-S

Участник
  • Публикаций

    19
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о OM-S

  • Звание
    Участник

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    г. Москва
  1. Да, конечно, нужно сделать синхонную загрузку или обнуление (что вам нужно по заданию) счетчика. Делаете дополнительный вход (reset, например) и по нему обнуляете. А если совсем по простому, то можно попробовать так (по крайней мере в sv) module count (input clk, output reg [1:0]counter = 0); always @(posedge clk) counter <= counter + 1; endmodule
  2. Задайте начальное значение счетчику (обнулите). Вы же сигналу clk в тестбенче задали начальное значение перед инверсией.
  3. В tb.v поставьте начальное значение для регистра clk, иначе инверсия неизвестного значения даст неизвестное значение Не могу запустить ваш пример и проверить, но в в macros.do наверно нужно указать симуляцию с разрешением 1ps.(строка 4 vsim -t 1ps tb). Pll обычно симулируются с пикосекундными разрешениями.
  4. Цитата(AVR @ Apr 2 2018, 09:21) В моделсиме (и вообще в стандарте) приоритет одновременных операций в процессе симуляции четко задан. Откуда там может быть расизм? Расизм я вижу между параллельными fork-ами и собственно захватом данных в фифо по фронту aclk. Кодbegin ...       1: rand_pulse = 1;       5: rand_pulse = 0; @(posedge aclk); ... end и Кодbegin ...      s_axis_tvalid = rand_pulse;      if (rand_pulse)             s_axis_tdata  = $urandom_range(255,0);                           @(posedge aclk); ... end Какой из блоков выполнится первым и какое значение (старое или новое) s_axis_tvalid, s_axis_tdata защелкнится на входе ФИФО по фронту клока?
  5. Кажется эта ситуация называется race condition. Данные и valid меняются "одновременно" с клоком, поэтому новые значения могут захватиться либо на текущем клоке, либо только на следующем (на усмотрение симулятора). Поставьте после @(posedge aclk) небольшую паузу #1 и тогда изменения сигалов будет гарантированно после фронта слока. По этому поводу (и по многим другим) очень рекомендую почитать книжку Verilog and system verilog gotchas. 101common coding errors and how to avoid them.
  6. Цитата(demsp @ Mar 28 2018, 23:56) Спасибо, действительно, в этом простом ОЗУ вместо триггеров должны быть регистры, но сути вопроса это не меняет. Дайте ссылку плиз Например у Ксайлинкса в документе ug687 в разделе 6 HDL coding techniques http://www.xilinx.com/support/documentatio..._4/xst_v6s6.pdf
  7. Кажется в блоке always нужно заменить блокирующее присваивание на неблокирующее. То есть вместо = использовать <=
  8. Цитата(verali @ Mar 22 2017, 15:30) Все остальные выходные информационные сигналы я вывожу на виртуальные пины, чтобы не мешались. Цитата(Golikov A. @ Mar 22 2017, 22:47) все что пошло на виртуальные порты при синтезе выкинет оптимизатор, если это как то влияет на другие части схемы, они так же подвергнутся оптимизации. Неужели действительно Квартус выкидывает логику, которая идет на пины, которым присвоено "virtual pins" ?
  9. Про мультицикл уже ответили. Когда я разбирался, мне очень помогли статьи здесь http://embedders.org/content/timequest-dly...bnyi-multicycle
  10. Цитата(vova2211 @ Nov 1 2016, 15:25) ...Может кто поделится шаблоном TCL скрипта , создающего заново проект из полезных сохраненных файлов , ... Проект можно сохранить File->Write Project TCL Запустив потом этот скрипт, Vivado заново создаст проект со всеми настройками и т.д.
  11. Цитата(Jenya7 @ Sep 25 2016, 18:21) значит ли что при достижении максимального значения (CLK_DIV = "1111") переменная обнулиться как в С? Если вы про сигнал CLK_DIV, то да, после CLK_DIV = "1111" будет CLK_DIV = "0000"
  12. Цитата(des00 @ Sep 12 2016, 19:58) Не вижу корреляции с текущей темой. Посты до своего набиваете? Странно. Я Вам привел конкретный пример когда система моделирования воспринимает результат взятия элемента знакового массива как беззнаковый результат. Полностью подходит под Ваш пример (хотя у Вас не указано, как объявлена переменная rdata_ptr). Впрочем, не вижу смысла Вам чего-то доказывать.
  13. я как то делал компонент перевода дробной части в BCD. Кажется алгоритм основан на Shift and Add 3. Сейчас уже не помню. Вот код КодLIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.Math_real.ALL; ENTITY tr3_bin2bcd_frac IS    GENERIC(       InputWidth   : integer := 16;       OutputDigits : integer := 16    );    PORT(       clk        : IN     STD_LOGIC;       d          : IN     std_logic_vector (InputWidth-1 DOWNTO 0);       q          : OUT    std_logic_vector (4*OutputDigits-1 DOWNTO 0);       q_we       : OUT    STD_LOGIC;       nrst       : IN     std_logic;       int_ready  : IN     std_logic  := '1';       frac_ready : BUFFER std_logic    ); -- Declarations END tr3_bin2bcd_frac; architecture Behavioral of tr3_bin2bcd_frac is constant NumberOfDigits: integer := OutputDigits; --constant NumberOfDigits: integer := integer(Ceil(real(InputWidth) * 0.30103)); --constant NeededOutputWidth: integer := NumberOfDigits * 4; type TCorrectTable is array(0 to 15) of std_logic_vector(3 downto 0); constant Correct8_sub3: TCorrectTable :=     (x"0", x"1", x"2", x"3",     x"4", x"5", x"6", x"7",     x"5", x"6", x"7", x"8",     x"9", x"A", "----", "----"    -- max input = 13(dec)     ); signal dBuf: std_logic_vector(InputWidth-1 downto 0);        -- буфер аргумента signal qBuf: std_logic_vector(4*OutputDigits-1 downto 0);    -- буфер результата type TState is (Buffering, Shifting); signal State, LastState: TState; signal ShiftCounter: integer range 0 to InputWidth-1; signal first_flag : boolean := true; begin process(clk, nrst)     variable tmpBuf_v : std_logic_vector(qBuf'left downto 0); begin     if nrst = '0' then         dBuf <= (others => '0');         qBuf <= (others => '0');         ShiftCounter <= 0;         State <= Buffering;         q <= (others => '0');         q_we <= '0';         first_flag <= true;         frac_ready <= '0';     elsif rising_edge(clk) then                  -- default value         q_we <= '0';         LastState <= State;                  -- fsm         case State is             when Buffering =>                 if LastState /= Buffering then                     q <= qBuf;                     q_we <= '1' and int_ready;             end if;                 frac_ready <= '1';                 dBuf <= d;                 qBuf <= (others => '0');                 ShiftCounter <= InputWidth-1;                 if (dBuf /= d or first_flag) and (int_ready = '1' and frac_ready = '1') then                     first_flag <= false;                     State <= Shifting;                     frac_ready <= '0';                 end if;                              when Shifting =>                 tmpBuf_v := dBuf(0) & qBuf(qBuf'left downto 1);                 for i in  NumberOfDigits downto 1 loop                     qBuf(i*4-1 downto i*4-4) <= Correct8_sub3(CONV_INTEGER(unsigned(tmpBuf_v(i*4-1 downto i*4-4))));                 end loop;                                 dBuf <= dBuf(0) & dBuf(InputWidth-1 downto 1);                                 if ShiftCounter = 0 then                     State <= Buffering;                     frac_ready <= '1';                 else                     ShiftCounter <= ShiftCounter - 1;                 end if;                              when others =>                 State <= Buffering;         end case;              end if; end process; end Behavioral; Все должно работать. Вход int_ready можно не использовать и подать на него 1.
  14. Цитата(des00 @ Sep 12 2016, 07:00) а ничего что это не выбор бита/битов, выбор элемента массива ? Может быть это не выбор бита, а выбор элемента массива и они различаются по своему поведению, но симулятор считает logic signed [3:0] ptr [15:0]; ... ptr_i = ptr[i]; - расценивается как signed а logic signed [15:0] [3:0] ptr; ... ptr_i = ptr[i]; - расценивается как unsigned
  15. rdata_ptr[1] - является беззнаковым вне зависимости от типа rdata_ptr смотри 5.5.1 Rules for expression types (из IEEE.1364-2005 на Verilog) "— Bit-select results are unsigned, regardless of the operands. — Part-select results are unsigned, regardless of the operands even if the part-select specifies the entire vector. reg [15:0] a; reg signed [7:0] b; initial a = b[7:0]; // b[7:0] is unsigned and therefore zero-extended " соответственно индекс rdata_ptr[1] - i тоже беззнаковый.