2016-06-21 7 views
0

Я пытаюсь реализовать этот код в программе, которая отображает ширину импульса сигнала на семисегментный дисплей на плате basys2, но когда я загружаю код на плату, он просто отображает «0001», я выяснил, что он просто показывает 1 из части, которая делает «x < = a_count_pw + 1». Похоже, он просто добавляет 1, и это даже если входной сигнал отсутствует. Я также получаю это предупреждение «Сигнал не завершен. Сигнал не управляет никакими контактами нагрузки в дизайне». Это должно быть для моего входного сигнала? Вот мой код. Любая помощь очень благодарна вам.Как отобразить ширину импульса сигнала в vhdl?

Модуль верха: main_top - Behaviral (main_top.vhd)

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.all; 

entity main_top is 
port(
     J3_IO1 : in std_logic; 
     mclk : in STD_LOGIC; 
     btn : in STD_LOGIC_VECTOR(3 downto 0); 
     a_to_g : out STD_LOGIC_VECTOR(6 downto 0); 
     an : out STD_LOGIC_VECTOR(3 downto 0); 
     dp : out STD_LOGIC 
    ); 
end main_top; 

architecture Behaviral of main_top is 
signal a_count_rst: STD_LOGIC; 
signal a_count_pw: STD_LOGIC_VECTOR(15 downto 0); 
signal a_count_pw_reported: STD_LOGIC_VECTOR(15 downto 0); 
signal J3_IO1_q : STD_LOGIC; 
signal J3_IO1_qq : STD_LOGIC; 

component main 
port(
    x : in STD_LOGIC_VECTOR(15 downto 0); 
    clk : in STD_LOGIC; 
    clr : in STD_LOGIC; 
    a_to_g : out STD_LOGIC_VECTOR (6 downto 0); 
    an : out STD_LOGIC_VECTOR (3 downto 0); 
    dp : out STD_LOGIC 
); 
end component; 


signal x: STD_LOGIC_VECTOR (15 downto 0); 
begin 

process(mclk) 
if mclk'event and mclk='1' then 
-- Synchronous process, clock edge is outer "if" 
    if a_count_rst='1' then --synchronous reset 
    a_count_pw <= b"0000000000000000"; 
    a_count_pw_reported <= a_count_pw_reported; 

    else 
    J3_IO1_q <= J3_IO1; -- First D FF stage 
    J3_IO1_qq <= J3_IO1_q; -- Second D FF stage for edge detect 
    if J3_IO1_qq = '0' and J3_IO1_q = '1' then -- Detect rising edge 
     a_count_pw <= b"0000000000000000"; -- Start from 0 at rising edge 
    elsif J3_IO1_qq = '1' and J3_IO1_q = '0' then -- Detect falling edge 
    a_count_pw_reported <= a_count_pw; -- Capture count 
    else 
    x <= a_count_pw + 1; 
    end if; 
    end if; 
end if; 
end process; 


X1 : main port map 
     (x=>x, clk=>mclk, clr=>btn(3), a_to_g=>a_to_g, an=>an, dp=>dp); 


end Behaviral; 

Это следующий модуль для мультиплексирования дисплея.

Модуль: X1 - главный - Behaviral (main.vhd)

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.all; 

entity main is 
    port(
    x : in STD_LOGIC_VECTOR(15 downto 0); 
    clk : in STD_LOGIC; 
    clr : in STD_LOGIC; 
    a_to_g : out STD_LOGIC_VECTOR (6 downto 0); 
    an : out STD_LOGIC_VECTOR (3 downto 0); 
    dp : out STD_LOGIC; 
    btn : in STD_LOGIC_VECTOR(3 downto 0); 
    J3_IO1 : in STD_LOGIC; 
    a_count_pw : in STD_LOGIC_VECTOR(15 downto 0) 
); 
end main; 

architecture Behaviral of main is 
signal s : STD_LOGIC_VECTOR (1 downto 0); 
signal aen : STD_LOGIC_VECTOR (3 downto 0); 
signal clkdiv : STD_LOGIC_VECTOR (20 downto 0); 
signal digit : STD_LOGIC_VECTOR (3 downto 0); 



begin 
s <= clkdiv(18 downto 17); 
aen <= "1111"; 
dp <= '1'; 


--4 to 1 multiplex 
process(s, x) 
begin 
    case s is 
    when "00" => digit <= x(3 downto 0); 
    when "01" => digit <= x(7 downto 4); 
    when "10" => digit <= x(11 downto 8); 
    when others => digit <= x(15 downto 12); 
    end case; 
end process; 


process(digit) 
begin 
    case digit is 
     when X"0" => a_to_g <= "1000000"; --0 
     when X"1" => a_to_g <= "1111001"; --1 
     when X"2" => a_to_g <= "0100100"; --2 
     when X"3" => a_to_g <= "0110000"; --3 
     when X"4" => a_to_g <= "0011001"; --4 
     when X"5" => a_to_g <= "0010010"; --5 
     when X"6" => a_to_g <= "0000010"; --6 
     when X"7" => a_to_g <= "1011000"; --7 
     when X"8" => a_to_g <= "0000000"; --8 
     when X"9" => a_to_g <= "0010000"; --9 
     when X"A" => a_to_g <= "0001000"; --A 
     when X"B" => a_to_g <= "0000011"; --b 
     when X"C" => a_to_g <= "1000110"; --C 
     when X"D" => a_to_g <= "0100001"; --d 
     when X"E" => a_to_g <= "0000110"; --E 
     when others => a_to_g <= "0001110"; --F 
    end case; 
end process; 

--digit control 
process(s, aen) 
begin 
    an <= "1111"; 
    if aen(conv_integer(s)) = '1' then 
     an(conv_integer(s)) <= '0'; 
    end if; 
end process; 

--clock divider 
process(clk, clr) 
begin 
    if clr ='1' then 
     clkdiv <= (others => '0'); 
    elsif clk'event and clk = '1' then 
     clkdiv <= clkdiv +1; 
    end if; 
end process; 

end Behaviral; 

Вот мой UCF файл ports.ucf

NET "mclk" LOC = "B8"; 

NET "a_to_g<0>" LOC = "L14"; 
NET "a_to_g<1>" LOC = "H12"; 
NET "a_to_g<2>" LOC = "N14"; 
NET "a_to_g<3>" LOC = "N11"; 
NET "a_to_g<4>" LOC = "P12"; 
NET "a_to_g<5>" LOC = "L13"; 
NET "a_to_g<6>" LOC = "M12"; 
NET "dp" LOC = "N13"; 

NET "an<3>" LOC = "K14"; 
NET "an<2>" LOC = "M13"; 
NET "an<1>" LOC = "J12"; 
NET "an<0>" LOC = "F12"; 

NET "btn<3>" LOC = "A7"; 


NET "J3_IO1" LOC = "J3"; 
+2

В вашем процессе main_top, чувствительном к mclk, отсутствует 'begin'. Какой сигнал является неполным? Похоже, что главное не связано. Подумайте о моделировании своего дизайна, прежде чем приступать к синтезу. – user1155120

ответ

0

Как он смотрит на меня, вы не переплетены некоторые элементы порта. Я не вижу x, который вы используете как индикатор для ширины сигнала. Это также имеет смысл, если вы посмотрите на ошибку - «Сигнал не приводит в действие никакие контакты нагрузки в дизайне». Элементы из порта должны быть привязаны к фактическим контактам. Вы можете рассматривать x как параллельный интерфейс шириной 16 бит, где вы читаете входные значения, а затем используете их для своей причины. Как мне кажется, вы можете просто использовать x в качестве сигнала или даже переменной и отправлять обратно только фактические байты, которые вы должны записать на семи сегментный дисплей