首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Verilog中创建Demux

在Verilog中创建Demux
EN

Stack Overflow用户
提问于 2018-03-31 19:24:25
回答 1查看 1.3K关注 0票数 1

你好,我有一个关于verilog的作业。

我的任务是:

“当中断被断言时,s1寄存器将在中断子程序中给出中断的计数器号。当收到多个中断时,s1寄存器将给出优先级编码器的输出。”

模式:

除了demux部分之外,我还设计了该模式,并在verilog RTL模式中看到。我怎样才能和其他部分一起看到demux部分呢?

这是我的verilog top_module代码。计数器,优先编码器,picoblaze给了我。

我试着写或盖特部分和演示。

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-01 08:31:53

您不会看到demux是优化的方式。您的代码总是生成一个1。

你可能想要这个:

代码语言:javascript
复制
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
  1. 如你所见,我总是用@(*)。这更安全。
  2. 您的开始信号默认设置为零。
  3. 您有一个组合块,因此必须使用阻塞分配。
  4. 由于某种原因,您使用3个编码器输出位,因此,您必须解码所有的状态,否则您得到锁存。这就是默认的用途。
  5. 通过保持重复代码的紧凑性,您可以更好地看到规则模式。在这种情况下,我看到你从3‘B 001开始,而不是从3'b000开始,因为某种原因。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49591544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档