2016-01-21 116 views
0

目前我正在嘗試執行this項目,而我被困在移位寄存器中。 事情是,我非常確定他們希望我們用d觸發器來實現這一點,但我只見過簡單的if/then轉換器。帶d觸發器的旋轉移位寄存器verilog

到目前爲止,我已經得到了每一個模擬照明的重置信號的持續時間,因爲我用它來輸入。但是,這個目標的全部目標是讓每個指示燈僅點亮一個時鐘,並無限旋轉。

這裏是我的問題:我如何從一開始就將輸入作爲一個開始,以及如何實現,因此復位信號不會影響後續LED亮起多久? (交替question-我要對這個只是讓不正確的,我應該放棄,現在和採取不同的方式?)

器代碼:

module shift_reg(
    input clk, 
    input rst, 
    output [7:0] led 
    ); 

//connector wire between flipflops 
wire [7:0] bitshift; 

// creating the shifter out of d flipflops 

//1st one 
d_ff d_ff0(
    .clk(clk), 
    .rst(rst), 
    .D(bitshift[0]), 
    .Q(bitshift[1]) 
); 

//middle ones 
genvar i; 
generate 
for (i=1; i<7; i=i+1) 
begin : d_ff_gen_label0 
    d_ff d_ff_inst1(
     .clk(clk), 
     .rst(rst), 
     .D(bitshift[i]), 
     .Q(bitshift[i+1]) 
    ); 
    end 
endgenerate; 

//last one 
d_ff d_ff1(
    .clk(clk), 
    .rst(rst), 
    .D(bitshift[7]), 
    .Q(bitshift[0]) 
); 

assign led = bitshift; 

endmodule 

D觸發器代碼:

module d_ff(
    input D, 
    input clk, 
    input rst, 
    output reg Q 
    ); 
always @(posedge 9clk0, posedge (rst)) 
begin 
    if (rst == 1) 
     Q <=1'b0; 
    else 
     Q <= D; 
end 
endmodule 
+2

我假設你的意思'(CLK) ',而不是'9clk0' ... – wilcroft

回答

0

一種解決方案是將其中一個FF復位爲1而不是0

爲了讓您等長的週期,使用同步復位(而不是異步一個,像你這樣的實現)

例如:

module d_ff_high(
    input D, 
    input clk, 
    input rst, 
    output reg Q 
    ); 
always @(posedge clk) 
begin 
    if (rst == 1) //only reset on a clock edge! 
     Q <=1'b1; 
    else 
     Q <= D; 
end 
endmodule 

... 
//1st one 
d_ff_high d_ff0(
...