rassigor 0 6 декабря, 2005 Опубликовано 6 декабря, 2005 · Жалоба помогите пожалуйста сделать(на плис XILINIX) для Лабораторной работы (препод совсем замучал) такую схему, чтобы на входе был сигнал CLK и лоад (разрешение загрузки если 1 то загружаем числу в SD) и 8 разрядная шина SD в которую грузим числа. На выходе (out) необходимо получить следующее, импульс, длительность которого будет зависеть от входного числа, то есть если вошло число 8 то импульс длинный, вошло 2 -импульс короткий. Помогите хотя бы принцип накиньте Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 6 декабря, 2005 Опубликовано 6 декабря, 2005 · Жалоба module sd_interval (clk, load, sd, out_interval); input clk; input load; // интервал строба load больше или равен периода clk input [3:0] sd; output out_interval;// длительностью в целое число sd (исключая 0) reg [3:0] ct;// счетчик reg trigger_enable;// интервал, в котором разрешена работа счетчика reg [1:0] shift_left_rg; wire enable_load; assign out_interval = trigger_enable; /// схема формирования одиночного импульса enable_load длительностью в один такт clk /// по переднему фронту сигнала load always @ (posedge clk) begin shift_left_rg <= {shift_left_rg[0], load};// end assign enable_load = shift_left_rg[0] & ~shift_left_rg[1]; ///////////////////////////////////////////////////////////////////////////// always @ (posedge clk) begin if (enable_load == 1'b1) ct <= sd; // по enable_load в счетчик загружаем число sd else if (trigger_enable == 1'b1) ct <= ct - 1'b1;// работаем на вычитание в интервале trigger_enable end always @ (posedge clk) begin if (enable_load == 1'b1) trigger_enable <= 1'b1;// по enable_load разрешаем интервал работы счетчика else if (ct == 4'd1)//когда счетчик досчитает до значения единица, запрещаем работу счетчика trigger_enable <= 1'b0; end endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rassigor 0 6 декабря, 2005 Опубликовано 6 декабря, 2005 (изменено) · Жалоба module sd_interval (clk, load, sd, out_interval); input clk; input load; // интервал строба load больше или равен периода clk input [3:0] sd; output out_interval;// длительностью в целое число sd (исключая 0) reg [3:0] ct;// счетчик reg trigger_enable;// интервал, в котором разрешена работа счетчика reg [1:0] shift_left_rg; wire enable_load; assign out_interval = trigger_enable; /// схема формирования одиночного импульса enable_load длительностью в один такт clk /// по переднему фронту сигнала load always @ (posedge clk) begin shift_left_rg <= {shift_left_rg[0], load};// end assign enable_load = shift_left_rg[0] & ~shift_left_rg[1]; ///////////////////////////////////////////////////////////////////////////// always @ (posedge clk) begin if (enable_load == 1'b1) ct <= sd; // по enable_load в счетчик загружаем число sd else if (trigger_enable == 1'b1) ct <= ct - 1'b1;// работаем на вычитание в интервале trigger_enable end always @ (posedge clk) begin if (enable_load == 1'b1) trigger_enable <= 1'b1;// по enable_load разрешаем интервал работы счетчика else if (ct == 4'd1)//когда счетчик досчитает до значения единица, запрещаем работу счетчика trigger_enable <= 1'b0; end endmodule Спасибо большое за такой способ решения, я не знаком с программированием там, мне задано было схемой нарисовать, вот щас накидал схему, посмотрите будет ли она работать(возможности проверить нет только через неделю)Load управляет загрузкой данных Только одна поправочка нужна что бы импульс был следующего вида 100000001, или 10001 то есть ровная линия, а потом вниз уходить будет на сколько то тактов а потом опять ровная линия Изменено 6 декабря, 2005 пользователем rassigor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 6 декабря, 2005 Опубликовано 6 декабря, 2005 · Жалоба Здорово я Вас запутал. Не вдаваясь в подробности Вашей схемы скажу, что если подать лог.0 на один из входов элемента 2И, на выходе всегда будет ноль. Если подать лог.1 на один из входов элемента 2ИЛИ, на выходе всегда будет 1 В Вашем случае все проще. Нужно найти в схемном редакторе пакета сдвигающий регистр имеющий входы типа shiftin, load, data, выходы q На вход shiftin посадить лог.1 Разрядность сдвигающего регистра по максимальному количеству нулей. Их 7 Значит data[6:0] q[6:0] В режиме ожидания сдвигается лог.1 На выходе q[6] уровень лог.1 По сигналу load загружаете число 0000000 или 0001111. На выходе q[6] их получите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexandr 0 6 декабря, 2005 Опубликовано 6 декабря, 2005 · Жалоба Нужно найти в схемном редакторе пакета сдвигающий регистр имеющий входы типа shiftin, load, data, выходы q На вход shiftin посадить лог.1 Разрядность сдвигающего регистра по максимальному количеству нулей. Их 7 Значит data[6:0] q[6:0] В режиме ожидания сдвигается лог.1 На выходе q[6] уровень лог.1 По сигналу load загружаете число 0000000 или 0001111. На выходе q[6] их получите. Только дешифратор перед сдвиговым регистром поставить придется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rassigor 0 6 декабря, 2005 Опубликовано 6 декабря, 2005 · Жалоба С щ на вход И это я тупанул, скажите а зачем дешифратор перед рещистром, вот мне кстати помогтоже один человек и написал такой код Код: library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_UNSIGNED.all; entity One_Pulse is port( Clk : in std_logic; Rst : in std_logic; Ld : in std_logic; SD : in std_logic_vector(7 downto 0); Q : out std_logic ); end One_Pulse; architecture Struct of One_Pulse is signal Cnt : std_logic_vector(7 downto 0); constant STOP: std_logic_vector(7 downto 0) := (others=>'0'); begin MAIN:process(Clk,Rst,Ld,SD) begin if Rst='1' then Q <= '0'; Cnt <= STOP; elsif rising_edge(Clk) then if Ld='1' then Cnt<=SD; elsif Cnt/= STOP then Cnt<=Cnt - '1'; end if; if Cnt=STOP then Q<='0'; else Q<='1'; end if; end if; end process; end Struct; А это проверочный стенд для него Код: library ieee; use ieee.std_logic_unsigned.all; use ieee.std_logic_1164.all; entity One_Pulse_TB is end One_Pulse_TB; architecture TB_ARCHITECTURE of One_Pulse_TB is component one_pulse port( Clk : in std_logic; Rst : in std_logic; Ld : in std_logic; SD : in std_logic_vector(7 downto 0); Q : out std_logic ); end component; signal Clk : std_logic:='0'; signal Rst : std_logic; signal Ld : std_logic; signal SD : std_logic_vector(7 downto 0); signal Q : std_logic; constant PERIODE : time := 10 ns; begin UUT : one_pulse port map ( Clk => Clk, Rst => Rst, Ld => Ld, SD => SD, Q => Q); GEN: Clk<=not Clk after PERIODE; TEST:process begin Rst<='1';Ld<='0';SD<=(others=>'0'); wait for PERIODE*4; Rst<='0'; wait until Clk='1'; SD<=x"02"; Ld<='1'; wait until Clk='1'; SD<=x"00"; Ld<='0'; wait for PERIODE*10; wait until Clk='1'; SD<=x"08"; Ld<='1'; wait until Clk='1'; SD<=x"00"; Ld<='0'; wait for PERIODE*20; end process; end TB_ARCHITECTURE; А это отчёт синтезатора об используемых ресурсах Код: Function Generators 12 CLB Slices 6 Dffs or Latches 9 Clk 91.4 MHz хотя он мне не нужен но просто его привел Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexandr 0 7 декабря, 2005 Опубликовано 7 декабря, 2005 · Жалоба С щ на вход И это я тупанул, скажите а зачем дешифратор перед регистром Чтоб десятичные числа использовать, а не коды 000111... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться