質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
VHDL

VHDLは、デジタル回路設計用のハードウェア記述言語の一つ。明確な回路を加味せず、動作のみを書くだけでハードウェアの動作を定義することが可能。ソフトウェアのプログラミングと同じような設計ができます。

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

解決済

VHDLで符号拡張がうまくいかない

Ryuuse
Ryuuse

総合スコア27

VHDL

VHDLは、デジタル回路設計用のハードウェア記述言語の一つ。明確な回路を加味せず、動作のみを書くだけでハードウェアの動作を定義することが可能。ソフトウェアのプログラミングと同じような設計ができます。

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

2回答

0評価

0クリップ

551閲覧

投稿2021/02/06 03:18

VHDLの下記のソースコードで、コンパイル中に次のようなエラー文が出ました。「Error (10395): VHDL Conditional Signal Assignment error at mips_datapath.vhdl(150): conditional waveforms must have same number of elements」
しかし、該当する150行目( signimm <= X"0000" & immaddr when immaddr(15) = '0' else X"FFFF" & signimm;)を見てもどこがおかしいのかよく分かりませんでした。このエラーの原因と対処方法が分かりましたら教えて下さい。該当のソースコードは以下の通りです。

vhdl

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity mips_datapath is port ( clk, rst : in std_logic; rd1sel, branch, jump : in std_logic; regwrite, regdst, r31Set : in std_logic; alusrc : in std_logic; memwrite : in std_logic; memtoreg, pc4toreg : in std_logic; alucontrol : in std_logic_vector(2 downto 0); instr : out std_logic_vector(31 downto 0); -- to Controller pc, aluout, writedata : out std_logic_vector(31 downto 0)); -- to Data Memory end mips_datapath; architecture structure of mips_datapath is component imem port ( addr : in std_logic_vector(31 downto 0); rd : out std_logic_vector(31 downto 0)); end component; component alu port ( srcA, srcB : in std_logic_vector(31 downto 0); alucontrol : in std_logic_vector(2 downto 0); aluout : out std_logic_vector(31 downto 0); zero : out std_logic); end component; component regfile port ( clk : in std_logic; we3 : in std_logic; ra1, ra2, wa3 : in std_logic_vector(4 downto 0); wd3 : in std_logic_vector(31 downto 0); rd1, rd2 : out std_logic_vector(31 downto 0)); end component; component dmem port ( clk : in std_logic; we : in std_logic; addr, wd : in std_logic_vector(31 downto 0); rd : out std_logic_vector(31 downto 0)); end component; component signext port ( a : in std_logic_vector(15 downto 0); y : out std_logic_vector(31 downto 0)); end component; signal PCreg, pc_next : std_logic_vector(31 downto 0); signal pc4, pcjump, pcbranch : std_logic_vector(31 downto 0); signal signimm : std_logic_vector(31 downto 0); signal inst : std_logic_vector(31 downto 0);-- 命令メモリからの出力 signal srcA, srcB : std_logic_vector(31 downto 0);-- ALUへの入力 signal rs : std_logic_vector(4 downto 0); signal rt : std_logic_vector(4 downto 0); signal rd : std_logic_vector(4 downto 0); signal wa3 : std_logic_vector(4 downto 0); signal rd1, rd2 : std_logic_vector(31 downto 0); signal immaddr : std_logic_vector(15 downto 0); signal WriteAddr : std_logic_vector (4 downto 0); -- 書き込みアドレス signal WriteData0 : std_logic_vector (31 downto 0); -- 書き込みデータ signal ALUout0 : std_logic_vector (31 downto 0); -- からの出力ALU begin ----------------------------------------------------------------------------- -- プログラムカウンタ pc <= PCreg; process (clk, rst) begin if rst = '0' then PCreg <= X"00000000"; elsif clk'event and clk = '1' then PCreg <= pc_next; end if; end process; -- 次のPCのアドレスを計算する process (jump, branch, rd1sel, pcjump, pcbranch, srcA, pc4) begin if jump = '1' then pc_next <= pcjump; elsif branch = '1' then pc_next <= pcbranch; elsif rd1sel = '1' then pc_next <= srcA; else pc_next <= pc4; end if; end process; pc4 <= PCreg + 4; pcjump <= pc4(31 downto 28) & inst(25 downto 0) & "00"; pcbranch <= (signimm(29 downto 0) & "00") + pc4; ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- -- Instruction Fetch IMEM0 : imem port map ( addr => PCreg, rd => inst); ----------------------------------------------------------------------------- -- Instruction Decode -- レジスタファイル -- Instruction Memoryの出力信号をinstructionとする instr <= inst; -- 出力 rs <= inst(25 downto 21); rt <= inst(20 downto 16); rd <= inst(15 downto 11); immaddr <= inst(15 downto 0); RF : regfile port map ( clk => clk, we3 => regwrite, ra1 => rs, ra2 => rt, wa3 => rd, wd3 => inst); process (rt, rd, regdst, r31set) begin if r31Set = '1' then wa3 <= "11111"; elsif regdst = '1' then wa3 <= rd; else wa3 <= rt; end if; end process; ----------------------------------------------------------------------------- -- Execution -- ALUの接続 -- 符号拡張するところに注意 signimm <= X"0000" & immaddr when immaddr(15) = '0' else X"FFFF" & signimm; ALU0 : alu port map ( srcA => srcA , srcB => signimm , alucontrol => alucontrol , aluout => ALUout0); ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- -- Memory WriteData <= Writedata0 ; -- Data Memoryまわりの接続 MEM0 : dmem port map ( clk => clk, we => MemWrite, addr => ALUout0, wd => rd2, rd => writedata); ----------------------------------------------------------------------------- end structure;

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

VHDL

VHDLは、デジタル回路設計用のハードウェア記述言語の一つ。明確な回路を加味せず、動作のみを書くだけでハードウェアの動作を定義することが可能。ソフトウェアのプログラミングと同じような設計ができます。

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。