đây à sơ đồ khối và thuật toán bài của em, em đang gặp vướng mắc trong việc đồng bộ các tín hiệu với xung clk,liệu sau mỗi xung thì các khối con có làm việc cùng 1 lúc ko ạ,hay là nó sẽ làm việc lần lượt ?
trong phần code của em làm,em có cho thêm 1 bộ đếm counter để cho vào bộ mux trong khối thanh ghi remainer (chọn tín hiệu vào từ ngoài hay từ bộ dịch ở trên xuống) ,và thêm nữa là counter có chức năng dừng dịch sau khi quoiter đã đủ bit,nói thế này chắc cũng ko hình dung đc bài của em,thôi thì các bác nhìn tạm sơ đồ khối vậy.
Em làm xong code rồi,nhưng kết quả ra sai,mong mọi ng ai hiểu hoặc đã làm rồi giúp em.
Khối chia không phục hồi phần dư.....
Code:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.numeric_std.all; use IEEE.numeric_bit.all; -------------------------------- entity divider is port ( sobichia :in std_logic_vector (7 downto 0); sochia :in std_logic_vector (3 downto 0); WE : in std_logic; clk : in std_logic; reset : in std_logic; thuong : out std_logic_vector (4 downto 0); du : out std_logic_vector(4 downto 0) ); end entity; --------------------------------------- architecture behavioral of divider is signal reg1out : std_logic; signal coutS :std_logic; signal b0:std_logic_vector(4 downto 0); signal a0:std_logic_vector(4 downto 0); signal Sout :std_logic_vector(4 downto 0); signal thuong1 :std_logic_vector(4 downto 0); ------------------------------------------ signal cnt_reset : std_logic; signal temp : std_logic; signal cnt :std_logic_vector(2 downto 0); signal shift_enable : std_logic; signal reg_temp:std_logic; -------------------------------------- component reg_q is port( bitin : in std_logic; Q : out std_logic_vector(4 downto 0); CLK : in std_logic; WE : in std_logic ; RESET : in std_logic ); end component; component remainder is port( clk : in std_logic; reset : in std_logic; WE : in std_logic; sh_e : in std_logic; Din_S : in std_logic_vector ( 4 downto 0 ); Din_8 : in std_logic_vector ( 7 downto 0 ) ; Dout : out std_logic_vector(4 downto 0) ); end component; component reg1 is port( D : in std_logic; Q : out std_logic; CLK : in std_logic; RESET : in std_logic ); end component; component adder is port ( a : in std_logic_vector ( 4 downto 0); b : in std_logic_vector ( 4 downto 0); cout : out std_logic; sum : out std_logic_vector (4 downto 0) ); end component; component mux5 is port ( din1 : in std_logic_vector ( 3 downto 0); sub : in std_logic ; mux_out : out std_logic_vector ( 4 downto 0 ) ); end component ; component counter IS PORT( clk : in std_logic; reset : in std_logic; counter_enable : in std_logic; cnt : out std_logic_vector(2 DOWNTO 0) ); END component; begin cnt_reset <= WE or reset; ct1: component counter port map ( counter_enable=> shift_enable,reset=>cnt_reset,cnt=>cnt,clk=>clk); with cnt select temp <= '1' when "100", '0' when others; mux5_1:component mux5 port map (din1=>sochia ,sub=>reg1out,mux_out=> b0 ); add:component adder port map (a=>a0 ,b=>b0 ,cout=>coutS ,sum=>Sout ); reg_1:component reg1 port map(D=>coutS ,Q=>reg1out ,clk=>clk,reset=>reset); remainder1 : component remainder port map (Din_S => Sout, reset => reset, Din_8 => sobichia,Dout=>a0,clk=>clk,WE=>WE,sh_e=>shift_enable); reg_q1 : component reg_q port map (bitin=>reg1out, Q =>thuong1,CLK=>clk,WE => WE ,reset=>reset); sreg2:component reg1 port map (d=>temp,clk =>clk,reset =>reset,Q =>reg_temp); shift_enable<= not reg_temp; du<=a0; thuong<=thuong1; end behavioral;
Code:
----------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; ----------------------------------------- entity reg_q is port( bitin : in std_logic; WE: in std_logic; Q : out std_logic_vector(4 downto 0); CLK : in std_logic; RESET : in std_logic ); end reg_q; ------------------------------------------ architecture behavioral of reg_q is SIGNAL D1 : std_logic_vector(4 downto 0); begin reg_p: process (CLK,bitin, RESET) begin if RESET = '1' then D1 <= (others => '0'); elsif CLK = '1' and CLK'event then D1 <= D1(3 downto 0)& bitin; end if; end process reg_p; Q<=D1; end behavioral; ------------------------------------------
Code:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.numeric_std.all; use IEEE.numeric_bit.all; -------------------------------- entity test is end entity; ----------------------- architecture tester of test is component divider is port ( sobichia :in std_logic_vector (7 downto 0); sochia :in std_logic_vector (3 downto 0); WE : in std_logic; clk : in std_logic; reset : in std_logic; thuong : out std_logic_vector (4 downto 0); du : out std_logic_vector(4 downto 0) ); end component; ------------------ signal sobichia : std_logic_vector (7 downto 0):="10000101"; signal sochia : std_logic_vector (3 downto 0):="1110"; signal we : std_logic:='0'; signal clk : std_logic:='1'; signal reset : std_logic:='1'; signal thuong : std_logic_vector (4 downto 0); signal du : std_logic_vector(4 downto 0); --create clock begin DUT: component divider port map (sobichia ,sochia,we,clk,reset,thuong,du); create_clock: process begin wait for 2 ns; CLK <= not CLK after 50 ns; end process create_clock; ----------------------------- create_reset: process begin --wait for 150 ns; --reset <= '1'; wait for 50 ns; reset <= '0'; --WE <= '1'; wait for 100 ns; WE <= '1'; wait; end process create_reset; end tester; ----------------------------
đây là kq mô phỏng :
em bị sai kết quả thương và dư ...
cảm ơn các bác trước ạ .
Comment