Нявызначаны выхад кальцавога лічыльніка Тэст сігналу

Я змадэлявалі 4 бітную кальцавой лічыльнік з дапамогай D фліп-флоп.

D фліп-флоп знаходзіцца ў асобным файле, уключаных у маім працоўным прасторы. D фліп-флоп працуе правільна (дае правільную форму выхаднога сігналу).

Гэта код кальцавога лічыльніка:

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

entity ring4counter is
    port (
        clk: std_logic;
        output: out std_logic_vector(3 downto 0));
end ring4counter;

architecture ring4counter_arch of ring4counter is
    component dff
    port (
        clk: std_logic;
        d: in std_logic;
        q: out std_logic;
        qbar: out std_logic);
    end component;

    signal temp:std_logic_vector(3 downto 0):=(others=>'0');
begin
    r1: dff port map(clk, temp(3), temp(0));
    r2: dff port map(clk, temp(0), temp(1));
    r3: dff port map(clk, temp(1), temp(2));
    r4: dff port map(clk, temp(2), temp(3));
    output <= temp;
end ring4counter_arch;

Вось код для лічыльніка выпрабавальнага стэнда Ring:

library ieee;
use ieee.std_logic_1164.all;

entity ring4_tb is end ring4_tb ;

architecture arch of ring4_tb is
    component tbc is
    port (
        clk: std_logic;
        output: out std_logic_vector(3 downto 0));
    end component ;

    component dff
    port (
        clk: std_logic;
        d: in std_logic;
        q: out std_logic;
        qbar: out std_logic);
    end component;

    constant period : time := 50 ns ;

    signal clk      : std_logic := '0' ;    
    signal done     : boolean := false ;
    signal output   : std_logic_vector(3 downto 0) ;

    shared variable cycle : natural := 0 ;

    signal temp:std_logic_vector(3 downto 0):=(others=>'0');

begin
-- this is the unit under test
    u1: tbc
    port map(
        clk    => clk,
        output => output) ;

    clkprocess: process(done, clk)
    begin
    if (not done) then
        if (clk = '1') then
        cycle := cycle + 1 ;
        end if ;
        clk <= not clk after period/2 ;
    end if ;
    end process ;

    r1: dff port map(clk, temp(3), temp(0));
    r2: dff port map(clk, temp(0), temp(1));
    r3: dff port map(clk, temp(1), temp(2));
    r4: dff port map(clk, temp(2), temp(3));
    output <= temp;

    testbench: process
    begin
    wait until (clk = '0') ;
    temp <= "1000";
    wait for period*4 ;

    done <= true ;      -- force the clock process to shutdown
    wait ;          -- this waits forever
    end process ;
end arch ;

Але сігнал для «выхаду» з'яўляецца «U» для ўсіх бітаў. Дзе я буду няправільна?

1
ха-ха я не думаю, што я буду зьбіты! Я ведаю, што я не патрэбны DFF для кальцавога лічыльніка. Але калі вы вучыцеся (я маю на ўвазе я учусь), мае сэнс узяць оон відавочнага маршруту.
дададзена аўтар Vinayak Garg, крыніца
Я ведаю, што гэта старая запіс, але я хацеў бы зрабіць стылістычны каментар - калі вы калі-небудзь рабіць адпраўляць заданне па пазіцыі ў рэальным свеце, вы будзеце высачылі і збілі. Ніколі не рабіце гэтага. <Код> Г1: DFF карта порта (CLK => CLK, д => тэмп (3), д => тэмп (0)); на адной лініі для простага кампанента з'яўляецца прымальным (але вы б таксама засмяяліся з горада для маючых патрэбу кампанент DFF).
дададзена аўтар Aaron D. Marasco, крыніца

3 адказы

У працэсе TestBench, калі вы спрабуеце ініцыялізаваць тэмпературу да «1000», фліп-флоп па-ранейшаму ваджэння сігнал часовы, так што вы эфектыўна мець аўтобус барацьба працягваецца.

2
дададзена
ці ёсць спосаб я магу гэта выправіць. Я не ведаю шмат VHDL. Я нават апусціў лінію тэмп <= «1000», да гэтага часу няма зменаў.
дададзена аўтар Vinayak Garg, крыніца
Вы павінны змяніць тое, як вы ініцыялізацыі D трыгераў. Адзін са спосабаў былі б аддзяліць D і Q ўваходы і відавочна загрузіць значэнне ініцыялізацыі пры скідзе. Я не магу паставіць адфарматаваны код у каментарах, але r1: DFF карта порта (CLK, temp_in (3), тэмп (0)); temp_in <= "1000", калі скід = яшчэ тэмп '1'; павінны атрымаць вы рухаецеся ў правільным кірунку.
дададзена аўтар Charles Steinkuehler, крыніца
Так, вы не можаце мець некалькі рэчаў, за рулём аўтобуса (у цэлым)
дададзена аўтар Paul S, крыніца

Адна рэч, каб зрабіць, гэта дадаць дазваляе сігнал D трыгераў. калі вы хочаце скінуць ланцугі зрабіць дазваляе сігнал нізкаўзроўневых, а затым змяніць тэмп на «1000».

r1: dff port map(clk, temp(3), temp(0), enable);

process(clk,reset)
begin
if(rising_edge(clk)) then
 if( reset='1') then
  enable='0';
  temp <= "1000";
 else
  enable <= '1';
 end if;
end if;
end process;
1
дададзена
Я не думаю, што будзе працаваць - у DFFs ўсё яшчэ ваджэння сігнал, нават калі ў скідзе.
дададзена аўтар Martin Thompson, крыніца
Гэта не тады, калі прызначэнне адбываецца. Той факт, што працэс мае заданне дзе-то ў ім стварае «драйвер», і кіроўца, то канфлікт. Там няма такіх рэчаў, як неактыўны кіроўца ў VHDL. З std_logic , вы можаце мець драйвер Z, які затым вырашае, як можна было б чакаць, але гэта ўсё ж такі кіроўца.
дададзена аўтар Martin Thompson, крыніца
@Martin: Ok.thanks для нататкі. Але што, калі я вызначаю D фліп-флоп, так што Q <= D прысвойваецца толькі тады, калі дазваляе сігнал высокі. У адваротным выпадку ніякага прысвойвання не зроблена. Ці будзе яна працаваць у такім выпадку?
дададзена аўтар vipin, крыніца

Выкарыстоўвайце ініцыялізацыю Тэмп ў кальцавым лічыльніку, каб наладзіць сігнал.

Звярніце ўвагу, што гэта не можа сінтэзаваць правільна ў залежнасці ад вашай архітэктуры і сінтэзу інструмента.

Спосаб найбольш агульная мэта зрабіць гэта, каб дадаць сігнал скіду ўсіх DFFs за выключэннем, і паставіць прадусталяваны сігнал на тым. Тады вы сцвярджаеце скід на старце, які будзе наладзіць DFFs да добрай кошту.

Вось спрошчаная версія кода, які робіць гэта, і пазбегнуць неабходнасці выкарыстання відавочных DFFs. Можна таксама змяніць шырыню Тэмп і код будзе рабіць усё астатняе для вас:

process (clk)
begin
   if reset = '1' then
      temp <= (0=>'1', others => '0'); -- set one bit high, the others low.
   elsif rising_edge(clk) then
      -- take the high bit and move it to the low bit. 
      -- Move the other bits left 1 place
      temp <= temp(temp'high-1 downto 0) & temp(temp'high);
   end if;
end process;

(Заўвага: код толькі што ўвялі ў паведамленне, можа быць сінтаксічных памылак друку там!)


Дарэчы, агульная пераменная s гэта дрэнная ідэя, калі яны не маюць абараняюцца тыпаў. Яны могуць мець ўмовы гонкі.

0
дададзена