реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Нестандартный счетчик
rassigor
сообщение Dec 6 2005, 15:13
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 6-12-05
Пользователь №: 11 895



помогите пожалуйста сделать(на плис XILINIX) для Лабораторной работы (препод совсем замучал) такую схему, чтобы на входе был сигнал CLK и лоад (разрешение загрузки если 1 то загружаем числу в SD) и 8 разрядная шина SD в которую грузим числа.
На выходе (out) необходимо получить следующее, импульс, длительность которого будет зависеть от входного числа, то есть если вошло число 8 то импульс длинный, вошло 2 -импульс короткий. Помогите хотя бы принцип накиньте
Go to the top of the page
 
+Quote Post
sazh
сообщение Dec 6 2005, 16:03
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



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
Go to the top of the page
 
+Quote Post
rassigor
сообщение Dec 6 2005, 19:54
Сообщение #3





Группа: Новичок
Сообщений: 5
Регистрация: 6-12-05
Пользователь №: 11 895



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

Сообщение отредактировал rassigor - Dec 6 2005, 20:10
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
sazh
сообщение Dec 6 2005, 21:13
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Здорово я Вас запутал. Не вдаваясь в подробности Вашей схемы скажу, что если подать лог.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] их получите.
Go to the top of the page
 
+Quote Post
Alexandr
сообщение Dec 6 2005, 21:35
Сообщение #5


Знающий
****

Группа: Модераторы
Сообщений: 804
Регистрация: 1-12-04
Пользователь №: 1 283



Цитата(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] их получите.

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


--------------------
Иван Сусанин - первый полупроводник
Go to the top of the page
 
+Quote Post
rassigor
сообщение Dec 6 2005, 21:43
Сообщение #6





Группа: Новичок
Сообщений: 5
Регистрация: 6-12-05
Пользователь №: 11 895



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

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

хотя он мне не нужен но просто его привел
Go to the top of the page
 
+Quote Post
Alexandr
сообщение Dec 7 2005, 22:33
Сообщение #7


Знающий
****

Группа: Модераторы
Сообщений: 804
Регистрация: 1-12-04
Пользователь №: 1 283



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

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


--------------------
Иван Сусанин - первый полупроводник
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 03:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01453 секунд с 7
ELECTRONIX ©2004-2016