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

Нестандартный счетчик

помогите пожалуйста сделать(на плис XILINIX) для Лабораторной работы (препод совсем замучал) такую схему, чтобы на входе был сигнал CLK и лоад (разрешение загрузки если 1 то загружаем числу в SD) и 8 разрядная шина SD в которую грузим числа.

На выходе (out) необходимо получить следующее, импульс, длительность которого будет зависеть от входного числа, то есть если вошло число 8 то импульс длинный, вошло 2 -импульс короткий. Помогите хотя бы принцип накиньте

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 то есть ровная линия, а потом вниз уходить будет на сколько то тактов а потом опять ровная линия

post-11895-1133898844_thumb.jpg

Изменено пользователем rassigor

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здорово я Вас запутал. Не вдаваясь в подробности Вашей схемы скажу, что если подать лог.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] их получите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужно найти в схемном редакторе пакета сдвигающий регистр имеющий входы типа shiftin, load, data, выходы q

На вход shiftin посадить лог.1

Разрядность сдвигающего регистра по максимальному количеству нулей. Их 7 Значит data[6:0] q[6:0]

В режиме ожидания сдвигается лог.1 На выходе q[6] уровень лог.1 По сигналу load

загружаете число 0000000 или 0001111. На выходе q[6] их получите.

Только дешифратор перед сдвиговым регистром поставить придется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С щ на вход И это я тупанул, скажите а зачем дешифратор перед рещистром, вот мне кстати помогтоже один человек и написал такой код

Код:

 

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

 

хотя он мне не нужен но просто его привел

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С щ на вход И это я тупанул, скажите а зачем дешифратор перед регистром

Чтоб десятичные числа использовать, а не коды 000111...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...