多路选择器实现总线结构——Verilog
1 ////////////////////////////////////////////////////////////////////////////////// 2 //该程序完成通过多路选择器MUX完成总线读写的功能。 3 module MuxBus(input request1,input request2,input request3,input request4,input[7:0] unit0_out,input[7:0] unit1_out, 4 input[7:0] unit2_out,input[7:0] unit3_out, 5 output[7:0] unit0_in, output[7:0] unit1_in, output[7:0] unit2_in, output[7:0] unit3_in); 6 reg[1:0] sel; 7 reg[7:0] bus; 8 always@(request1,request2,request3,request4) 9 begin 10 casex({request1,request2,request3,request4})//注意这里要想使用这种优先级编码译码器,用的是casex,而不是case 11 4'b0001:sel=2'b00; //casex表示不关心x,z,?这三种符号 12 4'b001x:sel=2'b01; 13 4'b01xx:sel=2'b10; 14 default:sel=2'b11; 15 16 endcase 17 end 18 always@(sel,unit0_out,unit1_out,unit2_out,unit3_out) 19 begin 20 case(sel) 21 2'b00:bus=unit0_out; 22 2'b01:bus=unit1_out; 23 2'b10:bus=unit2_out; 24 2'b11:bus=unit3_out; 25 endcase 26 end 27 //仔细分析就知道下述代码从逻辑上和上述代码有冲突,sel作为选择信号,不可能选择了某个器件后,同时对总线进行读和写的操作, 28 //总线某一时刻只能处于读状态或者写状态。如果对总线进行读或者写,需要读写控制信号 29 /*always@(sel,bus) 30 begin 31 case(sel) 32 2'b00:unit0_in=bus; //同时,这样的代码书写产生了锁存器单元,比如sel=2'b01时,unit0,2,3_in这三个器件只能保持它原来的值。 33 2'b01:unit1_in=bus; 34 2'b10:unit2_in=bus; 35 2'b11:unit3_in=bus; 36 endcase 37 end 38 */ //不产生锁存的条件在于对同一个变量满足所有的情况,并不单单是case后面的变量,写出了所有情况即可,要注意不同变量存在时导致的锁存 39 assign unit0_in=bus; 40 assign unit1_in=bus; 41 assign unit2_in=bus; 42 assign unit3_in=bus; 43 endmodule
stay foolish,stay hungry