在Verilog中,如何获取16位输入并将其分解为4、6和6位?
我做了很多谷歌搜索和堆栈溢出。我想我似乎无法恰当地回答这个问题。我正在努力学习verilog,我找到了一个制作微处理器的教程。我现在要做的是指令解码器在Verilog中,如何获取16位输入并将其分解为4、6和6位?,verilog,microprocessors,Verilog,Microprocessors,我做了很多谷歌搜索和堆栈溢出。我想我似乎无法恰当地回答这个问题。我正在努力学习verilog,我找到了一个制作微处理器的教程。我现在要做的是指令解码器 接受16位输入 前4位提升与指令对应的标志(例如MOV、ADD、ADDI、SUB、NOT和OR等) 最后12位分解为6和6,以便保持器执行操作 如果我解释的方式没有意义的话。 这是一个初学者水平的项目,这就是为什么我感到不安,我不能围绕这个问题。我只需要3个不同的输入,但我不认为一次发送4、6和6个信号 我知道标准是在你的问题中也有一些代码,
- 接受16位输入
- 前4位提升与指令对应的标志(例如MOV、ADD、ADDI、SUB、NOT和OR等)
- 最后12位分解为6和6,以便保持器执行操作
我知道标准是在你的问题中也有一些代码,但我真的不知道从哪里开始。我不确定使用本教程是否适合初学者。你应该从更简单的事情开始,比如先打印“hello world”。但这是一个起点: 1) 您将得到一条16位宽的指令:
module decoder(input [15:0] instruction, input clk, ...);
2) 根据您的图表(通常位“0”在最右边,位“15”在最左边),看起来位[5:0]属于第二个参数,位[11:6]属于第二个参数,位[15:12]属于代码。因此,您可以编写如下内容:
reg [3:0] opcode;
reg [5:0] param1;
reg [5:0] param2;
always @* begin
opcode = instruction[15:12];
param1 = instruction[11:6];
param2 = instruction[5:0];
end
这将给你一个起点。现在,对于模块,您需要计算出所需的输出和时钟。时钟在硬件中用于同步操作和创建状态机。在获得操作码和参数后,您需要弄清楚如何处理它们
现在您可以使用一些解码逻辑:
always @(posedge clk)
case (opcode)
4'b0100: op <= mov;
4'b0101: op <= add;
...
endcase
始终@(posedge clk)
案例(操作码)
4'b0100:op这确实有用!并回答你陈述的第一部分。我已经远远超过了verilog的Hello世界。这是最后一课。您需要的术语是“向量的位切片”