これは初めての投稿です。できるだけ具体的にしようとします。汎用VHDLコードのアドレス指定方法にForループを使用する
私が投稿しようとしているコードの部分では、私がコメントした"ケース" -expressionのコードを一般的な方法で実装しようとしています。このコードは、より大きな実装の一部であり、私はこのコードで現在使用されている信号のみを保持しています。
そうなことは、私は一般的なアドレスバス「BUS_A」に入力して来るものに従うことを「親族」と「DIN」私の出力を望んでいることを正しい言葉(2あります「0122」)「kin_2」と「din_2」は、その時点で「bus_di」の値で入力する必要があります。
ここに私の例では、私は各128ビットです「親族」と「喧騒」、のためにオリジナルの長さを使用するつもりです。したがって、128ビット長の場合、N = 16(16 * 8ビット= 128ビット)とK = 8です。
library IEEE;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_1164.ALL;
entity stck_if is
generic (N: integer:=16; K: integer:=8);
port ( -------------- Clock and Reset
clk: in std_logic;
rst: in std_logic;
bus_a: in std_logic_vector (15 downto 0); -- Address
bus_di: in std_logic_vector (15 downto 0); --Data In
kin: out std_logic_vector (8*N-1 downto 0);
din: out std_logic_vector (8*N-1 downto 0));
end stck_if;
architecture stck_if_arch of stck_if is
signal kin_2: std_logic_vector (8*N-1 downto 0);
signal din_2: std_logic_vector (8*N-1 downto 0);
signal encdec_2: std_logic;
signal trig_wr: std_logic;
begin
proc1: process(clk,rst)
variable int_add: integer:=0;
variable add: std_logic_vector (15 downto 0);
variable bit_add: std_logic_vector (15 downto 0);
begin
if rst='1' then
encdec_2<='0';
kin_2<=(others =>'0');
din_2<=(others =>'0');
elsif (clk'event and clk='1') then
if (trig_wr = '1') then
if (bus_a = "0000000000001100") then
encdec_2 <= bus_di(0);
end if;
for i in 0 to K-1 loop
bit_add:="0000000100000000";
int_add:= 2*i;
add:=std_logic_vector(to_unsigned(int_add, 16));
bit_add:= std_logic_vector(unsigned(bit_add) + unsigned(add));
if (bus_a = bit_add) then
kin_2((8*(N-int_add)-1) downto 8*(N-int_add)) <= bus_di;
end if;
end loop;
for i in 0 to K-1 loop
bit_add:="0000000101000000";
int_add:= 2*i;
add:=std_logic_vector(to_unsigned(int_add, 16));
bit_add:= std_logic_vector(unsigned(bit_add) + unsigned(add));
if (bus_a = bit_add) then
din_2((8*(N-int_add)-1) downto 8*(N-int_add)) <= bus_di;
end if;
end loop;
--case bus_a is
-- when "0000000000001100"=> encdec_2 <= bus_di(0); --bus_a = 000C hex
-- when "0000000100000000"=> kin_2(127 downto 112) <= bus_di; --bus_a = 0100 hex
-- when "0000000100000010"=> kin_2(111 downto 96) <= bus_di; --bus_a = 0102 hex
-- when "0000000100000100"=> kin_2(95 downto 80) <= bus_di; --bus_a = 0104 hex
-- when "0000000100000110"=> kin_2(79 downto 64) <= bus_di; --bus_a = 0106 hex
-- when "0000000100001000"=> kin_2(63 downto 48) <= bus_di; --bus_a = 0108 hex
-- when "0000000100001010"=> kin_2(47 downto 32) <= bus_di; --bus_a = 010A hex
-- when "0000000100001100"=> kin_2(31 downto 16) <= bus_di; --bus_a = 010C hex
-- when "0000000100001110"=> kin_2(15 downto 0) <= bus_di; --bus_a = 010E hex
-- when "0000000101000000"=> din_2(127 downto 112) <= bus_di; --bus_a = 0140 hex
-- when "0000000101000010"=> din_2(111 downto 96) <= bus_di; --bus_a = 0142 hex
-- when "0000000101000100"=> din_2(95 downto 80) <= bus_di; --bus_a = 0144 hex
-- when "0000000101000110"=> din_2(79 downto 64) <= bus_di; --bus_a = 0146 hex
-- when "0000000101001000"=> din_2(63 downto 48) <= bus_di; --bus_a = 0148 hex
-- when "0000000101001010"=> din_2(47 downto 32) <= bus_di; --bus_a = 014A hex
-- when "0000000101001100"=> din_2(31 downto 16) <= bus_di; --bus_a = 014C hex
-- when "0000000101001110"=> din_2(15 downto 0) <= bus_di; --bus_a = 014E hex
-- when others => null;
--end case;
end if;
end if;
end process;
kin <= kin_2;
din <= din_2;
end stck_if_arch;
私はのModelSim PEの学生版10.4aを使用しています。実装の動作をシミュレートするために、私はModelSimののコマンドラインで次のコードを使用します。
:restart -f
//clock period 20ns
force -freeze sim:/stck_if/clk 1 0, 0 {10 ns} -r 20
//Activate reset
force -freeze sim:/stck_if/rst 1 0
run
//activate wr
force -freeze sim:/stck_if/trig_wr 1 0
force -freeze sim:/stck_if/rst 0 0
run
force -freeze sim:/stck_if/bus_a 16'h0100 0
force -freeze sim:/stck_if/bus_di 16'h1111 0
run
run
force -freeze sim:/stck_if/bus_a 16'h0102 0
run
run
force -freeze sim:/stck_if/bus_a 16'h0104 0
run
run
force -freeze sim:/stck_if/bus_a 16'h0106 0
run
run
force -freeze sim:/stck_if/bus_a 16'h0108 0
run
run
etc.
コードがすべてのエラーを与えることなくコンパイルされているが、シミュレーション中にModelSimが次のエラーを与えます
- 致命的なエラーのために続行できません。 HDLの呼び出しシーケンス:Cで停止 :/Modeltech_pe_edu_10.4a/examples/stack.vhd 53 ForLoopループ
私が理解から、問題は「Forループ」を使用することにし、私が想定したものからですVHDLが次の式を変換できないようにする必要があります。
kin_2((8*(N-int_add)-1) downto 8*(N-int_add)) <= bus_di;
実際の回路への変換はできません。
私の仮説は正しいですか? この問題を解決する方法や、私の答えを見つけるためにどこを見て/読むべきかについての提案は、本当に役に立つでしょう!
範囲 'n-1 downto n'は空の範囲です:ベクトル内の部分範囲として使用され、要素のないベクトルを記述します。しかし、それだけでは致命的なエラーではありません。そこに幅の不一致に関するメッセージがありますか? –
@BrianDrummond あなたはその範囲について正しいです!私はエラーメッセージの最初に再度チェックしていました。最初のエラーは青色で表示されていました: **致命的:(vsim-3420)配列の長さが一致しません。左は0(127 downto 128(ヌル配列))です。右は16(15 downto 0)です** ** 2番目の "int_add"に "+2"を追加して修正しました。 ** kin_2((8 *(N-int_add)-1)downto 8 *(N-(int_add + 2)))<= bus_di; ** 私は本当に眠っているに違いない。今のコードは魅力のように機能します。どんな最適化やアドバイスも歓迎されます!ありがとうございました! –