-
-
Save Paebbels/4dc8bd9918a82f042b2b to your computer and use it in GitHub Desktop.
GHDL bind mux problem
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- | |
-- vim: tabstop=2:shiftwidth=2:noexpandtab | |
-- kate: tab-width 2; replace-tabs off; indent-width 2; | |
-- | |
-- ============================================================================= | |
-- Description: Prefix AND computation: y(i) <= '1' when x(i downto 0) = (i downto 0 => '1') else '0' | |
-- This implementation uses carry chains for wider implementations. | |
-- | |
-- Authors: Thomas B. Preusser | |
-- Patrick Lehmann | |
-- | |
-- ============================================================================= | |
-- Copyright 2007-2015 Technische Universität Dresden - Germany | |
-- Chair for VLSI-Design, Diagnostics and Architecture | |
-- | |
-- Licensed under the Apache License, Version 2.0 (the "License"); | |
-- you may not use this file except in compliance with the License. | |
-- You may obtain a copy of the License at | |
-- | |
-- http://www.apache.org/licenses/LICENSE-2.0 | |
-- | |
-- Unless required by applicable law or agreed to in writing, software | |
-- distributed under the License is distributed on an "AS IS" BASIS, | |
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
-- See the License for the specific language governing permissions and | |
-- limitations under the License. | |
-- ============================================================================= | |
library ieee; | |
use ieee.std_logic_1164.all; | |
use ieee.numeric_std.all; | |
entity arith_prefix_and is | |
generic ( | |
N : positive | |
); | |
port ( | |
x : in std_logic_vector(N-1 downto 0); | |
y : out std_logic_vector(N-1 downto 0) | |
); | |
end arith_prefix_and; | |
architecture rtl of arith_prefix_and is | |
type T_VENDOR is (VENDOR_XILINX, VENDOR_ALTERA); | |
constant VENDOR : T_VENDOR := VENDOR_XILINX; | |
begin | |
y(0) <= x(0); | |
gen1: if N > 1 generate | |
signal p : unsigned(N-1 downto 1); | |
begin | |
p(1) <= x(0) and x(1); | |
gen2: if N > 2 generate | |
p(N-1 downto 2) <= unsigned(x(N-1 downto 2)); | |
-- Generic Carry Chain through Addition | |
genGeneric: if VENDOR /= VENDOR_XILINX generate | |
signal s : std_logic_vector(N downto 1); | |
begin | |
s <= std_logic_vector(('0' & p) + 1); | |
y(N-1 downto 2) <= s(N downto 3) xor ('0' & x(N-1 downto 3)); | |
end generate genGeneric; | |
-- Direct Carry Chain by MUXCY Instantiation | |
genXilinx: if VENDOR = VENDOR_XILINX generate | |
component MUXCY | |
port ( | |
S : in std_logic; | |
DI : in std_logic; | |
CI : in std_logic; | |
O : out std_logic | |
); | |
end component; | |
signal c : std_logic_vector(N-1 downto 0); | |
begin | |
c(0) <= '1'; | |
genChain: for i in 1 to N-1 generate | |
mux : MUXCY | |
port map ( | |
S => p(i), | |
DI => '0', | |
CI => c(i-1), | |
O => c(i) | |
); | |
end generate genChain; | |
y(N-1 downto 2) <= c(N-1 downto 2); | |
end generate genXilinx; | |
end generate gen2; | |
y(1) <= p(1); | |
end generate gen1; | |
end rtl; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*- | |
-- vim: tabstop=2:shiftwidth=2:noexpandtab | |
-- kate: tab-width 2; replace-tabs off; indent-width 2; | |
-- | |
-- ============================================================================= | |
-- Testbench: Testbench for arith_prefix_and. | |
-- | |
-- Authors: Thomas B. Preusser | |
-- Patrick Lehmann | |
-- | |
-- Description: | |
-- ------------------------------------ | |
-- Automated testbench for PoC.arith_prefix_and | |
-- | |
-- License: | |
-- ============================================================================= | |
-- Copyright 2007-2015 Technische Universitaet Dresden - Germany | |
-- Chair for VLSI-Design, Diagnostics and Architecture | |
-- | |
-- Licensed under the Apache License, Version 2.0 (the "License"); | |
-- you may not use this file except in compliance with the License. | |
-- You may obtain a copy of the License at | |
-- | |
-- http://www.apache.org/licenses/LICENSE-2.0 | |
-- | |
-- Unless required by applicable law or agreed to in writing, software | |
-- distributed under the License is distributed on an "AS IS" BASIS, | |
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
-- See the License for the specific language governing permissions and | |
-- limitations under the License. | |
-- ============================================================================= | |
entity arith_prefix_and_tb is | |
end arith_prefix_and_tb; | |
use STD.TextIO.all; | |
library IEEE; | |
use IEEE.std_logic_1164.all; | |
use IEEE.numeric_std.all; | |
library PoC; | |
architecture tb of arith_prefix_and_tb is | |
shared variable pass : boolean := true; | |
procedure tbFail(msg : in string := "") is | |
begin | |
if msg'length > 0 then | |
report msg severity error; | |
end if; | |
pass := false; | |
end; | |
procedure tbAssert(cond : in boolean; msg : in string := "") is | |
begin | |
if not cond then | |
tbFail(msg); | |
end if; | |
end; | |
procedure tbPrintResult is | |
variable l : line; | |
begin | |
write(l, string'("SIMULATION RESULT = ")); | |
if pass then | |
write(l, string'("PASSED")); | |
else | |
write(l, string'("FAILED")); | |
end if; | |
writeline(output, l); | |
end procedure; | |
-- component generics | |
constant N : positive := 8; | |
-- component ports | |
signal x : std_logic_vector(N-1 downto 0); | |
signal y : std_logic_vector(N-1 downto 0); | |
begin -- tb | |
-- component instantiation | |
DUT : entity PoC.arith_prefix_and | |
generic map ( | |
N => N | |
) | |
port map ( | |
x => x, | |
y => y | |
); | |
-- Stimuli | |
process | |
begin | |
-- Exhaustive Testing | |
for i in 0 to 2**N-1 loop | |
x <= std_logic_vector(to_unsigned(i, N)); | |
wait for 10 ns; | |
for j in 0 to N-1 loop | |
tbAssert((y(j) = '1') = (x(j downto 0) = (j downto 0 => '1')), | |
"Wrong result for "&integer'image(i)&" / "&integer'image(j)); | |
end loop; | |
end loop; | |
-- Report overall result | |
tbPrintResult; | |
wait; -- forever | |
end process; | |
end tb; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment