Jump to content

Shaq

Newcomers
  • Posts

    1
  • Joined

  • Last visited

Shaq's Achievements

Newbie

Newbie (1/4)

0

Reputation

  1. module Hf_Filter(clk, hf1_clk, rst_n, input_data, counter, hf1_output, output_data, hf2_clk, hf3_clk, hf2_output); parameter N = 16; input hf1_clk, clk, rst_n, hf2_clk, hf3_clk; input [N-1:0] input_data; output reg [N-1:0] output_data, hf1_output, hf2_output; output reg [7:0] counter; always@(posedge clk or posedge rst_n) begin if (rst_n == 1) counter <= 8'b0; else counter <= counter + 1; end // Define states typedef enum logic [3:0] { STATE_IDLE, STATE_HF1, STATE_HF2, STATE_HF3 } state_t; // Declare state and next state variables state_t state, next_state; always @ (posedge clk or posedge rst_n) begin if (rst_n == 1) begin state <= STATE_IDLE; end else begin state <= next_state; end end always @( * ) begin // Default next state is current state next_state = state; // State transitions case (state) STATE_IDLE: begin if (counter == 0) begin next_state = STATE_HF1; end end STATE_HF1: begin if (counter == 2) begin next_state = STATE_HF2; end end STATE_HF2: begin if (counter == 4) begin next_state = STATE_HF3; end end STATE_HF3: begin if (counter == 8) begin next_state = STATE_IDLE; end end endcase end //Instantiate the three halfband filters Hf_Filter1 Hf_Filter1_inst (.input_data(input_data), .hf1_clk(hf1_clk), .rst_n(rst_n), .hf1_output(hf1_output)); Hf_Filter2 Hf_Filter2_inst (.input_data(hf1_output), .hf2_clk(hf2_clk), .rst_n(rst_n), .hf2_output(hf2_output)); Hf_Filter3 Hf_Filter3_inst (.input_data(hf2_output), .hf3_clk(hf3_clk), .rst_n(rst_n), .output_data(output_data)); endmodule module Hf_Filter1( input hf1_clk, // Clock input input rst_n, // Reset input (active high) input [15:0] input_data, // Input sample (16-bit) output reg [15:0] hf1_output // Filter output ); parameter N = 16; // Halfband filter coefficients wire [N-1:0] w0 = 16'b1010100010111110; wire [N-1:0] w1 = 16'b0010011011000001; wire [N-1:0] w2 = 16'b1010100011100010; wire [N-1:0] w3 = 16'b0010101101110110; wire [N-1:0] w4 = 16'b1010111010010100; wire [N-1:0] w5 = 16'b0011010100010011; wire [N-1:0] w6 = 16'b0011110000000000; wire [N-1:0] w7 = 16'b0011010100010011; wire [N-1:0] w8 = 16'b1010111010010100; wire [N-1:0] w9 = 16'b0010101101110110; wire [N-1:0] w10 = 16'b1010100011100010; wire [N-1:0] w11 = 16'b0010011011000001; wire [N-1:0] w12 = 16'b1010100010111110; wire [N-1:0] B_in, B_out; Buffer Buffer (.clk(clk), .rst_n(rst_n), .B_in(B_in), .B_out(B_out)); //Multiplication wire [N-1:0] mul0, mul1, mul2, mul3, mul4, mul5, mul6, mul7, mul8, mul9, mul10, mul11, mul12; assign mul0 = input_data * w0; assign mul1 = B_out * w1; assign mul2 = (B_out + B_out) * w2; assign mul3 = (B_out + B_out + B_out) * w3; assign mul4 = (B_out + B_out + B_out + B_out) * w4; assign mul5 = (B_out + B_out + B_out + B_out + B_out) * w5; assign mul6 = (B_out + B_out + B_out + B_out + B_out + B_out) * w6; assign mul7 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w7; assign mul8 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w8; assign mul9 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w9; assign mul10 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w10; assign mul11 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w11; assign mul12 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w12; //Addition Operation wire [N-1:0] sum; assign sum = mul0 + mul1 + mul2 + mul3 + mul4 + mul5 + mul6 + mul7 + mul8 + mul9 + mul10 + mul11 + mul12; always@(posedge hf1_clk or posedge rst_n) begin if (rst_n == 1) begin hf1_output <= 16'b0; end else begin hf1_output <= sum; end end endmodule module Buffer( input wire clk, // Clock input input wire rst_n, // Reset input (active low) input wire [15:0] B_in, // Input signal output wire [15:0] B_out // Output signal ); wire [15:0] inv1_out; wire [15:0] inv2_out; // First inverter assign inv1_out = ~B_in; // Second inverter (acts as a delay) assign inv2_out = ~inv1_out; // Output assign B_out = inv2_out; endmodule module Hf_Filter2( input hf2_clk, // Clock input input rst_n, // Reset input (active high) input [15:0] input_data, // Input sample (16-bit) output reg [15:0] hf2_output// Filter output ); parameter N = 16; // Halfband filter coefficients wire [N-1:0] w0 = 16'b1010100010111110; wire [N-1:0] w1 = 16'b0010011011000001; wire [N-1:0] w2 = 16'b1010100011100010; wire [N-1:0] w3 = 16'b0010101101110110; wire [N-1:0] w4 = 16'b1010111010010100; wire [N-1:0] w5 = 16'b0011010100010011; wire [N-1:0] w6 = 16'b0011110000000000; wire [N-1:0] w7 = 16'b0011010100010011; wire [N-1:0] w8 = 16'b1010111010010100; wire [N-1:0] w9 = 16'b0010101101110110; wire [N-1:0] w10 = 16'b1010100011100010; wire [N-1:0] w11 = 16'b0010011011000001; wire [N-1:0] w12 = 16'b1010100010111110; wire [N-1:0] B_in, B_out; Buffer Buffer (.clk(clk), .rst_n(rst_n), .B_in(B_in), .B_out(B_out)); //Multiplication wire [N-1:0] mul0, mul1, mul2, mul3, mul4, mul5, mul6, mul7, mul8, mul9, mul10, mul11, mul12; assign mul0 = input_data * w0; assign mul1 = B_out * w1; assign mul2 = (B_out + B_out) * w2; assign mul3 = (B_out + B_out + B_out) * w3; assign mul4 = (B_out + B_out + B_out + B_out) * w4; assign mul5 = (B_out + B_out + B_out + B_out + B_out) * w5; assign mul6 = (B_out + B_out + B_out + B_out + B_out + B_out) * w6; assign mul7 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w7; assign mul8 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w8; assign mul9 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w9; assign mul10 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w10; assign mul11 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w11; assign mul12 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w12; //Addition Operation wire [N-1:0] sum; assign sum = mul0 + mul1 + mul2 + mul3 + mul4 + mul5 + mul6 + mul7 + mul8 + mul9 + mul10 + mul11 + mul12; always@(posedge hf2_clk or posedge rst_n) begin if (rst_n == 1) begin hf2_output <= 16'b0; end else begin hf2_output <= sum; end end endmodule module Hf_Filter3( input hf3_clk, // Clock input input rst_n, // Reset input (active high) input [15:0] input_data, // Input sample (16-bit) output reg [15:0] output_data// Filter output ); parameter N = 16; // Halfband filter coefficients wire [N-1:0] w0 = 16'b1010100010111110; wire [N-1:0] w1 = 16'b0010011011000001; wire [N-1:0] w2 = 16'b1010100011100010; wire [N-1:0] w3 = 16'b0010101101110110; wire [N-1:0] w4 = 16'b1010111010010100; wire [N-1:0] w5 = 16'b0011010100010011; wire [N-1:0] w6 = 16'b0011110000000000; wire [N-1:0] w7 = 16'b0011010100010011; wire [N-1:0] w8 = 16'b1010111010010100; wire [N-1:0] w9 = 16'b0010101101110110; wire [N-1:0] w10 = 16'b1010100011100010; wire [N-1:0] w11 = 16'b0010011011000001; wire [N-1:0] w12 = 16'b1010100010111110; wire [N-1:0] B_in, B_out; Buffer Buffer (.clk(clk), .rst_n(rst_n), .B_in(B_in), .B_out(B_out)); //Multiplication wire [N-1:0] mul0, mul1, mul2, mul3, mul4, mul5, mul6, mul7, mul8, mul9, mul10, mul11, mul12; assign mul0 = input_data * w0; assign mul1 = B_out * w1; assign mul2 = (B_out + B_out) * w2; assign mul3 = (B_out + B_out + B_out) * w3; assign mul4 = (B_out + B_out + B_out + B_out) * w4; assign mul5 = (B_out + B_out + B_out + B_out + B_out) * w5; assign mul6 = (B_out + B_out + B_out + B_out + B_out + B_out) * w6; assign mul7 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w7; assign mul8 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w8; assign mul9 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w9; assign mul10 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w10; assign mul11 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w11; assign mul12 = (B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out + B_out) * w12; //Addition Operation wire [N-1:0] sum; assign sum = mul0 + mul1 + mul2 + mul3 + mul4 + mul5 + mul6 + mul7 + mul8 + mul9 + mul10 + mul11 + mul12; always@(posedge hf3_clk or posedge rst_n) begin if (rst_n == 1) begin output_data <= 16'b0; end else begin output_data <= sum; end end endmodule This is my code and the output when I simulate it in modelsim is xxxxxxx or unknown.
×
×
  • Create New...