在Verilog中创建Demux
你好,我有一个关于verilog的家庭作业 我的任务是: ''当中断被断言时,s1寄存器将给出中断子程序中中断的计数器编号。当更多 如果收到一个以上的中断,s1寄存器将给出优先编码器的输出 模式: 我设计了这个模式,并在verilogrtl中看到了除demux部分之外的其他模式。 我怎样才能看到demux部分与其他部分一起 这是我的verilog top_模块代码。 计数器,优先编码器,皮开朗日是给我的 我试着写一篇精彩的文章在Verilog中创建Demux,verilog,Verilog,你好,我有一个关于verilog的家庭作业 我的任务是: ''当中断被断言时,s1寄存器将给出中断子程序中中断的计数器编号。当更多 如果收到一个以上的中断,s1寄存器将给出优先编码器的输出 模式: 我设计了这个模式,并在verilogrtl中看到了除demux部分之外的其他模式。 我怎样才能看到demux部分与其他部分一起 这是我的verilog top_模块代码。 计数器,优先编码器,皮开朗日是给我的 我试着写一篇精彩的文章 module top_module( input cloc
module top_module(
input clock,
input reset
);
///////priority_encoder///////
wire [3:0] encoder_in;
wire [2:0] encoder_out;
///////////////////////////
/////picoblaze//////
wire interrupt_ack;
//////////////////////////
//////coder/////////////
reg start1;
reg start2;
reg start3;
reg start4;
///////////////////////
always @ (encoder_out or interrupt_ack )
begin
case(encoder_out)
3'b001:
start1 <=1'b1;
3'b010:
start2 <=1'b1;
3'b011:
start3 <=1'b1;
3'b100:
start4 <=1'b1;
endcase
end
ascode instance_name (
.address(address),
.instruction(instruction),
.clk(clk)
);
kcpsm3 picoblaze (
.address(address),
.instruction(instruction),
.port_id(port_id),
.write_strobe(write_strobe),
.out_port(out_port),
.read_strobe(read_strobe),
.in_port(encoder_out),
.interrupt(interrupt),
.interrupt_ack(interrupt_ack),
.reset(reset),
.clk(clk)
);
priority_encoder p_encoder (
.encoder_in(encoder_in),
.encoder_out(encoder_out)
);
counter c100 (
.clk(clk),
.start(start1),
.count_up_to(100),
.ready(encoder_in[0])
);
counter c200 (
.clk(clk),
.start(start2),
.count_up_to(200),
.ready(encoder_in[1])
);
counter c300 (
.clk(clk),
.start(start3),
.count_up_to(300),
.ready(encoder_in[2])
);
counter c400 (
.clk(clk),
.start(start4),
.count_up_to(400),
.ready(encoder_in[3])
);
orgate orgate (
.r1(encoder_in[0]),
.r2(encoder_in[1]),
.r3(encoder_in[2]),
.r4(encoder_in[3]),
.y(interrupt)
);
endmodule
模块顶部\u模块(
输入时钟,
输入复位
);
///////优先编码器///////
导线[3:0]编码器_in;
线[2:0]编码器输出;
///////////////////////////
/////苦玻璃化//////
线路中断确认;
//////////////////////////
//////编码员/////////////
reg start1;
reg start2;
reg start3;
reg start4;
///////////////////////
始终@(编码器输出或中断确认)
开始
外壳(编码器输出)
3'b001:
start1您将看不到demux,因为它是优化的方式。您的代码始终生成1
你可能想要这个:
always @ ( * )
begin
{start1,start2,start3,start4} = 4'b000;
case(encoder_out)
3'b001 : start1 =interrupt_ack ;
3'b010 : start2 =interrupt_ack ;
3'b011 : start3 =interrupt_ack ;
default: start4 =interrupt_ack ;
endcase
end
如你所见,我总是使用@(*)。这样更安全李>
您的启动信号默认设置为零
您有一个组合块,因此必须使用块赋值李>
由于某些原因,您使用了3个编码器输出位,因此您必须解码所有状态,否则将获得锁存。这就是默认值的用途李>
通过保持重复代码的紧凑性,您可以更好地看到规则模式。在这种情况下,我看到你从3'b001开始,而不是出于某种原因从3'b000开始李>