Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Нестандартный счетчик
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Разработка цифровых, аналоговых, аналого-цифровых ИС
rassigor
помогите пожалуйста сделать(на плис XILINIX) для Лабораторной работы (препод совсем замучал) такую схему, чтобы на входе был сигнал CLK и лоад (разрешение загрузки если 1 то загружаем числу в SD) и 8 разрядная шина SD в которую грузим числа.
На выходе (out) необходимо получить следующее, импульс, длительность которого будет зависеть от входного числа, то есть если вошло число 8 то импульс длинный, вошло 2 -импульс короткий. Помогите хотя бы принцип накиньте
sazh
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
Цитата(sazh @ Dec 6 2005, 19:03) *
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 то есть ровная линия, а потом вниз уходить будет на сколько то тактов а потом опять ровная линия
sazh
Здорово я Вас запутал. Не вдаваясь в подробности Вашей схемы скажу, что если подать лог.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
Цитата(sazh @ Dec 7 2005, 00:13) *
Нужно найти в схемном редакторе пакета сдвигающий регистр имеющий входы типа shiftin, load, data, выходы q
На вход shiftin посадить лог.1
Разрядность сдвигающего регистра по максимальному количеству нулей. Их 7 Значит data[6:0] q[6:0]
В режиме ожидания сдвигается лог.1 На выходе q[6] уровень лог.1 По сигналу load
загружаете число 0000000 или 0001111. На выходе q[6] их получите.

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

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
Цитата(rassigor @ Dec 7 2005, 00:43) *
С щ на вход И это я тупанул, скажите а зачем дешифратор перед регистром

Чтоб десятичные числа использовать, а не коды 000111...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.