(a) Mi propia preferencia es (fuertemente) para VHDL; de muchas maneras, con VHDL, usted sabe dónde se encuentra, más exactamente, que en Verilog. Describí algunas de estas formas en esta respuesta y otra respuesta allí dio this enlace útil.
Se dice que VHDL es más detallado, pero creo que sus características de HLL me permiten crear hardware a un nivel superior, y eso compensa la verbosidad y hace que mis diseños sean más pequeños y fáciles de entender.
Dicho esto, si C es su lenguaje de software favorito, es posible que prefiera Verilog, y cualquiera de los dos idiomas sin duda se encargará de su tarea. Así que todo se reduce a la preferencia.
De cualquier manera, aprenda el simulador y adquiera el hábito de escribir un banco de pruebas de autocomprobación junto con sus unidades de diseño. El progreso puede parecer inicialmente un poco más lento, pero definitivamente más suave.
(b) Ejemplo de contador ...
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
USE ieee.numeric_std.ALL;
entity count is
Port ( clk : in STD_LOGIC;
-- reset : in STD_LOGIC;
start : in STD_LOGIC;
stop : in STD_LOGIC;
clear : in STD_LOGIC;
data : out UNSIGNED (7 downto 0));
end count;
architecture Behavioral of count is
type State_Type is (Idle, Run);
begin
Counter : process(Clk) is
variable Count : UNSIGNED (7 downto 0);
variable State : State_Type := Idle;
begin
if rising_edge(Clk) then
-- if reset = '1' then ... setup power-up state here
if clear = '1' then
Count := (others => '0');
elsif State = Run then
Count := Count + 1;
end if;
if start = '1' then
State := Run; -- variable assignment
elsif stop = '1' then
State := Idle;
end if;
data <= Count; -- signal assignment
end if;
end process Counter;
end Behavioral;
Y un banco de pruebas. Tenga en cuenta que verifica las salidas y los informes de errores, en lugar de dejar que mire fijamente las formas de onda. Eso es lo que quise decir con autocontrol. Para ser aún más estricto, podría establecer el fallo de gravedad y abortarlo en el primer error que encuentre.
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY test IS
END test;
ARCHITECTURE behavior OF test IS
signal testclk : STD_LOGIC := '1';
signal start : STD_LOGIC := '0';
signal stop : STD_LOGIC := '0';
signal clear : STD_LOGIC := '0';
signal test_out : UNSIGNED (7 downto 0);
constant Tcy : time := 10 ns;
BEGIN
UUT : entity work.count
Port map ( clk => testclk,
start => start,
stop => stop,
clear => clear,
data => test_out );
-- Test Bench Statements
testclk <= not testclk after Tcy/2 ; -- 100MHz
tb : PROCESS
BEGIN
wait for Tcy/2;
clear <= '1';
stop <= '1';
wait for Tcy;
clear <= '0';
stop <= '0';
-- check counter is stopped and clear
wait for Tcy;
assert test_out = 0 report "Counter is not clear" severity error;
wait for 5*Tcy;
assert test_out = 0 report "Counter is not stopped" severity error;
start <= '1';
wait for Tcy;
start <= '0';
-- check counter can count!
wait for 5 * Tcy;
assert test_out = 5 report "Counter is not counting correctly" severity error;
report "Counter has counted to "
& natural'image(to_integer(test_out)) severity note;
wait for 5 * Tcy;
report "Tests complete : not a failure!" severity failure;
END PROCESS tb;
END;
(c) dejado como ejercicio ...
(d) Para cosas simples como contadores, mi opinión es que la IP del proveedor es solo una buena manera de encerrarlo en un proveedor. Straight VHDL se puede sintetizar de manera muy eficiente y compilar para cualquier proveedor. Cuando llegas a los controladores de memoria DDR2 y las CPU, es un asunto diferente.
d2) Floorplanning puede comprarle un 30% más de velocidad si está dispuesto a tomarse el tiempo para aprender y jugar con el diseño del lugar. Mi experiencia aquí es Xilinx; para Altera, YMMV.
e) ¿Qué tal un enlace a la pizarra para que podamos comentar?
f) Última generación. Si la velocidad simple importa, elija el Virtex-6 más pequeño (costoso) sobre un Spartan-6 grande (barato), aunque supongo que incluso el S6 puede contar a más de 300 MHz. No puedo comentar sobre los productos de Altera.