Advertisement
andreibalu

emi

Jan 5th, 2021
1,610
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module d_ff(
  2.   input clk,rst,d,
  3.   output reg q);
  4. always @ (posedge clk, posedge rst)
  5. if(rst==1) q<=0;
  6. else
  7.   q<=d;
  8. endmodule
  9.  
  10. module d_ffinv(
  11.   input clk,rst,d,
  12.   output reg q);
  13. always @ (posedge clk, posedge rst)
  14. if(rst==1) q<=1;
  15. else
  16.   q<=d;
  17. endmodule
  18.  
  19. module fdivby3(
  20.   input c_up,clr,clk,rst,
  21.   output fdclk
  22.   );
  23.   localparam S0 = 2'd0;
  24.   localparam S1 = 2'd1;
  25.   localparam S2 = 2'd2;
  26.  
  27.   wire [2:0] st;
  28.   wire [2:0] st_nxt;
  29.  
  30.   assign st_nxt[S0] = (st[S0] & ((~c_up) | clr)) | (st[S1] & clr) | (st[S2] & (c_up | clr));
  31.   assign st_nxt[S1] = (st[S0] & c_up & (~clr)) | (st[S1] & (~c_up) & (~clr));
  32.   assign st_nxt[S2] = (st[S1] & c_up & (~clr)) | (st[S2] & (~c_up) & (~clr));
  33.  
  34.   d_ffinv inst0 (.clk(clk),.rst(rst),.d(st_nxt[S0]),.q(st[S0]));
  35.   d_ff inst1 (.clk(clk),.rst(rst),.d(st_nxt[S1]),.q(st[S1]));
  36.   d_ff inst2 (.clk(clk),.rst(rst),.d(st_nxt[S2]),.q(st[S2]));
  37.   assign fdclk =st[S0];
  38.  
  39. endmodule
  40.  
  41. module fdivby3_tb;
  42.   reg clk,rst,clr,c_up;
  43.   wire fdclk;
  44.  
  45.   fdivby3 inst(.clk(clk),.rst(rst),.clr(clr),.c_up(c_up),.fdclk(fdclk));
  46.  
  47.   localparam CLK_PERIOD=100, RUNNING_CYCLES=17, RST_DURATION=25;
  48.   initial begin
  49.     $display("time\tclk\trst_b\tclr\tc_up\tfdclk");
  50.     $monitor("%5t\t%b\t%b\t%b\t%b\t%b",$time,clk,rst,clr,c_up,fdclk);
  51.     clk=0;
  52.     repeat (2*RUNNING_CYCLES) #(CLK_PERIOD/2) clk=~clk;
  53.   end
  54.  
  55.   initial begin
  56.     rst=1;
  57.     #RST_DURATION rst=0;
  58.   end
  59.  
  60.   initial begin
  61.     clr = 0;
  62.     #(4*CLK_PERIOD) clr=~clr;
  63.     #(CLK_PERIOD) clr=~clr;
  64.   end
  65.  
  66.   initial begin
  67.     c_up = 1;
  68.     #(6*CLK_PERIOD) c_up=~c_up;
  69.     #(CLK_PERIOD) c_up=~c_up;
  70.     #(4*CLK_PERIOD) c_up=~c_up;
  71.     #(2*CLK_PERIOD) c_up=~c_up;
  72.   end
  73. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement