c - 用VHDL编写C语句

标签 c vhdl processor test-bench

我是 VHDL 新手,但在一些帮助下我已经成功地在 VHDL 中创建了一个处理器(它具有 ALU、乘法器和用于访问 SRAM 内存的总线架构)。处理器解码 32 位指令(其中包含操作类型和内存地址)。

如何在处理器中编写以下 C 代码?

int i = 0;
int c = 0;

int a[10] = "0,1,2,3,4,5,6,7,8,9";
int b[10] = "1,0,-1,0,1,0,2,1,-1,1";

for (i = 0; i < 9; i++) c += (a[i]*b[i]);

我猜我会在测试台中编写此 C 代码的指令列表:

1st instruction: multiply a[0] with b[0]
2nd instruction: add the result to c

重复9次。

这是正确的方法吗?有没有更好的方法来实现for循环?有没有办法直接在我的 tb_top.vhd 中编写 C 代码?

最佳答案

当然,您可以手动将C代码翻译为汇编代码,然后将其汇编为二进制代码。但是,更好的选择是为您的处理器使用 C 编译器和/或汇编器。如果没有可用的处理器,并且您打算将处理器用于更长/更多的程序,您可以在 gcc 之上构建一个新的编译器,并在 binutils 之上构建一个新的汇编器> 例如。

然后将二进制输出放入指令ROM中。如果您在没有内存和 I/O 设备的情况下模拟处理器本身,请在测试台中模拟指令 ROM。 std_logic_vector 数组应该可以满足您的需求:

type rom_t is array(natural range <>) of std_logic_vector(7 downto 0) ; 
constant rom : rom_t(0 to 63) := (
  0 => x"00", -- insert binary code of instruction at address 0 here
  1 => x"00", -- instruction at address 1
   -- and so on
   others => x"00" -- fill remaining ROM with zero
 );

该示例定义了一个具有 64 个地址的 ROM,每个地址存储一个字节。您必须更新范围和内存内容以满足您的需求。

关于c - 用VHDL编写C语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36346212/

相关文章:

c - 如何从 TCP header 打印序列和确认号

concatenation - (VHDL) 如何在一个时钟内部分分配求和结果

processor - 如何在QEMU中使用单步模式?

windows - Windows 64 位处理器上的最大进程大小是多少

c - 翻转C中的位

c - C 中的 Realloc 和 NULL 指针

vhdl - 将长 std_logic_vector 与零进行比较

hardware - 谁能推荐一个学习VHDL的好资源?

java - 乘法和除法是 O(1) 在最常用的计算机体系结构上实现的方式吗?

c - 一次从数组读取两个字节?