From 52c550bdea3374714d170689acc966be99296e4a Mon Sep 17 00:00:00 2001 From: Kirigaya <1193466151@qq.com> Date: Thu, 24 Aug 2023 11:58:55 +0800 Subject: [PATCH] update --- .vscode/property.json | 11 + README.md | 18 +- manager/.vscode/property.json | 11 + manager/user/src/hello.v | 6 + monitor/.vscode/property.json | 17 + monitor/sim1/testbench.v | 50 ++ monitor/src1/add.v | 11 + monitor/src2/add.v | 9 + suite/extension.test.ts | 15 + suite/index.ts | 38 ++ tcl/timing.xdc | 9 + user/Hardware/sim/testbench.v | 51 ++ user/Hardware/src/Cordic.v | 265 ++++++++++ user/Hardware/src/clkdiv.v | 29 ++ user/Hardware/src/fsm_test.v | 58 +++ user/Hardware/src/hello.v | 33 ++ user/Hardware/src/hello.vhd | 14 + user/Hardware/src/mult_module.v | 80 +++ user/Hardware/src/netlist_test.v | 34 ++ vhdl/Scientific.vhd | 15 + vhdl/based.vhd | 16 + vhdl/bigfile.vhd | 467 ++++++++++++++++++ vhdl/clk.vhd | 36 ++ vhdl/counters.vhd | 344 +++++++++++++ vhdl/dsp.vhd | 41 ++ vhdl/expr.vhd | 46 ++ vhdl/fifo.vhd | 202 ++++++++ vhdl/forgen.vhd | 52 ++ vhdl/forloop.vhd | 37 ++ vhdl/formatter_vhdl.vhd | 0 vhdl/genericmap.vhd | 105 ++++ vhdl/ifchain.vhd | 26 + vhdl/ifchain2.vhd | 36 ++ vhdl/mem.vhd | 36 ++ vhdl/operators.vhd | 85 ++++ vhdl/partselect.vhd | 32 ++ vhdl/signextend.vhd | 17 + vhdl/test.vhd | 191 +++++++ vhdl/todo.vhd | 74 +++ vhdl/wbit1.vhd | 21 + vhdl/whileloop.vhd | 27 + vhdl/withselect.vhd | 34 ++ vlog/dependence_test/.vscode/property.json | 17 + vlog/dependence_test/child_1.v | 17 + vlog/dependence_test/child_2.v | 8 + vlog/dependence_test/head_1.v | 23 + vlog/dependence_test/hello.v | 6 + vlog/dependence_test/parent.v | 69 +++ vlog/dependence_test/pdf/parent.pdf | Bin 0 -> 95015 bytes vlog/dependence_test/readme_cn.md | 10 + .../dependence_test/simulation/icarus/out.vvp | 26 + vlog/formatter_test/formatter_test.v | 11 + vlog/fsm_test/fsm_test.v | 58 +++ vlog/netlist_test/netlist_test.v | 33 ++ vlog/parse_test/Cordic.v | 257 ++++++++++ vlog/parse_test/instance_test.v | 11 + vlog/parse_test/mult_module.v | 80 +++ vlog/wavedrom_test/sample.v | 35 ++ 58 files changed, 3359 insertions(+), 1 deletion(-) create mode 100644 .vscode/property.json create mode 100644 manager/.vscode/property.json create mode 100644 manager/user/src/hello.v create mode 100644 monitor/.vscode/property.json create mode 100644 monitor/sim1/testbench.v create mode 100644 monitor/src1/add.v create mode 100644 monitor/src2/add.v create mode 100644 suite/extension.test.ts create mode 100644 suite/index.ts create mode 100644 tcl/timing.xdc create mode 100644 user/Hardware/sim/testbench.v create mode 100644 user/Hardware/src/Cordic.v create mode 100644 user/Hardware/src/clkdiv.v create mode 100644 user/Hardware/src/fsm_test.v create mode 100644 user/Hardware/src/hello.v create mode 100644 user/Hardware/src/hello.vhd create mode 100644 user/Hardware/src/mult_module.v create mode 100644 user/Hardware/src/netlist_test.v create mode 100644 vhdl/Scientific.vhd create mode 100644 vhdl/based.vhd create mode 100644 vhdl/bigfile.vhd create mode 100644 vhdl/clk.vhd create mode 100644 vhdl/counters.vhd create mode 100644 vhdl/dsp.vhd create mode 100644 vhdl/expr.vhd create mode 100644 vhdl/fifo.vhd create mode 100644 vhdl/forgen.vhd create mode 100644 vhdl/forloop.vhd create mode 100644 vhdl/formatter_vhdl.vhd create mode 100644 vhdl/genericmap.vhd create mode 100644 vhdl/ifchain.vhd create mode 100644 vhdl/ifchain2.vhd create mode 100644 vhdl/mem.vhd create mode 100644 vhdl/operators.vhd create mode 100644 vhdl/partselect.vhd create mode 100644 vhdl/signextend.vhd create mode 100644 vhdl/test.vhd create mode 100644 vhdl/todo.vhd create mode 100644 vhdl/wbit1.vhd create mode 100644 vhdl/whileloop.vhd create mode 100644 vhdl/withselect.vhd create mode 100644 vlog/dependence_test/.vscode/property.json create mode 100644 vlog/dependence_test/child_1.v create mode 100644 vlog/dependence_test/child_2.v create mode 100644 vlog/dependence_test/head_1.v create mode 100644 vlog/dependence_test/hello.v create mode 100644 vlog/dependence_test/parent.v create mode 100644 vlog/dependence_test/pdf/parent.pdf create mode 100644 vlog/dependence_test/readme_cn.md create mode 100644 vlog/dependence_test/simulation/icarus/out.vvp create mode 100644 vlog/formatter_test/formatter_test.v create mode 100644 vlog/fsm_test/fsm_test.v create mode 100644 vlog/netlist_test/netlist_test.v create mode 100644 vlog/parse_test/Cordic.v create mode 100644 vlog/parse_test/instance_test.v create mode 100644 vlog/parse_test/mult_module.v create mode 100644 vlog/wavedrom_test/sample.v diff --git a/.vscode/property.json b/.vscode/property.json new file mode 100644 index 0000000..71cfab5 --- /dev/null +++ b/.vscode/property.json @@ -0,0 +1,11 @@ +{ + "toolChain": "xilinx", + "prjName": { + "PL": "template" + }, + "soc": { + "core": "cortexM3" + }, + "enableShowLog": false, + "device": "none" +} \ No newline at end of file diff --git a/README.md b/README.md index 501f8ab..fc75ef1 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,18 @@ # Digital-Test -test space for Digital IDE extension + + +默认property.json: + +```json +{ + "toolChain": "xilinx", + "prjName": { + "PL": "template" + }, + "soc": { + "core": "cortexM3" + }, + "enableShowLog": false, + "device": "none" +} +``` \ No newline at end of file diff --git a/manager/.vscode/property.json b/manager/.vscode/property.json new file mode 100644 index 0000000..7dc2beb --- /dev/null +++ b/manager/.vscode/property.json @@ -0,0 +1,11 @@ +{ + "toolChain": "xilinx", + "prjName": { + "PL": "template" + }, + "soc": { + "core": "none" + }, + "enableShowLog": false, + "device": "none" +} \ No newline at end of file diff --git a/manager/user/src/hello.v b/manager/user/src/hello.v new file mode 100644 index 0000000..4165df3 --- /dev/null +++ b/manager/user/src/hello.v @@ -0,0 +1,6 @@ +module hello( + input clk, reset, + output value +); + +endmodule \ No newline at end of file diff --git a/monitor/.vscode/property.json b/monitor/.vscode/property.json new file mode 100644 index 0000000..da1fccd --- /dev/null +++ b/monitor/.vscode/property.json @@ -0,0 +1,17 @@ +{ + "toolChain": "xilinx", + "prjName": { + "PL": "template" + }, + "soc": { + "core": "none" + }, + "enableShowLog": false, + "device": "none", + "arch": { + "hardware": { + "src": "./src1", + "sim": "./sim1" + } + } +} \ No newline at end of file diff --git a/monitor/sim1/testbench.v b/monitor/sim1/testbench.v new file mode 100644 index 0000000..ebc7f5f --- /dev/null +++ b/monitor/sim1/testbench.v @@ -0,0 +1,50 @@ +module testbench(); + +parameter DATA_WIDTH = 32; +parameter ADDR_WIDTH = 32; +parameter MAIN_FRE = 100; //unit MHz +reg sys_clk = 0; +reg sys_rst = 1; +reg [DATA_WIDTH-1:0] data = 0; +reg [ADDR_WIDTH-1:0] addr = 0; + +always begin + #(500/MAIN_FRE) sys_clk = ~sys_clk; +end + +always begin + #50 sys_rst = 0; +end + +always @(posedge sys_clk) begin + if (sys_rst) + addr = 0; + else + addr = addr + 1; +end +always @(posedge sys_clk) begin + if (sys_rst) + data = 0; + else + data = data + 1; +end + +//Instance +// outports wire +wire [8:0] c; + +SimpleAdd_1 u_SimpleAdd_1( + .a ( a ), + .b ( b ), + .c ( c ) +); + + + +initial begin + $dumpfile("wave.vcd"); + $dumpvars(0, testbench); + #50000 $finish; +end + +endmodule //TOP diff --git a/monitor/src1/add.v b/monitor/src1/add.v new file mode 100644 index 0000000..f544fb7 --- /dev/null +++ b/monitor/src1/add.v @@ -0,0 +1,11 @@ +module SimpleAdd_1( + input [8:0] a, b, + output [8:0] c +); + + assign c = a + b; + + +endmodule //SimpleAdd + + diff --git a/monitor/src2/add.v b/monitor/src2/add.v new file mode 100644 index 0000000..62647f8 --- /dev/null +++ b/monitor/src2/add.v @@ -0,0 +1,9 @@ +module SimpleAdd_2( + input [7:0] a, b, + output [7:0] c +); + + assign c = a + b; + + +endmodule //SimpleAdd diff --git a/suite/extension.test.ts b/suite/extension.test.ts new file mode 100644 index 0000000..4ca0ab4 --- /dev/null +++ b/suite/extension.test.ts @@ -0,0 +1,15 @@ +import * as assert from 'assert'; + +// You can import and use all API from the 'vscode' module +// as well as import your extension to test it +import * as vscode from 'vscode'; +// import * as myExtension from '../../extension'; + +suite('Extension Test Suite', () => { + vscode.window.showInformationMessage('Start all tests.'); + + test('Sample test', () => { + assert.strictEqual(-1, [1, 2, 3].indexOf(5)); + assert.strictEqual(-1, [1, 2, 3].indexOf(0)); + }); +}); diff --git a/suite/index.ts b/suite/index.ts new file mode 100644 index 0000000..7029e38 --- /dev/null +++ b/suite/index.ts @@ -0,0 +1,38 @@ +import * as path from 'path'; +import * as Mocha from 'mocha'; +import * as glob from 'glob'; + +export function run(): Promise { + // Create the mocha test + const mocha = new Mocha({ + ui: 'tdd', + color: true + }); + + const testsRoot = path.resolve(__dirname, '..'); + + return new Promise((c, e) => { + glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { + if (err) { + return e(err); + } + + // Add files to the test suite + files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); + + try { + // Run the mocha test + mocha.run(failures => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } else { + c(); + } + }); + } catch (err) { + console.error(err); + e(err); + } + }); + }); +} diff --git a/tcl/timing.xdc b/tcl/timing.xdc new file mode 100644 index 0000000..3128e9f --- /dev/null +++ b/tcl/timing.xdc @@ -0,0 +1,9 @@ +create_debug_core u_ila_0 ila +set_property ALL_PROBE_SAME_MU true +set_property C_ADV_TRIGGER true +set_property C_EN_STRG_QUAL true +set_property C_INPUT_PIPE_STAGES true +set_property C_TRIGIN_EN false +set_property C_TRIGOUT_EN false +set_property port_width +connect_debug_port u_ila_0/clk \ No newline at end of file diff --git a/user/Hardware/sim/testbench.v b/user/Hardware/sim/testbench.v new file mode 100644 index 0000000..7ad4f51 --- /dev/null +++ b/user/Hardware/sim/testbench.v @@ -0,0 +1,51 @@ +module testbench(); + +parameter DATA_WIDTH = 32; +parameter ADDR_WIDTH = 32; +parameter MAIN_FRE = 100; //unit MHz +reg sys_clk = 0; +reg sys_rst = 1; +reg [DATA_WIDTH-1:0] data = 0; +reg [ADDR_WIDTH-1:0] addr = 0; + +always begin + #(500/MAIN_FRE) sys_clk = ~sys_clk; +end + +always begin + #50 sys_rst = 0; +end + +always @(posedge sys_clk) begin + if (sys_rst) + addr = 0; + else + addr = addr + 1; +end +always @(posedge sys_clk) begin + if (sys_rst) + data = 0; + else + data = data + 1; +end + +//Instance +// outports wire +wire outp; + +mux2to1 u_mux2to1( + .a ( a ), + .b ( b ), + .sel ( sel ), + .outp ( outp ) +); + + + +initial begin + $dumpfile("wave.vcd"); + $dumpvars(0, testbench); + #50000 $finish; +end + +endmodule //TOP diff --git a/user/Hardware/src/Cordic.v b/user/Hardware/src/Cordic.v new file mode 100644 index 0000000..20b354c --- /dev/null +++ b/user/Hardware/src/Cordic.v @@ -0,0 +1,265 @@ +`timescale 1ns / 1ps + + +`include "mult_module.v" + +module Cordic #( + parameter XY_BITS = 12, + parameter PH_BITS = 32, + parameter ITERATIONS = 32, + parameter CORDIC_STYLE = "ROTATE", + parameter PHASE_ACC = "ON" +)( + input clk, + input RST, + input signed [XY_BITS-1:0] x_i, + input signed [XY_BITS-1:0] y_i, + input signed [PH_BITS-1:0] phase_in, + + output signed [XY_BITS-1:0] x_o, + output signed [XY_BITS-1:0] y_o, + output signed [PH_BITS-1:0] phase_out, + input valid_in, + output valid_out +); + +localparam [XY_BITS-1:0] K_COS = (0.607252935 * 2**(XY_BITS-1))-2; + +/* +//360°--2^16,phase_in = 16bits (input [15:0] phase_in) +//1°--2^16/360 +*/ +function [PH_BITS-1:0] tanangle; +input [4:0] i; +begin + case (i) + 5'b00000: tanangle = (32'h20000000 >> (32 - PH_BITS)); //tan = 1/2^1 = 1/2 + 5'b00001: tanangle = (32'h12e4051e >> (32 - PH_BITS)); //tan = 1/2^2 = 1/4 + 5'b00010: tanangle = (32'h09fb385b >> (32 - PH_BITS)); //tan = 1/2^3 = 1/8 + 5'b00011: tanangle = (32'h051111d4 >> (32 - PH_BITS)); //tan = 1/2^4 = 1/16 + 5'b00100: tanangle = (32'h028b0d43 >> (32 - PH_BITS)); //tan = 1/2^5 = 1/32 + 5'b00101: tanangle = (32'h0145d7e1 >> (32 - PH_BITS)); //tan = 1/2^6 = 1/64 + 5'b00110: tanangle = (32'h00a2f61e >> (32 - PH_BITS)); //tan = 1/2^7 = 1/128 + 5'b00111: tanangle = (32'h00517c55 >> (32 - PH_BITS)); //tan = 1/2^8 = 1/256 + 5'b01000: tanangle = (32'h0028be53 >> (32 - PH_BITS)); //tan = 1/2^9 = 1/512 + 5'b01001: tanangle = (32'h00145f2f >> (32 - PH_BITS)); //tan = 1/2^10 = 1/1024 + 5'b01010: tanangle = (32'h000a2f98 >> (32 - PH_BITS)); //tan = 1/2^11 = 1/2048 + 5'b01011: tanangle = (32'h000517cc >> (32 - PH_BITS)); //tan = 1/2^12 = 1/4096 + 5'b01100: tanangle = (32'h00028be6 >> (32 - PH_BITS)); //tan = 1/2^13 = 1/8192 + 5'b01101: tanangle = (32'h000145f3 >> (32 - PH_BITS)); //tan = 1/2^14 = 1/16384 + 5'b01110: tanangle = (32'h0000a2fa >> (32 - PH_BITS)); //tan = 1/2^15 = 1/32768 + 5'b01111: tanangle = (32'h0000517d >> (32 - PH_BITS)); //tan = 1/2^16 = 1/65536 + 5'b10000: tanangle = (32'h000028be >> (32 - PH_BITS)); //tan = 1/2^17 = 1/131072 + 5'b10001: tanangle = (32'h0000145f >> (32 - PH_BITS)); //tan = 1/2^18 = 1/262144 + 5'b10010: tanangle = (32'h00000a30 >> (32 - PH_BITS)); //tan = 1/2^19 = 1/524288 + 5'b10011: tanangle = (32'h00000518 >> (32 - PH_BITS)); //tan = 1/2^20 = 1/1048576 + 5'b10100: tanangle = (32'h0000028c >> (32 - PH_BITS)); //tan = 1/2^21 = 1/2097152 + 5'b10101: tanangle = (32'h00000146 >> (32 - PH_BITS)); //tan = 1/2^22 = 1/4194304 + 5'b10110: tanangle = (32'h000000a3 >> (32 - PH_BITS)); //tan = 1/2^23 = 1/8388608 + 5'b10111: tanangle = (32'h00000051 >> (32 - PH_BITS)); //tan = 1/2^24 = 1/16777216 + 5'b11000: tanangle = (32'h00000029 >> (32 - PH_BITS)); //tan = 1/2^25 = 1/33554432 + 5'b11001: tanangle = (32'h00000014 >> (32 - PH_BITS)); //tan = 1/2^26 = 1/67108864 + 5'b11010: tanangle = (32'h0000000a >> (32 - PH_BITS)); //tan = 1/2^27 = 1/134217728 + 5'b11011: tanangle = (32'h00000005 >> (32 - PH_BITS)); //tan = 1/2^28 = 1/268435456 + 5'b11100: tanangle = (32'h00000003 >> (32 - PH_BITS)); //tan = 1/2^29 = 1/536870912 + 5'b11101: tanangle = (32'h00000001 >> (32 - PH_BITS)); //tan = 1/2^30 = 1/1073741824 + 5'b11110: tanangle = (32'h00000001 >> (32 - PH_BITS)); //tan = 1/2^31 = 1/2147483648 + 5'b11111: tanangle = (32'h00000000 >> (32 - PH_BITS)); //tan = 1/2^32 = 1/4294967296 + endcase +end +endfunction + +reg [1:0] data_in_buff [ITERATIONS:0]; +reg signed [XY_BITS-1:0] x [ITERATIONS:0]; +reg signed [XY_BITS-1:0] y [ITERATIONS:0]; +reg signed [PH_BITS-1:0] z [ITERATIONS:0]; + +integer m; +initial begin + for (m = 0; m<=ITERATIONS; m=m+1) begin + x[m] = 0; + end +end + + + +integer n; +initial begin + for (n = 0; n<=ITERATIONS; n=n+1) begin + y[n] = 0; + end +end + +integer s; +initial begin + for (s = 0; s<=ITERATIONS; s=s+1) begin + z[s] = 0; + end +end + +integer k; +initial begin + for (k = 0; k<=ITERATIONS; k=k+1) begin + data_in_buff[k] = 0; + end +end + + + + +genvar i; +generate for(i=0;i>>i); + y[i+1] <= y[i] - (x[i]>>>i); + z[i+1] <= z[i] + tanangle(i); + end + else begin + x[i+1] <= x[i] - (y[i]>>>i); + y[i+1] <= y[i] + (x[i]>>>i); + z[i+1] <= z[i] - tanangle(i); + end + end + else if(CORDIC_STYLE == "VECTOR") begin + if (y[i] > 0) begin + x[i+1] <= x[i] + (y[i]>>>i); + y[i+1] <= y[i] - (x[i]>>>i); + z[i+1] <= z[i] + tanangle(i); + end else begin + x[i+1] <= x[i] - (y[i]>>>i); + y[i+1] <= y[i] + (x[i]>>>i); + z[i+1] <= z[i] - tanangle(i); + end + end + end +end +always @ (posedge clk) begin + data_in_buff[i+1] <= data_in_buff[i]; +end +end +endgenerate + +generate if (CORDIC_STYLE == "ROTATE") begin : IQ_Gen +reg [PH_BITS - 1 : 0] Phase_input = 0; +if (PHASE_ACC == "ON") begin + reg [PH_BITS - 1 : 0] addr_r0 = 0; + always @(posedge clk) begin + addr_r0 <= addr_r0 + phase_in; + end + always @(posedge clk) begin + Phase_input <= addr_r0; + end +end +else if (PHASE_ACC == "OFF") begin + always @(posedge clk) begin + Phase_input <= phase_in; + end +end +always @(posedge clk) begin + if(valid_in & (~RST)) begin + x[0] <= K_COS; + y[0] <= 0; + z[0] <= Phase_input[PH_BITS - 3 : 0]; + data_in_buff[0] <= Phase_input[PH_BITS - 1 : PH_BITS - 2]; + end + else begin + x[0] <= 0; + y[0] <= 0; + z[0] <= 0; + data_in_buff[0] <= 0; + end +end +reg signed [XY_BITS-1:0] cos = 0; +reg signed [XY_BITS-1:0] sin = 0; +always @ (posedge clk) begin + case(data_in_buff[ITERATIONS]) + 2'b00:begin //if the phase is in first quadrant,the sin(X)=sin(A),cos(X)=cos(A) + cos <= x[ITERATIONS]; + sin <= y[ITERATIONS]; + end + 2'b01:begin //if the phase is in second quadrant,the sin(X)=sin(A+90)=cosA,cos(X)=cos(A+90)=-sinA + cos <= ~(y[ITERATIONS]) + 1'b1;//-sin + sin <= x[ITERATIONS];//cos + end + 2'b10:begin //if the phase is in third quadrant,the sin(X)=sin(A+180)=-sinA,cos(X)=cos(A+180)=-cosA + cos <= ~(x[ITERATIONS]) + 1'b1;//-cos + sin <= ~(y[ITERATIONS]) + 1'b1;//-sin + end + 2'b11:begin //if the phase is in forth quadrant,the sin(X)=sin(A+270)=-cosA,cos(X)=cos(A+270)=sinA + cos <= y[ITERATIONS];//sin + sin <= ~(x[ITERATIONS]) + 1'b1;//-cos + end + endcase +end +assign x_o = cos; +assign y_o = sin; +assign phase_out = z[ITERATIONS]; +end +endgenerate + +generate if (CORDIC_STYLE == "VECTOR") begin : Demodule_Gen +localparam signed [PH_BITS-1:0] PHASE_COE = (2**(PH_BITS-2)) - 1; +//localparam MODUIUS_COE = ; +always @(posedge clk) begin + if(valid_in & (~RST)) begin + case ({x_i[XY_BITS-1],y_i[XY_BITS-1]}) + 2'b00 : begin x[0] <= {x_i[XY_BITS-1],x_i[XY_BITS-1:1]}; + y[0] <= {y_i[XY_BITS-1],y_i[XY_BITS-1:1]}; end + 2'b01 : begin x[0] <= {x_i[XY_BITS-1],x_i[XY_BITS-1:1]}; + y[0] <= {y_i[XY_BITS-1],y_i[XY_BITS-1:1]}; end + 2'b10 : begin x[0] <= {y_i[XY_BITS-1],y_i[XY_BITS-1:1]}; + y[0] <= -{x_i[XY_BITS-1],x_i[XY_BITS-1:1]}; end + 2'b11 : begin x[0] <= -{y_i[XY_BITS-1],y_i[XY_BITS-1:1]}; + y[0] <= {x_i[XY_BITS-1],x_i[XY_BITS-1:1]}; end + default : begin x[0] <= {x_i[XY_BITS-1],x_i[XY_BITS-1:1]}; + y[0] <= {y_i[XY_BITS-1],y_i[XY_BITS-1:1]}; end + endcase + z[0] <= phase_in; + data_in_buff[0] <= {x_i[XY_BITS-1],y_i[XY_BITS-1]}; + end + else begin + x[0] <= 0; + y[0] <= 0; + z[0] <= 0; + data_in_buff[0] <= 0; + end +end +reg [XY_BITS*2-1:0] Modulus = 0; +wire [XY_BITS*2-1:0] Modulus_buf; +reg signed [PH_BITS - 1:0] phase_r = 0; +always @ (posedge clk) begin + case(data_in_buff[ITERATIONS]) + 2'b00:begin phase_r <= $signed(z[ITERATIONS]); end + 2'b01:begin phase_r <= $signed(z[ITERATIONS]); end + 2'b10:begin phase_r <= $signed(z[ITERATIONS]) + $signed(PHASE_COE); end + 2'b11:begin phase_r <= $signed(z[ITERATIONS]) - $signed(PHASE_COE); end + endcase + Modulus[XY_BITS:0] <= x[ITERATIONS]; +end +assign Modulus_buf = (Modulus * 32'd39797)>>15; +assign x_o = Modulus_buf[XY_BITS-1:0]; +assign y_o = y[ITERATIONS]; +assign phase_out = phase_r; +end +endgenerate + +reg [ITERATIONS+1:0] v = 0; +always @ (posedge clk) begin + if (RST) + v <= 0; + else begin + v <= v << 1; + v[0] <= valid_in; + end +end +assign valid_out = v[ITERATIONS+1]; + +endmodule diff --git a/user/Hardware/src/clkdiv.v b/user/Hardware/src/clkdiv.v new file mode 100644 index 0000000..05a47c1 --- /dev/null +++ b/user/Hardware/src/clkdiv.v @@ -0,0 +1,29 @@ +module clkdiv( + input clk50, + input rst_n, + output reg clkout +); + reg [15:0] cnt; + always @(posedge clk50 or negedge rst_n) + begin + if(!rst_n) + begin + cnt <= 16'b0; + clkout <= 1'b0; + end + else if(cnt == 16'd162) + begin + clkout <= 1'b1; + cnt <= cnt + 16'd1; + end + else if(cnt == 16'd325) + begin + clkout <= 1'b0; + cnt <= 16'd0; + end + else + begin + cnt <= cnt + 16'd1; + end + end +endmodule \ No newline at end of file diff --git a/user/Hardware/src/fsm_test.v b/user/Hardware/src/fsm_test.v new file mode 100644 index 0000000..95b2134 --- /dev/null +++ b/user/Hardware/src/fsm_test.v @@ -0,0 +1,58 @@ +module fsm_test( + input clock, + input reset, + input [2 : 0] req_0, + input [2 : 0] req_1, + output reg [2 : 0] gnt_0, + output reg [2 : 0] gnt_1 + ); + + reg [2:0] state; + + parameter IDLE = 3'h1; + parameter GNT0 = 3'd2; + parameter GNT1 = 3'b100; + + always @ (posedge clock) begin : FSM + if (reset == 1'b1) begin + state <= #1 IDLE; + gnt_0 <= 0; + gnt_1 <= 0; + end + else + case(state) + IDLE : + if (req_0 == 1'b1) begin + state <= #1 GNT0; + gnt_0 <= 1; + end + else if (req_1 == 1'b1) begin + gnt_1 <= 1; + state <= #1 GNT1; + end + else begin + state <= #1 IDLE; //example comment + end + GNT0 : + if (req_0 == 1'b1) begin + state <= #1 GNT0; + end + else begin + gnt_0 <= 0; + state <= #1 IDLE; + end + GNT1 : + if (req_1 == 1'b1) begin + state <= #1 GNT1; + end + else begin + gnt_1 <= 0; + state <= #1 IDLE; + end + default : + state <= #1 IDLE; + endcase + end + + +endmodule //module_name diff --git a/user/Hardware/src/hello.v b/user/Hardware/src/hello.v new file mode 100644 index 0000000..015ee6b --- /dev/null +++ b/user/Hardware/src/hello.v @@ -0,0 +1,33 @@ +// VHDL code for a 2-to-1 multiplexer + +module mux2to1( + input wire a, + input wire b, + input wire sel, + output wire outp + ); + + // outports wire +wire [XY_BITS-1:0] x_o; +wire [XY_BITS-1:0] y_o; +wire [PH_BITS-1:0] phase_out; +wire valid_out; + +Cordic u_Cordic( + .clk ( clk ), + .RST ( RST ), + .x_i ( x_i ), + .y_i ( y_i ), + .phase_in ( phase_in ), + .x_o ( x_o ), + .y_o ( y_o ), + .phase_out ( phase_out ), + .valid_in ( valid_in ), + .valid_out ( valid_out ) +); + + + + assign outp = sel == 1'b0 ? a : b; + +endmodule diff --git a/user/Hardware/src/hello.vhd b/user/Hardware/src/hello.vhd new file mode 100644 index 0000000..f40f549 --- /dev/null +++ b/user/Hardware/src/hello.vhd @@ -0,0 +1,14 @@ +-- VHDL code for a 2-to-1 multiplexer +library IEEE; +use IEEE.std_logic_1164.all; + +entity mux2to1 is + port(a, b : in std_logic; + sel : in std_logic; + outp : out std_logic); +end mux2to1; + +architecture behavioral of mux2to1 is +begin + outp <= a when sel = '0' else b; +end behavioral; \ No newline at end of file diff --git a/user/Hardware/src/mult_module.v b/user/Hardware/src/mult_module.v new file mode 100644 index 0000000..d202dd5 --- /dev/null +++ b/user/Hardware/src/mult_module.v @@ -0,0 +1,80 @@ +// template +module template #( + parameter INPUT_WIDTH = 12, + parameter OUTPUT_WIDTH = 12 + )( + input [INPUT_WIDTH + - 1 : 0]data_in, + output reg clk_in = (INPUT_WIDTH - + OUTPUT_WIDTH) , + clk=9'hd0, + input rst_n, RST, + output [OUTPUT_WIDTH - 1 : 0] data_out + ); + +endmodule //template + + +module test # ( + parameter INPUT_WIDTH = 12, + parameter OUTPUT_WIDTH = 12 + )( + input clk_in, + input rst_n, + input [INPUT_WIDTH - 1 : 0] data_in , + input [3:2] dasta_ff, + + output reg signed [OUTPUT_WIDTH - 1 : 0] data_out, + output reg signed [OUTPUT_WIDTH - 1 : 0] data_ff + ); + + wire valid_out; + + Cordic #( + .XY_BITS ( 12 ), + .PH_BITS ( 32 ), + .ITERATIONS ( 32 ), + .CORDIC_STYLE ( "ROTATE" ), + .PHASE_ACC ( "ON" )) + u_Cordic( + //input + .clk_in ( clk_in ), + .RST ( RST ), + .x_i ( x_i ), + .y_i ( y_i ), + .phase_in ( phase_in ), + .valid_in ( valid_in ), + + //output + .x_o ( x_o ), + .y_o ( y_o ), + .phase_out ( phase_out ), + .valid_out ( valid_out ) + + //inout + ); + + wire [3 : 0] count_high; + wire [3 : 0] count_low; + wire over; + + template u_template( + //input + .clk ( clk ), + .data ( data ), + .en ( en ), + .load ( load ), + .rst ( rst ), + .switch ( switch ), + + //output + .count_high ( count_high ), + .count_low ( count_low ), + .over ( over ) + + //inout + ); + + + +endmodule //test diff --git a/user/Hardware/src/netlist_test.v b/user/Hardware/src/netlist_test.v new file mode 100644 index 0000000..ea8dc7d --- /dev/null +++ b/user/Hardware/src/netlist_test.v @@ -0,0 +1,34 @@ +// borrowed with some modifications from +// http://www.ee.ed.ac.uk/~gerard/Teach/Verilog/manual/Example/lrgeEx2/cooley.html +module up3down5(clock, data_in, up, down, carry_out, borrow_out, count_out, parity_out); + +input [8:0] data_in; +input clock, up, down; + +output reg [8:0] count_out; +output reg carry_out, borrow_out, parity_out; + +reg [9:0] cnt_up, cnt_dn; +reg [8:0] count_nxt; + + +always @(posedge clock) +begin + cnt_dn = count_out - 3'b 101; + cnt_up = count_out + 2'b 11; + + case ({up,down}) + 2'b 00 : count_nxt = data_in; + 2'b 01 : count_nxt = cnt_dn; + 2'b 10 : count_nxt = cnt_up; + 2'b 11 : count_nxt = count_out; + default : count_nxt = 9'bX; + endcase + + parity_out <= ^count_nxt; + carry_out <= up & cnt_up[9]; + borrow_out <= down & cnt_dn[9]; + count_out <= count_nxt; +end + +endmodule \ No newline at end of file diff --git a/vhdl/Scientific.vhd b/vhdl/Scientific.vhd new file mode 100644 index 0000000..3d6655a --- /dev/null +++ b/vhdl/Scientific.vhd @@ -0,0 +1,15 @@ +library IEEE; +use IEEE.std_logic_1164.all; + +entity Scientific is + generic ( + exp1: integer := 25e6; + exp2: integer := 25E6; + exp3: real := 25.0e6; + exp4: real := 50.0e+3; + exp5: real := 50.0e-3 + ); + port( + clk : in std_logic + ); +end Scientific; diff --git a/vhdl/based.vhd b/vhdl/based.vhd new file mode 100644 index 0000000..7c7c1e2 --- /dev/null +++ b/vhdl/based.vhd @@ -0,0 +1,16 @@ +library IEEE; +use IEEE.std_logic_1164.all; + +entity based is port (sysclk : in std_logic); +end based; +architecture rtl of based is + signal foo, foo1, foo2, foo8, foo10, foo11, foo16 : integer; +begin + foo <= 123; + foo1 <= 123_456; + foo2 <= 2#00101101110111#; + foo8 <= 8#0177362#; + foo10 <= 10#01234#; + --foo11<= 11#01234#; + foo16 <= 16#12af#; +end rtl; \ No newline at end of file diff --git a/vhdl/bigfile.vhd b/vhdl/bigfile.vhd new file mode 100644 index 0000000..5897f16 --- /dev/null +++ b/vhdl/bigfile.vhd @@ -0,0 +1,467 @@ +library IEEE; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +-- CONNECTIVITY DEFINITION +entity bigfile is + port ( + -- from external pins + sysclk : in std_logic; + g_zaq_in : in std_logic_vector(31 downto 0); + g_aux : in std_logic_vector(31 downto 0); + scanb : in std_logic; + g_wrb : in std_logic; + g_rdb : in std_logic; + g_noop_clr : in std_logic_vector(31 downto 0); + swe_ed : in std_logic; + swe_lv : in std_logic; + din : in std_logic_vector(63 downto 0); + g_dout_w0x0f : in std_logic_vector(4 downto 0); + n9_bit_write : in std_logic; + -- from reset_gen block + reset : in std_logic; + alu_u : in std_logic_vector(31 downto 0); + debct_ping : in std_logic; + g_sys_in : out std_logic_vector(31 downto 0); + g_zaq_in_rst_hold : out std_logic_vector(31 downto 0); + g_zaq_hhh_enb : out std_logic_vector(31 downto 0); + g_zaq_out : out std_logic_vector(31 downto 0); + g_dout : out std_logic_vector(31 downto 0); + g_zaq_ctl : out std_logic_vector(31 downto 0); + g_zaq_qaz_hb : out std_logic_vector(31 downto 0); + g_zaq_qaz_lb : out std_logic_vector(31 downto 0); + gwerth : out std_logic_vector(31 downto 0); + g_noop : out std_logic_vector(31 downto 0); + g_vector : out std_logic_vector(8*32-1 downto 0); + swe_qaz1 : out std_logic_vector(31 downto 0) + ); +end bigfile; + + +-- IMPLEMENTATION +architecture rtl of bigfile is + + -- constants + constant g_t_klim_w0x0f : std_logic_vector(4 downto 0) := "00000"; + constant g_t_u_w0x0f : std_logic_vector(4 downto 0) := "00001"; + constant g_t_l_w0x0f : std_logic_vector(4 downto 0) := "00010"; + constant g_t_hhh_l_w0x0f : std_logic_vector(4 downto 0) := "00011"; + constant g_t_jkl_sink_l_w0x0f : std_logic_vector(4 downto 0) := "00100"; + constant g_secondary_t_l_w0x0f : std_logic_vector(4 downto 0) := "00101"; + constant g_style_c_l_w0x0f : std_logic_vector(4 downto 0) := "00110"; + constant g_e_z_w0x0f : std_logic_vector(4 downto 0) := "00111"; + constant g_n_both_qbars_l_w0x0f : std_logic_vector(4 downto 0) := "01000"; + constant g_style_vfr_w0x0f : std_logic_vector(4 downto 0) := "01001"; + constant g_style_klim_w0x0f : std_logic_vector(4 downto 0) := "01010"; + constant g_unklimed_style_vfr_w0x0f : std_logic_vector(4 downto 0) := "01011"; + constant g_style_t_y_w0x0f : std_logic_vector(4 downto 0) := "01100"; + constant g_n_l_w0x0f : std_logic_vector(4 downto 0) := "01101"; + constant g_n_vfr_w0x0f : std_logic_vector(4 downto 0) := "01110"; + constant g_e_n_r_w0x0f : std_logic_vector(4 downto 0) := "01111"; + constant g_n_r_bne_w0x0f : std_logic_vector(4 downto 0) := "10000"; + constant g_n_div_rebeq_w0x0f : std_logic_vector(4 downto 0) := "10001"; + constant g_alu_l_w0x0f : std_logic_vector(4 downto 0) := "10010"; + constant g_t_qaz_mult_low_w0x0f : std_logic_vector(4 downto 0) := "10011"; + constant g_t_qaz_mult_high_w0x0f : std_logic_vector(4 downto 0) := "10100"; + constant gwerthernal_style_u_w0x0f : std_logic_vector(4 downto 0) := "10101"; + constant gwerthernal_style_l_w0x0f : std_logic_vector(4 downto 0) := "10110"; + constant g_style_main_reset_hold_w0x0f : std_logic_vector(4 downto 0) := "10111"; + + -- comment + signal g_t_klim_dout : std_logic_vector(31 downto 0); + signal g_t_u_dout : std_logic_vector(31 downto 0); + signal g_t_l_dout : std_logic_vector(31 downto 0); + signal g_t_hhh_l_dout : std_logic_vector(31 downto 0); + signal g_t_jkl_sink_l_dout : std_logic_vector(31 downto 0); + signal g_secondary_t_l_dout : std_logic_vector(31 downto 0); + signal g_style_c_l_dout : std_logic_vector(3 downto 0); -- not used + signal g_e_z_dout : std_logic_vector(31 downto 0); + signal g_n_both_qbars_l_dout : std_logic_vector(31 downto 0); + signal g_style_vfr_dout : std_logic_vector(31 downto 0); + signal g_style_klim_dout : std_logic_vector(31 downto 0); + signal g_unklimed_style_vfr_dout : std_logic_vector(31 downto 0); + signal g_style_t_y_dout : std_logic_vector(31 downto 0); + signal g_n_l_dout : std_logic_vector(31 downto 0); + signal g_n_vfr_dout : std_logic_vector(31 downto 0); + signal g_e_n_r_dout : std_logic_vector(31 downto 0); + signal g_n_r_bne_dout : std_logic; + signal g_n_div_rebeq_dout : std_logic_vector(31 downto 0); + signal g_alu_l_dout : std_logic_vector(31 downto 0); + signal g_t_qaz_mult_low_dout : std_logic_vector(31 downto 0); + signal g_t_qaz_mult_high_dout : std_logic_vector(31 downto 0); + signal gwerthernal_style_u_dout : std_logic_vector(31 downto 0); + signal gwerthernal_style_l_dout : std_logic_vector(31 downto 0); + signal g_style_main_reset_hold_dout : std_logic_vector(31 downto 0); + + -- other + signal q_g_zaq_in : std_logic_vector(31 downto 0); + signal q2_g_zaq_in : std_logic_vector(31 downto 0); + signal q3_g_zaq_in : std_logic_vector(31 downto 0); + signal q_g_zaq_in_cd : std_logic_vector(3 downto 0); + signal q_g_style_vfr_dout : std_logic_vector(31 downto 0); + signal q_g_unzq : std_logic_vector(3 downto 0); + signal g_n_active : std_logic_vector(31 downto 0); + + -- inter + signal g_zaq_in_y : std_logic_vector(31 downto 0); + signal g_zaq_in_y_no_dout : std_logic_vector(31 downto 0); + signal g_zaq_out_i : std_logic_vector(31 downto 0); + signal g_zaq_ctl_i : std_logic_vector(31 downto 0); + signal g_sys_in_i : std_logic_vector(31 downto 0); + signal g_sys_in_ii : std_logic_vector(31 downto 0); + signal g_dout_i : std_logic_vector(31 downto 0); + +begin + + -- qaz out + g_zaq_out_i <= + -- if secondary + (g_secondary_t_l_dout and (g_aux xor g_style_t_y_dout)) or + -- if alu + (g_alu_l_dout and alu_u and not g_secondary_t_l_dout) or + -- otherwise + (not g_alu_l_dout and not g_secondary_t_l_dout and g_t_u_dout); + -- Changed + g_zaq_out <= g_zaq_out_i and not g_t_jkl_sink_l_dout; + + -- qaz + -- JLB + g_zaq_ctl_i <= not((g_t_l_dout and not g_t_jkl_sink_l_dout) or + (g_t_l_dout and g_t_jkl_sink_l_dout and not g_zaq_out_i)); + -- mux + --vnavigatoroff + g_zaq_ctl <= g_zaq_ctl_i when scanb = '1' else "00000000000000000000000000000000"; + --vnavigatoron + + g_zaq_hhh_enb <= not(g_t_hhh_l_dout); + + g_zaq_qaz_hb <= g_t_qaz_mult_high_dout; + g_zaq_qaz_lb <= g_t_qaz_mult_low_dout; + + + -- Dout + g_dout_i <= g_t_klim_dout and g_style_klim_dout when g_dout_w0x0f = g_t_klim_w0x0f else + g_t_u_dout and g_style_klim_dout when g_dout_w0x0f = g_t_u_w0x0f else + g_t_l_dout and g_style_klim_dout when g_dout_w0x0f = g_t_l_w0x0f else + g_t_hhh_l_dout and g_style_klim_dout when g_dout_w0x0f = g_t_hhh_l_w0x0f else + g_t_jkl_sink_l_dout and g_style_klim_dout when g_dout_w0x0f = g_t_jkl_sink_l_w0x0f else + g_secondary_t_l_dout and g_style_klim_dout when g_dout_w0x0f = g_secondary_t_l_w0x0f else + ("0000000000000000000000000000" & g_style_c_l_dout) and g_style_klim_dout when g_dout_w0x0f = g_style_c_l_w0x0f else + g_e_z_dout when g_dout_w0x0f = g_e_z_w0x0f else + g_n_both_qbars_l_dout when g_dout_w0x0f = g_n_both_qbars_l_w0x0f else + g_style_vfr_dout and g_style_klim_dout when g_dout_w0x0f = g_style_vfr_w0x0f else + g_style_klim_dout when g_dout_w0x0f = g_style_klim_w0x0f else + g_unklimed_style_vfr_dout when g_dout_w0x0f = g_unklimed_style_vfr_w0x0f else + g_style_t_y_dout and g_style_klim_dout when g_dout_w0x0f = g_style_t_y_w0x0f else + g_n_l_dout when g_dout_w0x0f = g_n_l_w0x0f else + g_n_vfr_dout when g_dout_w0x0f = g_n_vfr_w0x0f else + g_e_n_r_dout when g_dout_w0x0f = g_e_n_r_w0x0f else + ("0000000000000000000000000000000" & g_n_r_bne_dout) when g_dout_w0x0f = g_n_r_bne_w0x0f else + g_n_div_rebeq_dout when g_dout_w0x0f = g_n_div_rebeq_w0x0f else + g_alu_l_dout and g_style_klim_dout when g_dout_w0x0f = g_alu_l_w0x0f else + g_t_qaz_mult_low_dout and g_style_klim_dout when g_dout_w0x0f = g_t_qaz_mult_low_w0x0f else + g_t_qaz_mult_high_dout and g_style_klim_dout when g_dout_w0x0f = g_t_qaz_mult_high_w0x0f else + gwerthernal_style_u_dout and g_style_klim_dout when g_dout_w0x0f = gwerthernal_style_u_w0x0f else + g_style_main_reset_hold_dout and g_style_klim_dout when g_dout_w0x0f = g_style_main_reset_hold_w0x0f else + gwerthernal_style_l_dout and g_style_klim_dout when g_dout_w0x0f = gwerthernal_style_l_w0x0f else + "00000000000000000000000000000000"; + g_dout <= g_dout_i when g_rdb = '0' else (others => '1'); + + + -- this can be used to use zzz1 + g_style_main_reset_hold_dout_proc : + process(sysclk) + begin + if( sysclk'event and sysclk = '1' ) then + if( scanb = '1' ) then + if( reset = '1' ) then + g_style_main_reset_hold_dout <= g_zaq_in; + end if; + --vnavigatoroff + else + g_style_main_reset_hold_dout <= q2_g_zaq_in; + end if; + --vnavigatoron + end if; + end process; + -- qaz + g_zaq_in_rst_hold <= g_style_main_reset_hold_dout; + + -- Din + g_doutister_proc : + process(reset, sysclk) + variable g_dout_w0x0f_v : std_logic_vector(4 downto 0); + variable i : integer; + variable j : integer; + begin + if( reset /= '0' ) then + g_t_klim_dout <= (others => '0'); + g_t_u_dout <= (others => '0'); + g_t_l_dout <= (others => '0'); + g_t_hhh_l_dout <= (others => '0'); + g_t_jkl_sink_l_dout <= (others => '0'); + g_secondary_t_l_dout <= (others => '0'); + g_style_c_l_dout <= (others => '0'); + g_e_z_dout <= (others => '0'); + g_n_both_qbars_l_dout <= (others => '0'); + g_style_klim_dout <= (others => '0'); + g_style_t_y_dout <= (others => '0'); + g_n_l_dout <= (others => '0'); + g_e_n_r_dout <= (others => '0'); + g_n_r_bne_dout <= '0'; + g_n_div_rebeq_dout <= (others => '1'); + g_alu_l_dout <= (others => '0'); + g_t_qaz_mult_low_dout <= (others => '1'); -- NOTE Low + g_t_qaz_mult_high_dout <= (others => '0'); + gwerthernal_style_u_dout <= (others => '0'); + gwerthernal_style_l_dout <= (others => '0'); + elsif( sysclk'event and sysclk = '1' ) then + -- clear + g_n_div_rebeq_dout <= g_n_div_rebeq_dout and not g_noop_clr; + if( g_wrb = '0' ) then + -- because we now... + for i in 0 to 1 loop + if( i = 0 ) then + g_dout_w0x0f_v := g_dout_w0x0f; + elsif( i = 1 ) then + if( n9_bit_write = '1' ) then + -- set + g_dout_w0x0f_v := g_dout_w0x0f(4 downto 1) & '1'; + end if; + --vnavigatoroff + else + -- not possible but added for code coverage's sake + end if; + --vnavigatoron + case g_dout_w0x0f_v is + when g_t_klim_w0x0f => g_t_klim_dout <= din(i*32+31 downto i*32); + when g_t_u_w0x0f => + -- output klim + for j in 0 to 31 loop + if( (g_t_klim_dout(j) = '0' and n9_bit_write = '0') or ( din(j) = '0' and n9_bit_write = '1')) then + g_t_u_dout(j) <= din(32*i+j); + end if; + end loop; + when g_t_l_w0x0f => g_t_l_dout <= din(i*32+31 downto i*32); + when g_t_hhh_l_w0x0f => g_t_hhh_l_dout <= din(i*32+31 downto i*32); + when g_t_jkl_sink_l_w0x0f => g_t_jkl_sink_l_dout <= din(i*32+31 downto i*32); + when g_secondary_t_l_w0x0f => g_secondary_t_l_dout <= din(i*32+31 downto i*32); + when g_style_c_l_w0x0f => g_style_c_l_dout(3 downto 0) <= din(3+i*32 downto i*32); + when g_e_z_w0x0f => g_e_z_dout <= din(i*32+31 downto i*32); + when g_n_both_qbars_l_w0x0f => g_n_both_qbars_l_dout <= din(i*32+31 downto i*32); + when g_style_vfr_w0x0f => null; -- read-only register + when g_style_klim_w0x0f => g_style_klim_dout <= din(i*32+31 downto i*32); + when g_unklimed_style_vfr_w0x0f => null; -- read-only register + when g_style_t_y_w0x0f => g_style_t_y_dout <= din(i*32+31 downto i*32); + when g_n_l_w0x0f => g_n_l_dout <= din(i*32+31 downto i*32); + when g_n_vfr_w0x0f => null; -- writes + when g_e_n_r_w0x0f => g_e_n_r_dout <= din(i*32+31 downto i*32); + when g_n_r_bne_w0x0f => g_n_r_bne_dout <= din(i*32); + when g_n_div_rebeq_w0x0f => g_n_div_rebeq_dout <= din(i*32+31 downto i*32) or + g_n_div_rebeq_dout; -- a '1' writes + when g_alu_l_w0x0f => g_alu_l_dout <= din(i*32+31 downto i*32); + when g_t_qaz_mult_low_w0x0f => g_t_qaz_mult_low_dout <= din(i*32+31 downto i*32); + when g_t_qaz_mult_high_w0x0f => g_t_qaz_mult_high_dout <= din(i*32+31 downto i*32); + when gwerthernal_style_u_w0x0f => gwerthernal_style_u_dout <= din(i*32+31 downto i*32); + when gwerthernal_style_l_w0x0f => gwerthernal_style_l_dout <= din(i*32+31 downto i*32); + --vnavigatoroff + when others => null; + --vnavigatoron + end case; + end loop; + + end if; + end if; + end process; + + -- sample + g_zaq_in_sample_proc : + process(reset, sysclk) + begin + if( reset /= '0' ) then + q_g_zaq_in <= (others => '0'); + q2_g_zaq_in <= (others => '0'); + q3_g_zaq_in <= (others => '0'); + elsif( sysclk'event and sysclk = '1' ) then + q_g_zaq_in <= g_zaq_in; + q2_g_zaq_in <= q_g_zaq_in; + q3_g_zaq_in <= g_zaq_in_y; + end if; + end process; + + -- vfr register + g_unklimed_style_vfr_dout <= q2_g_zaq_in; + + -- switch + g_zaq_in_y <= g_style_t_y_dout xor q2_g_zaq_in; + + -- qaz + g_style_vfr_dout <= -- top 2 + (g_zaq_in_y(31 downto 4) & + -- FSM + (( g_style_c_l_dout(3 downto 0) and q_g_zaq_in_cd) or + -- otherwise just use + (not g_style_c_l_dout(3 downto 0) and g_zaq_in_y(3 downto 0)))); + + -- in scan mode + g_zaq_in_y_no_dout <= (g_style_t_y_dout xor g_zaq_in) when scanb = '1' + --vnavigatoroff + else g_style_t_y_dout; + --vnavigatoron + + g_sys_in_i <= (-- top 28 + (g_zaq_in_y_no_dout(31 downto 4) & + -- is enabled + (( g_style_c_l_dout(3 downto 0) and q_g_zaq_in_cd) or + -- otherwise just use + (not g_style_c_l_dout(3 downto 0) and g_zaq_in_y_no_dout(3 downto 0))))); + + g_sys_in_ii <= (g_sys_in_i and not gwerthernal_style_l_dout) or (gwerthernal_style_u_dout and gwerthernal_style_l_dout ); + + g_sys_in <= g_sys_in_ii; + + lpq_proc : + process(reset, sysclk) + variable i : integer; + begin + if( reset /= '0' ) then + q_g_zaq_in_cd <= (others => '0'); + q_g_unzq <= (others => '1'); + elsif( sysclk'event and sysclk = '1' ) then + -- sample + if( debct_ping = '1') then + -- taken + for i in 0 to 3 loop + if( g_zaq_in_y(i) /= q3_g_zaq_in(i) ) then + q_g_unzq(i) <= '1'; + else + if( q_g_unzq(i) = '0' ) then + q_g_zaq_in_cd(i) <= g_zaq_in_y(i); + else + q_g_unzq(i) <= '0'; + end if; + end if; + end loop; + else + for i in 0 to 3 loop + if( g_zaq_in_y(i) /= q3_g_zaq_in(i) ) then + q_g_unzq(i) <= '1'; + end if; + end loop; + end if; + end if; + end process; + + -- generate lqqs + sample_forwerth_proc : + process(reset, sysclk) + begin + if( reset /= '0' ) then + q_g_style_vfr_dout <= (others => '0'); + elsif( sysclk'event and sysclk = '1' ) then + if( scanb = '1' ) then + q_g_style_vfr_dout <= g_style_vfr_dout; + --vnavigatoroff + else + -- in scan + q_g_style_vfr_dout <= g_style_vfr_dout or (g_zaq_out_i(31 downto 17) & "0" & g_zaq_out_i(15 downto 1) & "0") or g_zaq_ctl_i or g_sys_in_ii; + end if; + --vnavigatoron + end if; + end process; + + -- generate + g_n_active <= -- 1 to 0 + (((q_g_style_vfr_dout and not g_style_vfr_dout) or + -- get this + (not q_g_style_vfr_dout and g_style_vfr_dout and + g_n_both_qbars_l_dout))) and + -- must be + g_n_l_dout; + + -- check for lqq active and set lqq vfr register + -- also clear + n_proc : + process(reset, sysclk) + variable i : integer; + begin + if( reset /= '0' ) then + g_n_vfr_dout <= (others => '0'); + gwerth <= (others => '0'); + elsif( sysclk'event and sysclk = '1' ) then + for i in 0 to 31 loop + -- lqq + -- vfr matches + if( g_n_active(i) = '1' ) then + gwerth(i) <= '1'; + if( g_e_z_dout(i) = '1' ) then + -- lqq + g_n_vfr_dout(i) <= '1'; + else + g_n_vfr_dout(i) <= q_g_style_vfr_dout(i); + end if; + else + -- clear + if( g_e_z_dout(i) = '0' ) then + g_n_vfr_dout(i) <= q_g_style_vfr_dout(i); -- default always assign + -- in both + if( g_n_both_qbars_l_dout(i) = '1' or g_style_vfr_dout(i) = '1') then + gwerth(i) <= '0'; + end if; + else + -- write + if( g_wrb = '0' and g_dout_w0x0f = g_n_vfr_w0x0f and din(i) = '1' ) then + gwerth(i) <= '0'; + g_n_vfr_dout(i) <= '0'; + end if; + end if; + end if; + end loop; + end if; + end process; + + ---- + -- Create the Lqq + createwerth_vec_proc : + process( g_n_r_bne_dout, g_e_n_r_dout) + variable imod8, idiv8 : integer; + variable i : integer; + begin + for i in 0 to 31 loop + imod8 := i mod 8; + idiv8 := i / 8; + + if( g_n_r_bne_dout = '0' ) then + -- non-unique + g_vector(8*i+7 downto 8*i) <= g_e_n_r_dout(8*idiv8+7 downto 8*idiv8); + else + -- unique + if( imod8 = 0 ) then + g_vector(8*i+7 downto 8*i) <= g_e_n_r_dout(8*idiv8+7 downto 8*idiv8); + else + g_vector(8*i+7 downto 8*i) <= std_logic_vector( unsigned(g_e_n_r_dout(8*idiv8+7 downto 8*idiv8)) + + to_unsigned(imod8, 8)); + end if; + end if; + end loop; + end process; + + ---- + -- Qaz + g_noop <= g_n_div_rebeq_dout; + + + create_g_ack_bne_proc : + process( swe_ed,swe_lv,g_e_z_dout) + variable i : integer; + begin + for i in 0 to 31 loop + if( g_e_z_dout(i) = '1') then + swe_qaz1(i) <= swe_ed; + else + swe_qaz1(i) <= swe_lv; + end if; + end loop; + end process; + +end rtl; diff --git a/vhdl/clk.vhd b/vhdl/clk.vhd new file mode 100644 index 0000000..541c7cd --- /dev/null +++ b/vhdl/clk.vhd @@ -0,0 +1,36 @@ +LIBRARY IEEE; +USE IEEE.std_logic_1164.all; +entity clk is port( reset, preset, qreset, sysclk, dsysclk, esysclk : in std_logic; + ival : in std_logic_vector(31 downto 0) + ); +end clk; +architecture rtl of clk is + signal foo : std_logic_vector(10+3 downto 0); + signal baz : std_logic_vector(2 downto 0); + signal egg : std_logic_vector(4 to 7-1); +begin + pfoo: process(reset, sysclk) + begin + if( reset /= '0' ) then + foo <= (others => '1'); + elsif( sysclk'event and sysclk = '1' ) then + foo <= ival(31 downto 31-(10+3)); + end if; + end process; + pbaz: process(preset, dsysclk) + begin + if( preset /= '1' ) then + baz <= (others => '0'); + elsif( dsysclk'event and dsysclk = '0' ) then + baz <= ival(2 downto 0); + end if; + end process; + pegg: process(qreset, esysclk) + begin + if( qreset /= '1' ) then + egg <= (others => '0'); + elsif( esysclk'event and esysclk = '0' ) then + egg <= ival(6 downto 4); + end if; + end process; +end rtl; diff --git a/vhdl/counters.vhd b/vhdl/counters.vhd new file mode 100644 index 0000000..77f7bbb --- /dev/null +++ b/vhdl/counters.vhd @@ -0,0 +1,344 @@ +library IEEE; + +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity counters is + port( + sysclk : in std_logic; + foo_card : in std_logic; + wfoo0_baz : in std_logic; + wfoo0_blrb : in std_logic; + wfoo0_zz1pb : in std_logic; + wfoo0_turn : in std_logic_vector(31 downto 0); + debct_baz : in std_logic; + debct_blrb : in std_logic; + debct_zz1pb : in std_logic; + debct_bar : in std_logic; + debct_turn : in std_logic_vector(31 downto 0); + Z0_bar : in std_logic; + Z0_baz : in std_logic; + Z0_blrb : in std_logic; + Z0_zz1pb : in std_logic; + Z0_turn : in std_logic_vector(31 downto 0); + Y1_bar : in std_logic; + Y1_baz : in std_logic; + Y1_blrb : in std_logic; + Y1_zz1pb : in std_logic; + Y1_turn : in std_logic_vector(31 downto 0); + X2_bar : in std_logic; + X2_baz : in std_logic; + X2_blrb : in std_logic; + X2_zz1pb : in std_logic; + X2_turn : in std_logic_vector(31 downto 0); + W3_bar : in std_logic; + W3_baz : in std_logic; + W3_blrb : in std_logic; + W3_zz1pb : in std_logic; + W3_turn : in std_logic_vector(31 downto 0); + -- to engine block + Z0_cwm : out std_logic; + Z0 : out std_logic_vector(31 downto 0); + Y1_cwm : out std_logic; + Y1 : out std_logic_vector(31 downto 0); + X2_cwm : out std_logic; + X2 : out std_logic_vector(31 downto 0); + W3_cwm : out std_logic; + W3 : out std_logic_vector(31 downto 0); + wfoo0_cwm : out std_logic; + wfoo0_llwln : out std_logic_vector(31 downto 0); + debct_cwm : out std_logic; + debct_pull : out std_logic; + debct : out std_logic_vector(31 downto 0); + wdfilecardA2P : out std_logic + ); +end counters; + +architecture rtl of counters is + + signal wfoo0_llwln_var : unsigned(31 downto 0); + signal debct_var : unsigned(31 downto 0); + signal Z0_var : unsigned(31 downto 0); + signal Y1_var : unsigned(31 downto 0); + signal X2_var : unsigned(31 downto 0); + signal W3_var : unsigned(31 downto 0); + signal main_wfoo0_cwm : std_logic; + signal do_q3p_Z0 : std_logic; + signal do_q3p_Y1 : std_logic; + signal do_q3p_X2 : std_logic; + signal do_q3p_W3 : std_logic; + signal do_q3p_wfoo0 : std_logic; + signal do_q3p_debct : std_logic; + + signal Z0_cwm_i : std_logic; + signal Y1_cwm_i : std_logic; + signal X2_cwm_i : std_logic; + signal W3_cwm_i : std_logic; + signal debct_cwm_i : std_logic; + + signal file_card_i : std_logic; + signal do_file_card_i : std_logic; + signal prev_do_file_card : std_logic; + +begin + + ----- + -- form the outputs + wfoo0_llwln <= std_logic_vector(wfoo0_llwln_var); + debct <= std_logic_vector(debct_var); + Z0 <= std_logic_vector(Z0_var); + Y1 <= std_logic_vector(Y1_var); + X2 <= std_logic_vector(X2_var); + W3 <= std_logic_vector(W3_var); + Z0_cwm <= Z0_cwm_i; + Y1_cwm <= Y1_cwm_i; + X2_cwm <= X2_cwm_i; + W3_cwm <= W3_cwm_i; + debct_cwm <= debct_cwm_i; + + wdfilecardA2P <= do_file_card_i; + + LLWLNS : + process(foo_card, sysclk) + begin + if foo_card = '1' then + wfoo0_llwln_var <= (others => '0'); + debct_var <= (others => '0'); + Z0_var <= (others => '0'); + Y1_var <= (others => '0'); + X2_var <= (others => '0'); + W3_var <= (others => '0'); + + wfoo0_cwm <= '0'; + debct_cwm_i <= '0'; + debct_pull <= '0'; + Z0_cwm_i <= '0'; + Y1_cwm_i <= '0'; + X2_cwm_i <= '0'; + W3_cwm_i <= '0'; + main_wfoo0_cwm <= '0'; + file_card_i <= '0'; + + do_q3p_wfoo0 <= '0'; + do_file_card_i <= '0'; + prev_do_file_card <= '0'; + + do_q3p_Z0 <= '0'; + do_q3p_Y1 <= '0'; + do_q3p_X2 <= '0'; + do_q3p_W3 <= '0'; + do_q3p_debct <= '0'; + + else + if sysclk'event and sysclk = '1' then + + -- pull + debct_pull <= '0'; + do_file_card_i <= '0'; + + ---- + -- wfoo0 + + if wfoo0_baz = '1' then + wfoo0_llwln_var <= unsigned(wfoo0_turn); + main_wfoo0_cwm <= '0'; + if wfoo0_llwln_var = "00000000000000000000000000000000" then + do_q3p_wfoo0 <= '0'; + else + do_q3p_wfoo0 <= '1'; + end if; + else + if do_q3p_wfoo0 = '1' and wfoo0_blrb = '1' then + wfoo0_llwln_var <= wfoo0_llwln_var - 1; + if (wfoo0_llwln_var = "00000000000000000000000000000000") then + wfoo0_llwln_var <= unsigned(wfoo0_turn); + if main_wfoo0_cwm = '0' then + wfoo0_cwm <= '1'; + main_wfoo0_cwm <= '1'; + else + do_file_card_i <= '1'; + do_q3p_wfoo0 <= '0'; + end if; + end if; + end if; + end if; + + if wfoo0_zz1pb = '0' then + wfoo0_cwm <= '0'; + end if; + + if Z0_baz = '1' then -- counter Baz + Z0_var <= unsigned(Z0_turn); + if Z0_turn = "00000000000000000000000000000000" then + do_q3p_Z0 <= '0'; + else + do_q3p_Z0 <= '1'; + end if; + else + if do_q3p_Z0 = '1' and Z0_blrb = '1' then + if Z0_bar = '0' then + if Z0_cwm_i = '0' then + if do_q3p_Z0 = '1' then + Z0_var <= Z0_var - 1; + if (Z0_var = "00000000000000000000000000000001") then + Z0_cwm_i <= '1'; + do_q3p_Z0 <= '0'; + end if; + end if; + end if; + else + Z0_var <= Z0_var - 1; + if (Z0_var = "00000000000000000000000000000000") then + Z0_cwm_i <= '1'; + Z0_var <= unsigned(Z0_turn); + end if; + end if; -- Z0_bar + end if; + end if; -- Z0_blrb + + if Z0_zz1pb = '0' then + Z0_cwm_i <= '0'; + end if; + + if Y1_baz = '1' then -- counter Baz + Y1_var <= unsigned(Y1_turn); + if Y1_turn = "00000000000000000000000000000000" then + do_q3p_Y1 <= '0'; + else + do_q3p_Y1 <= '1'; + end if; + elsif do_q3p_Y1 = '1' and Y1_blrb = '1' then + if Y1_bar = '0' then + if Y1_cwm_i = '0' then + if do_q3p_Y1 = '1' then + Y1_var <= Y1_var - 1; + if (Y1_var = "00000000000000000000000000000001") then + Y1_cwm_i <= '1'; + do_q3p_Y1 <= '0'; + end if; + end if; + end if; + else + Y1_var <= Y1_var - 1; + + if (Y1_var = "00000000000000000000000000000000") then + Y1_cwm_i <= '1'; + Y1_var <= unsigned(Y1_turn); + end if; + end if; -- Y1_bar + + end if; -- Y1_blrb + + if Y1_zz1pb = '0' then + Y1_cwm_i <= '0'; + end if; + + if X2_baz = '1' then -- counter Baz + X2_var <= unsigned(X2_turn); + if X2_turn = "00000000000000000000000000000000" then + do_q3p_X2 <= '0'; + else + do_q3p_X2 <= '1'; + end if; + elsif do_q3p_X2 = '1' and X2_blrb = '1' then + if X2_bar = '0' then + if X2_cwm_i = '0' then + if do_q3p_X2 = '1' then + X2_var <= X2_var - 1; + if (X2_var = "00000000000000000000000000000001") then + X2_cwm_i <= '1'; + do_q3p_X2 <= '0'; + end if; + end if; + end if; + else + X2_var <= X2_var - 1; + + if (X2_var = "00000000000000000000000000000000") then --{ + X2_cwm_i <= '1'; + X2_var <= unsigned(X2_turn); + end if; + end if; --X2_bar + end if; -- X2_blrb + + if X2_zz1pb = '0' then + X2_cwm_i <= '0'; + end if; + + if W3_baz = '1' then -- counter Baz + W3_var <= unsigned(W3_turn); + if W3_turn = "00000000000000000000000000000000" then + do_q3p_W3 <= '0'; + else + do_q3p_W3 <= '1'; + end if; + elsif do_q3p_W3 = '1' and W3_blrb = '1' then + if W3_bar = '0' then + if W3_cwm_i = '0'then + if do_q3p_W3 = '1' then + W3_var <= W3_var - 1; + if (W3_var = "00000000000000000000000000000001") then + W3_cwm_i <= '1'; + do_q3p_W3 <= '0'; + end if; + end if; + end if; + else + W3_var <= W3_var - 1; + + if (W3_var = "00000000000000000000000000000000") then --{ + W3_cwm_i <= '1'; + W3_var <= unsigned(W3_turn); + end if; + end if; -- W3_bar + + end if; -- W3_blrb + + if W3_zz1pb = '0' then + W3_cwm_i <= '0'; + end if; + + if debct_baz = '1' then -- counter Baz + debct_var <= unsigned(debct_turn); + if debct_turn = "00000000000000000000000000000000" then + do_q3p_debct <= '0'; + else + do_q3p_debct <= '1'; + end if; + elsif do_q3p_debct = '1' and debct_blrb = '1' then + if debct_bar = '0' then + if debct_cwm_i = '0'then + if do_q3p_debct = '1' then + debct_var <= debct_var - 1; + if (debct_var = "00000000000000000000000000000001") then + debct_cwm_i <= '1'; + debct_pull <= '1'; + do_q3p_debct <= '0'; + end if; + end if; + end if; + else + ---- T + -- Continue + debct_var <= debct_var - 1; + + -- ending + if (debct_var = "00000000000000000000000000000000") then --{ + debct_cwm_i <= '1'; + debct_pull <= '1'; + debct_var <= unsigned(debct_turn); + end if; + end if; -- debct_bar + + end if; -- debct_blrb + + -- comment + if debct_zz1pb = '0' then + debct_cwm_i <= '0'; + end if; + + end if; + end if; + end process; + +end rtl; diff --git a/vhdl/dsp.vhd b/vhdl/dsp.vhd new file mode 100644 index 0000000..a762a4e --- /dev/null +++ b/vhdl/dsp.vhd @@ -0,0 +1,41 @@ +-- Nearly useless stub, it's here to support genericmap.vhd +LIBRARY IEEE; +USE IEEE.std_logic_1164.all; +USE IEEE.numeric_std.all; + +entity dsp is generic( + rst_val : std_logic := '0'; + thing_size: integer := 51; + bus_width : integer := 24); + port( + -- Inputs + clk, rstn : in std_logic; + en, start : in std_logic; + param : in std_logic_vector(7 downto 0); + addr : in std_logic_vector(2 downto 0); + din : in std_logic_vector(bus_width-1 downto 0); + we : in std_logic; + memdin : out std_logic_vector(13 downto 0); + -- Outputs + dout : out std_logic_vector(bus_width-1 downto 0); + memaddr : out std_logic_vector(5 downto 0); + memdout : out std_logic_vector(13 downto 0) + ); +end; + +architecture rtl of dsp is + signal foo : std_logic; + signal sr : std_logic_vector(63 downto 0); + signal iparam : integer; +begin + iparam <= to_integer(unsigned(param)); + process(clk) begin + -- dout <= std_logic_vector(to_unsigned(1,bus_width)); + if rising_edge(clk) then + if we = '1' then + sr <= sr(thing_size-bus_width-1 downto 0) & din; + end if; + dout <= sr(iparam*bus_width+bus_width-1 downto iparam*bus_width); + end if; + end process; +end rtl; diff --git a/vhdl/expr.vhd b/vhdl/expr.vhd new file mode 100644 index 0000000..103e762 --- /dev/null +++ b/vhdl/expr.vhd @@ -0,0 +1,46 @@ +library IEEE; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity expr is +generic(SIZE: positive:=2**8-1); +port(reset, sysclk, ival : in std_logic); +end expr; + +architecture rtl of expr is + constant SIZE_OF : positive:=2**8-1; + signal foo : std_logic_vector(13 downto 0); + signal baz : std_logic_vector(2 downto 0); + signal bam : std_logic_vector(22 downto 0); + signal out_i : std_logic_vector(5 downto 3); + signal input_status : std_logic_vector(8 downto 0); + signal enable, debug, aux, outy, dv, value : std_logic; + signal expo : std_logic_vector(2**3-1 downto 0); +begin + -- drive input status + input_status <= -- top bits + (foo(9 downto 4) & + (( (baz(2 downto 0) and foo(3 downto 0)) or + (not baz(2 downto 0) and bam(3 downto 0))))); + -- drive based on foo + out_i(4) <= + -- if secondary enabl is set then drive aux out + (enable and (aux xor outy)) or + -- if debug is enabled + (debug and dv and not enable) or + -- otherwise we drive reg + (not debug and not enable and value); + -- not drive + + pfoo: process(reset, sysclk) + begin + if( reset /= '0' ) then + foo <= (others => '0'); + elsif( sysclk'event and sysclk = '0' ) then + foo(3*(2-1)) <= baz(1*(1+2)-2); + bam(foo'range) <= foo; + end if; + end process; + + expo <= std_logic_vector(to_unsigned(2**4, 2**8)); +end rtl; diff --git a/vhdl/fifo.vhd b/vhdl/fifo.vhd new file mode 100644 index 0000000..112068f --- /dev/null +++ b/vhdl/fifo.vhd @@ -0,0 +1,202 @@ +--------------------------------------------------------------------- +-- Filename: gh_fifo_async16_sr.vhd +-- +-- Description: +-- an Asynchronous FIFO +-- +-- Copyright (c) 2006 by George Huber +-- an OpenCores.org Project +-- free to use, but see documentation for conditions +-- +-- Revision History: +-- Revision Date Author Comment +-- -------- ---------- --------- ----------- +-- 1.0 12/17/06 h lefevre Initial revision +-- +-------------------------------------------------------- + +library IEEE; +use IEEE.std_logic_1164.all; +USE ieee.numeric_std.all; + +entity fifo is + GENERIC (data_width: INTEGER :=8 ); -- size of data bus + port ( + clk_WR : in STD_LOGIC; -- write clock + clk_RD : in STD_LOGIC; -- read clock + rst : in STD_LOGIC; -- resets counters + srst : in STD_LOGIC:='0'; -- resets counters (sync with clk_WR) + WR : in STD_LOGIC; -- write control + RD : in STD_LOGIC; -- read control + D : in STD_LOGIC_VECTOR (data_width-1 downto 0); + Q : out STD_LOGIC_VECTOR (data_width-1 downto 0); + empty : out STD_LOGIC; + full : out STD_LOGIC); +end entity; + +architecture rtl of fifo is + + type ram_mem_type is array (15 downto 0) + of STD_LOGIC_VECTOR (data_width-1 downto 0); + signal ram_mem : ram_mem_type; + signal iempty : STD_LOGIC; + signal ifull : STD_LOGIC; + signal add_WR_CE : std_logic; + signal add_WR : std_logic_vector(4 downto 0); -- 4 bits are used to address MEM + signal add_WR_GC : std_logic_vector(4 downto 0); -- 5 bits are used to compare + signal n_add_WR : std_logic_vector(4 downto 0); -- for empty, full flags + signal add_WR_RS : std_logic_vector(4 downto 0); -- synced to read clk + signal add_RD_CE : std_logic; + signal add_RD : std_logic_vector(4 downto 0); + signal add_RD_GC : std_logic_vector(4 downto 0); + signal add_RD_GCwc : std_logic_vector(4 downto 0); + signal n_add_RD : std_logic_vector(4 downto 0); + signal add_RD_WS : std_logic_vector(4 downto 0); -- synced to write clk + signal srst_w : STD_LOGIC; + signal isrst_w : STD_LOGIC; + signal srst_r : STD_LOGIC; + signal isrst_r : STD_LOGIC; + +begin + +-------------------------------------------- +------- memory ----------------------------- +-------------------------------------------- + +process (clk_WR) +begin + if (rising_edge(clk_WR)) then + if ((WR = '1') and (ifull = '0')) then + --ram_mem(to_integer(unsigned(add_WR(3 downto 0)))) <= D; + end if; + end if; +end process; + + --Q <= ram_mem(to_integer(unsigned(add_RD(3 downto 0)))); + +----------------------------------------- +----- Write address counter ------------- +----------------------------------------- + + add_WR_CE <= '0' when (ifull = '1') else + '0' when (WR = '0') else + '1'; + + n_add_WR <= std_logic_vector(unsigned(add_WR) + x"1"); + +process (clk_WR,rst) +begin + if (rst = '1') then + add_WR <= (others => '0'); + add_RD_WS <= "11000"; + add_WR_GC <= (others => '0'); + elsif (rising_edge(clk_WR)) then + add_RD_WS <= add_RD_GCwc; + if (srst_w = '1') then + add_WR <= (others => '0'); + add_WR_GC <= (others => '0'); + elsif (add_WR_CE = '1') then + add_WR <= n_add_WR; + add_WR_GC(0) <= n_add_WR(0) xor n_add_WR(1); + add_WR_GC(1) <= n_add_WR(1) xor n_add_WR(2); + add_WR_GC(2) <= n_add_WR(2) xor n_add_WR(3); + add_WR_GC(3) <= n_add_WR(3) xor n_add_WR(4); + add_WR_GC(4) <= n_add_WR(4); + else + add_WR <= add_WR; + add_WR_GC <= add_WR_GC; + end if; + end if; +end process; + + full <= ifull; + + ifull <= '0' when (iempty = '1') else -- just in case add_RD_WS is reset to "00000" + '0' when (add_RD_WS /= add_WR_GC) else ---- instend of "11000" + '1'; + +----------------------------------------- +----- Read address counter -------------- +----------------------------------------- + + add_RD_CE <= '0' when (iempty = '1') else + '0' when (RD = '0') else + '1'; + + n_add_RD <= std_logic_vector(unsigned(add_RD) + x"1"); + +process (clk_RD,rst) +begin + if (rst = '1') then + add_RD <= (others => '0'); + add_WR_RS <= (others => '0'); + add_RD_GC <= (others => '0'); + add_RD_GCwc <= "11000"; + elsif (rising_edge(clk_RD)) then + add_WR_RS <= add_WR_GC; + if (srst_r = '1') then + add_RD <= (others => '0'); + add_RD_GC <= (others => '0'); + add_RD_GCwc <= "11000"; + elsif (add_RD_CE = '1') then + add_RD <= n_add_RD; + add_RD_GC(0) <= n_add_RD(0) xor n_add_RD(1); + add_RD_GC(1) <= n_add_RD(1) xor n_add_RD(2); + add_RD_GC(2) <= n_add_RD(2) xor n_add_RD(3); + add_RD_GC(3) <= n_add_RD(3) xor n_add_RD(4); + add_RD_GC(4) <= n_add_RD(4); + add_RD_GCwc(0) <= n_add_RD(0) xor n_add_RD(1); + add_RD_GCwc(1) <= n_add_RD(1) xor n_add_RD(2); + add_RD_GCwc(2) <= n_add_RD(2) xor n_add_RD(3); + add_RD_GCwc(3) <= n_add_RD(3) xor (not n_add_RD(4)); + add_RD_GCwc(4) <= (not n_add_RD(4)); + else + add_RD <= add_RD; + add_RD_GC <= add_RD_GC; + add_RD_GCwc <= add_RD_GCwc; + end if; + end if; +end process; + + empty <= iempty; + + iempty <= '1' when (add_WR_RS = add_RD_GC) else + '0'; + +---------------------------------- +--- sync rest stuff -------------- +--- srst is sync with clk_WR ----- +--- srst_r is sync with clk_RD --- +---------------------------------- + +process (clk_WR,rst) +begin + if (rst = '1') then + srst_w <= '0'; + isrst_r <= '0'; + elsif (rising_edge(clk_WR)) then + isrst_r <= srst_r; + if (srst = '1') then + srst_w <= '1'; + elsif (isrst_r = '1') then + srst_w <= '0'; + end if; + end if; +end process; + +process (clk_RD,rst) +begin + if (rst = '1') then + srst_r <= '0'; + isrst_w <= '0'; + elsif (rising_edge(clk_RD)) then + isrst_w <= srst_w; + if (isrst_w = '1') then + srst_r <= '1'; + else + srst_r <= '0'; + end if; + end if; +end process; + +end architecture; diff --git a/vhdl/forgen.vhd b/vhdl/forgen.vhd new file mode 100644 index 0000000..61f11fe --- /dev/null +++ b/vhdl/forgen.vhd @@ -0,0 +1,52 @@ +LIBRARY IEEE; +USE IEEE.std_logic_1164.all; + +entity forgen is + generic( + bus_width : integer := 15; + TOP_GP2 : integer:= 0 + ); + port( + sysclk, reset, wrb : in std_logic; + din : in std_logic_vector(bus_width downto 0); + rdout: out std_logic_vector(bus_width downto 0) + ); +end forgen; + +architecture rtl of forgen is + component wbit1 -- register bit default 1 + port( + clk : in std_logic; + wrb : in std_logic; + reset : in std_logic; + enb : in std_logic; + din : in std_logic; + dout : out std_logic); + end component; + + signal regSelect : std_logic_vector(bus_width * 2 downto 0); +begin + ----------------------------------------------------- + -- Reg : GP 2 + -- Active : 32 + -- Type : RW + ----------------------------------------------------- + reg_gp2 : for bitnum in 0 to bus_width generate + wbit1_inst : wbit1 + PORT MAP( + clk => sysclk, + wrb => wrb, + reset => reset, + enb => regSelect(TOP_GP2), + din => din(bitnum), + dout => rdout(bitnum) + ); + end generate; + + process(sysclk) begin + if sysclk'event and sysclk = '1' then + regSelect(1) <= '1'; + end if; + end process; + +end rtl; diff --git a/vhdl/forloop.vhd b/vhdl/forloop.vhd new file mode 100644 index 0000000..492ec27 --- /dev/null +++ b/vhdl/forloop.vhd @@ -0,0 +1,37 @@ +library IEEE; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity forloop is port( + reset, sysclk : in std_logic +); +end forloop; + +architecture rtl of forloop is + signal selection : std_logic; + signal egg_timer : std_logic_vector(6 downto 0); +begin + TIMERS : + process(reset, sysclk) + variable timer_var : integer; + variable a, i, j, k : integer; + variable zz5 : std_logic_vector(31 downto 0); + variable zz : std_logic_vector(511 downto 0); + begin + if reset = '1' then + selection <= '1'; + timer_var := 2; + egg_timer <= (others => '0'); + elsif sysclk'event and sysclk = '1' then + -- pulse only lasts for once cycle + selection <= '0'; + egg_timer <= (others => '1'); + for i in 0 to j*k loop + a := a + i; + for k in a-9 downto -14 loop + zz5 := zz(31+k downto k); + end loop; -- k + end loop; -- i + end if; + end process; +end rtl; diff --git a/vhdl/formatter_vhdl.vhd b/vhdl/formatter_vhdl.vhd new file mode 100644 index 0000000..e69de29 diff --git a/vhdl/genericmap.vhd b/vhdl/genericmap.vhd new file mode 100644 index 0000000..3038f88 --- /dev/null +++ b/vhdl/genericmap.vhd @@ -0,0 +1,105 @@ +LIBRARY IEEE; +USE IEEE.std_logic_1164.all; +entity genericmap is +generic( + rst_val : std_logic := '0'; + thing_size: integer := 201 rem 2; + bus_width : integer := 201 mod 32); +port( + clk, rstn : in std_logic; + en, start_dec : in std_logic; + addr : in std_logic_vector(2 downto 0); + din : in std_logic_vector(25 downto 0); + we : in std_logic; + pixel_in : in std_logic_vector(7 downto 0); + pix_req : in std_logic; + bip : in std_logic; + a, b : in std_logic_vector(7 downto 0); + c, load : in std_logic_vector(7 downto 0); + pack : in std_logic_vector(6 downto 0); + base : in std_logic_vector(2 downto 0); + qtd : in std_logic_vector(21 downto 0); + -- Outputs + dout : out std_logic_vector(25 downto 0); + pixel_out : out std_logic_vector(7 downto 0); + pixel_valid : out std_logic; + code : out std_logic_vector(9 downto 0); + complex : out std_logic_vector(23 downto 0); + eno : out std_logic +); +end genericmap; +architecture rtl of genericmap is + + component dsp + generic( + rst_val : std_logic := '0'; + thing_size: integer := 201; + bus_width : integer := 24); + port( + -- Inputs + clk, rstn : in std_logic; + en, start : in std_logic; + param : in std_logic_vector(7 downto 0); + addr : in std_logic_vector(2 downto 0); + din : in std_logic_vector(bus_width-1 downto 0); + we : in std_logic; + memdin : out std_logic_vector(13 downto 0); + -- Outputs + dout : out std_logic_vector(bus_width-1 downto 0); + memaddr : out std_logic_vector(5 downto 0); + memdout : out std_logic_vector(13 downto 0) + ); + end component; + signal param : std_logic_vector(7 downto 0); + signal selection : std_logic; + signal start, enf : std_logic; -- Start and enable signals + signal memdin : std_logic_vector(13 downto 0); + signal memaddr : std_logic_vector(5 downto 0); + signal memdout : std_logic_vector(13 downto 0); + signal colour : std_logic_vector(1 downto 0); +begin + dsp_inst0 : dsp + -- default bus_width is 24 + port map( + -- Inputs + clk => clk, + rstn => rstn, + en => '1', + start => '0', + param => X"42", + addr => "101", + din => "000100010001000100010001", + we => '0', + -- Outputs + dout => dout(23 downto 0), + memaddr => memaddr, + memdout => memdout + ); + + dsp_inst1 : dsp + generic map( + rst_val => '1', + bus_width => 16) + port map( + -- Inputs + clk => clk, + rstn => rstn, + en => '1', + start => '0', + param => X"42", + addr => "101", + din => "0001000100010001", + we => '0', + -- Outputs + dout => dout(15 downto 0), + memaddr => memaddr, + memdout => memdout + ); + + signextend_inst2 : entity work.signextend + port map ( + i => "0000000000000000", + o => open + ); + +end rtl; diff --git a/vhdl/ifchain.vhd b/vhdl/ifchain.vhd new file mode 100644 index 0000000..a830272 --- /dev/null +++ b/vhdl/ifchain.vhd @@ -0,0 +1,26 @@ +LIBRARY IEEE; +USE IEEE.std_logic_1164.all; + +entity ifchain is port( + clk, rstn : in std_logic +); +end ifchain; + +architecture rtl of ifchain is + type t is array (3 downto 0) of std_logic_vector(31 downto 0); + signal a : std_logic_vector(3 downto 0); + signal b : std_logic_vector(3 downto 0); + signal status : std_logic; + signal c : t; +begin + + process(clk) begin + if clk'event and clk = '1' then + if b(1) & a(3 downto 2) = "001" then + status <= '1'; + c(0) <= x"FFFFFFFF"; + end if; + end if; + end process; + +end rtl; diff --git a/vhdl/ifchain2.vhd b/vhdl/ifchain2.vhd new file mode 100644 index 0000000..b002568 --- /dev/null +++ b/vhdl/ifchain2.vhd @@ -0,0 +1,36 @@ +LIBRARY IEEE; +USE IEEE.std_logic_1164.all; +USE IEEE.numeric_std.all; + +entity ifchain2 is port( + clk, rstn : in std_logic; + enable: in std_logic; + result: out std_logic +); +end ifchain2; + +architecture rtl of ifchain2 is + signal counter : unsigned(3 downto 0); + constant CLK_DIV_VAL : unsigned(3 downto 0) := to_unsigned(11,4); +begin + +clk_src : process(clk, rstn) is +begin + if (rstn = '0') then + counter <= (others => '0'); + result <= '0'; + elsif (rising_edge(clk)) then -- Divide by 2 by default + if (enable = '1') then + if (counter = 0) then + counter <= CLK_DIV_VAL; + result <= '1'; + else + counter <= counter - 1; + result <= '0'; + end if; -- counter + end if; -- enable + end if; -- clk, rst_n +end process clk_src; +assert (counter < CLK_DIV_VAL) report "test case" severity error; + +end rtl; diff --git a/vhdl/mem.vhd b/vhdl/mem.vhd new file mode 100644 index 0000000..ca0afef --- /dev/null +++ b/vhdl/mem.vhd @@ -0,0 +1,36 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity mem is +generic( + addr_width : integer := 6; + bus_width : integer := 14 +); + port ( + clk : in std_logic; + rstn : in std_logic; -- not implemented + en : in std_logic; + cs : in std_logic; -- not implemented + addr : in unsigned(addr_width-1 downto 0); + din : in unsigned(bus_width-1 downto 0); + dout : out unsigned(bus_width-1 downto 0) + ); +end entity; + +architecture rtl of mem is + signal al : unsigned(addr_width-1 downto 0) := X"00"; + type mem_Type is array (255 downto 0) of unsigned(bus_width-1 downto 0); + signal mem : mem_Type; +begin + dout <= mem(to_integer(al)); + process (clk) is + begin + if rising_edge(clk) then + al <= addr; + if en = '1' then + mem(to_integer(addr)) <= din; + end if; + end if; + end process; +end architecture; diff --git a/vhdl/operators.vhd b/vhdl/operators.vhd new file mode 100644 index 0000000..8922cc1 --- /dev/null +++ b/vhdl/operators.vhd @@ -0,0 +1,85 @@ +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity operators is + generic ( + g_and : std_logic_vector(1 downto 0) := "11" and "10"; + g_or : std_logic_vector(1 downto 0) := "11" or "10"; + g_nand : std_logic_vector(1 downto 0) := "11" nand "10"; + g_nor : std_logic_vector(1 downto 0) := "11" nor "10"; + g_xor : std_logic_vector(1 downto 0) := "11" xor "10"; + g_xnor : std_logic_vector(1 downto 0) := "11" xnor "10"; + g_not : std_logic_vector(1 downto 0) := not "10" + ); + port ( + clk_i : in std_logic + ); +end entity operators; + +architecture rtl of operators is + constant c_and : std_logic_vector(1 downto 0) := "11" and "10"; + constant c_or : std_logic_vector(1 downto 0) := "11" or "10"; + constant c_nand : std_logic_vector(1 downto 0) := "11" nand "10"; + constant c_nor : std_logic_vector(1 downto 0) := "11" nor "10"; + constant c_xor : std_logic_vector(1 downto 0) := "11" xor "10"; + constant c_xnor : std_logic_vector(1 downto 0) := "11" xnor "10"; + constant c_not : std_logic_vector(1 downto 0) := not "10"; + signal s_op1 : std_logic_vector(1 downto 0); + signal s_op2 : std_logic_vector(1 downto 0); + signal s_res : std_logic_vector(1 downto 0); + signal s_int : integer; + signal s_sig : signed(7 downto 0); + signal s_uns : unsigned(7 downto 0); +begin + + test_i: process(clk_i) + variable v_op1 : std_logic_vector(1 downto 0); + variable v_op2 : std_logic_vector(1 downto 0); + variable v_res : std_logic_vector(1 downto 0); + begin + if rising_edge(clk_i) then + if + (s_op1="11" and s_op2="00") or + (s_op1="11" or s_op2="00") or + (s_op1="11" nand s_op2="00") or + (s_op1="11" nor s_op2="00") or + (not (s_op1="11")) + then + s_res <= s_op1 and s_op2; + s_res <= s_op1 or s_op2; + v_res := v_op1 nand v_op2; + v_res := v_op1 nor v_op2; + s_res <= s_op1 xor s_op2; + v_res := v_op1 xnor v_op2; + s_res <= not s_op1; + s_int <= abs(s_int); + s_sig <= abs(s_sig); + s_sig <= s_sig sll 2; + s_sig <= s_sig srl to_integer(s_sig); + s_uns <= s_uns sll to_integer(s_uns); + s_uns <= s_uns srl 9; + s_sig <= shift_left(s_sig,2); + s_sig <= shift_right(s_sig,to_integer(s_sig)); + -- s_uns <= s_uns ror 3; -- Not yet implemented + -- s_uns <= s_uns rol to_integer(s_uns); -- Not yet implemented + -- s_uns <= rotate_right(s_uns,3); -- Not yet implemented + -- s_uns <= rotate_left(s_uns,to_integer(s_uns)); -- Not yet implemented + s_sig <= s_sig rem s_int; + s_sig <= s_sig mod s_int; + end if; + if + s_sig = signed(s_uns) or unsigned(s_sig) /= s_uns or s_sig < "101010101" or + s_sig <= signed(s_uns) or unsigned(s_sig) > s_uns or s_sig >= "00000101" + then + s_sig <= s_sig + s_sig; + s_sig <= s_sig - s_sig; + s_sig <= s_sig * s_sig; + s_sig <= s_sig / s_sig; + s_sig <= s_sig(7 downto 4) & "10" & signed(s_uns(1 downto 0)); + s_int <= 2 ** 3; + end if; + end if; + end process test_i; + +end architecture rtl; diff --git a/vhdl/partselect.vhd b/vhdl/partselect.vhd new file mode 100644 index 0000000..90c67b2 --- /dev/null +++ b/vhdl/partselect.vhd @@ -0,0 +1,32 @@ +library IEEE; +use IEEE.std_logic_1164.all; + +entity partselect is + port( + clk_i : in std_logic + ); +end entity partselect; + +architecture rtl of partselect is + signal big_sig : std_logic_vector(31 downto 0); + signal lit_sig : std_logic_vector(0 to 31); + signal i : integer:=8; +begin + + test_i: process(clk_i) + variable big_var : std_logic_vector(31 downto 0); + variable lit_var : std_logic_vector(0 to 31); + variable j : integer; + begin + if rising_edge(clk_i) then + big_sig(31 downto 24) <= big_sig(7 downto 0); + big_var(31 downto 24) := big_var(7 downto 0); + lit_sig(i*3 to i*3+7) <= lit_sig(0 to 7); + lit_var(j*3 to j*3+8) := lit_var(j*0 to 8+j*0); + -- + big_sig(i*3+8 downto i*3) <= big_sig(8 downto 0); + big_var(j*3+8 downto j*3) := big_var(j*0+8 downto j*0); + end if; + end process test_i; + +end architecture rtl; diff --git a/vhdl/signextend.vhd b/vhdl/signextend.vhd new file mode 100644 index 0000000..48b7130 --- /dev/null +++ b/vhdl/signextend.vhd @@ -0,0 +1,17 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.ALL; + +entity signextend is + port( + i : in std_logic_vector(15 downto 0); + o : out std_logic_vector(31 downto 0) + ); +end entity signextend; + +architecture behavior of signextend is +begin + o(31 downto 24) <= (others => '0'); + o(23 downto 16) <= (others => i(15)); + o(15 downto 0) <= i; +end architecture behavior; diff --git a/vhdl/test.vhd b/vhdl/test.vhd new file mode 100644 index 0000000..236fcae --- /dev/null +++ b/vhdl/test.vhd @@ -0,0 +1,191 @@ +-- Project: VHDL to Verilog RTL translation +-- Revision: 1.0 +-- Date of last Revision: February 27 2001 +-- Designer: Vincenzo Liguori +-- vhd2vl test file +-- This VHDL file exercises vhd2vl + +LIBRARY IEEE; + +USE IEEE.std_logic_1164.all, IEEE.numeric_std.all; + +entity test is port( + -- Inputs + clk, rstn : in std_logic; + en, start_dec : in std_logic; + addr : in std_logic_vector(2 downto 0); + din : in std_logic_vector(25 downto 0); + we : in std_logic; + pixel_in : in std_logic_vector(7 downto 0); + pix_req : in std_logic; + config1, bip : in std_logic; + a, b : in std_logic_vector(7 downto 0); + c, load : in std_logic_vector(7 downto 0); + pack : in std_logic_vector(6 downto 0); + base : in std_logic_vector(2 downto 0); + qtd : in std_logic_vector(21 downto 0); + -- Outputs + dout : out std_logic_vector(23 downto 0); + pixel_out : out std_logic_vector(7 downto 0); + pixel_valid : out std_logic; + code : out std_logic_vector(9 downto 0); + code1 : out std_logic_vector(9 downto 0); + complex : out std_logic_vector(23 downto 0); + eno : out std_logic +); +end test; + +architecture rtl of test is + +-- Components declarations are ignored by vhd2vl +-- but they are still parsed + +component dsp port( + -- Inputs + clk, rstn : in std_logic; + en, start : in std_logic; + param : in std_logic_vector(7 downto 0); + addr : in std_logic_vector(2 downto 0); + din : in std_logic_vector(23 downto 0); + we : in std_logic; + memdin : out std_logic_vector(13 downto 0); + -- Outputs + dout : out std_logic_vector(23 downto 0); + memaddr : out std_logic_vector(5 downto 0); + memdout : out std_logic_vector(13 downto 0) +); +end component; + +component mem port( + -- Inputs + clk, rstn : in std_logic; + en : in std_logic; + cs : in std_logic; + addr : in std_logic_vector(5 downto 0); + din : in std_logic_vector(13 downto 0); + -- Outputs + dout : out std_logic_vector(13 downto 0) +); +end component; + + type state is (red, green, blue, yellow); + signal status : state; + constant PARAM1 : std_logic_vector(7 downto 0):="01101101"; + constant PARAM2 : std_logic_vector(7 downto 0):="11001101"; + constant PARAM3 : std_logic_vector(7 downto 0):="00010111"; + signal param : std_logic_vector(7 downto 0); + signal selection : std_logic := '0'; + signal start, enf : std_logic; -- Start and enable signals + signal memdin : std_logic_vector(13 downto 0); + signal memaddr : std_logic_vector(5 downto 0); + signal memdout : std_logic_vector(13 downto 0); + signal colour : std_logic_vector(1 downto 0); +begin + + param <= PARAM1 when config1 = '1' else PARAM2 when status = green else PARAM3; + + -- Synchronously process + process(clk) begin + if clk'event and clk = '1' then + pixel_out <= pixel_in xor "11001100"; + end if; + end process; + + -- Synchronous process + process(clk) begin + if rising_edge(clk) then + case status is + when red => colour <= "00"; + when green => colour <= B"01"; + when blue => colour <= "10"; + when others => colour <= "11"; + end case; + end if; + end process; + + -- Synchronous process with asynch reset + process(clk,rstn) begin + if rstn = '0' then + status <= red; + elsif rising_edge(clk) then + case status is + when red => + if pix_req = '1' then + status <= green; + end if; + when green => + if a(3) = '1' then + start <= start_dec; + status <= blue; + elsif (b(5) & a(3 downto 2)) = "001" then + status <= yellow; + end if; + when blue => + status <= yellow; + when others => + start <= '0'; + status <= red; + end case; + end if; + end process; + + -- Example of with statement + with memaddr(2 downto 0) select + code(9 downto 2) <= "110" & pack(6 downto 2) when "000" | "110", + "11100010" when "101", + (others => '1') when "010", + (others => '0') when "011", + std_logic_vector(unsigned(a) + unsigned(b)) when others; + code1(1 downto 0) <= a(6 downto 5) xor (a(4) & b(6)); + + -- Asynch process + decode : process(we, addr, config1, bip) begin + if we = '1' then + if addr(2 downto 0) = "100" then + selection <= '1'; + elsif (b & a) = a & b and bip = '0' then + selection <= config1; + else + selection <= '1'; + end if; + else + selection <= '0'; + end if; + end process decode; + + -- Components instantiation + dsp_inst : dsp port map( + -- Inputs + clk => clk, + rstn => rstn, + en => en, + start => start, + param => param, + addr => addr, + din => din(23 downto 0), + we => we, + memdin => memdin, + -- Outputs + dout => dout, + memaddr => memaddr, + memdout => memdout + ); + + dsp_mem : mem port map( + -- Inputs + clk => clk, + rstn => rstn, + en => en, + cs => selection, + addr => memaddr, + din => memdout, + -- Outputs + dout => memdin + ); + + complex <= enf & (std_logic_vector("110" * unsigned(load))) & qtd(3 downto 0) & base & "11001"; + + enf <= '1' when c < "1000111" else '0'; + eno <= enf; + +end rtl; diff --git a/vhdl/todo.vhd b/vhdl/todo.vhd new file mode 100644 index 0000000..7b05d2a --- /dev/null +++ b/vhdl/todo.vhd @@ -0,0 +1,74 @@ +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity todo is + generic( + INBYLEVEL : boolean:=FALSE + ); + port ( + clk_i : in std_logic; + data_i : in std_logic_vector(7 downto 0); + data_o : out std_logic_vector(7 downto 0) + ); +end todo; + +architecture rtl of todo is + type mem_type is array (0 to 255) of integer; + signal mem : mem_type; + + signal int : integer; + signal uns : unsigned(7 downto 0); + + constant BYTES : positive:=4; + constant WIDTH : positive:=BYTES*8; + signal index : natural range 0 to BYTES-1; + signal comma : std_logic_vector(BYTES*3-1 downto 0); + + -- (others => (others => '0')) must be replaced by an initial block with a for + -- or something similar. + --type ff_array is array (0 to 255) of std_logic_vector(7 downto 0); + --signal data_r : ff_array :=(others => (others => '0')); +begin + --************************************************************************** + -- Wrong translations + --************************************************************************** + -- + test_i: process(clk_i) + -- iverilog: variable declaration assignments are only allowed at the module level. + variable i : integer:=8; + begin + for i in 0 to 7 loop + if i=4 then + exit; -- iverilog: error: malformed statement + end if; + end loop; + end process test_i; + -- indexed part-select not applied + do_boundary: process (clk_i) + begin + if rising_edge(clk_i) then + for i in 0 to BYTES-1 loop + if comma(BYTES*2+i-1 downto BYTES+i)=comma(3 downto 0) then + index <= i; + end if; + end loop; + end if; + end process; + comma <= comma(BYTES+index-1 downto index); + --************************************************************************** + -- Translations which abort with syntax error (uncomment to test) + --************************************************************************** + -- Concatenation in port assignament fail +-- uns <= "0000" & X"1"; -- It is supported +-- dut1_i: entity work.signextend +-- port map ( +-- i => "00000000" & X"11", -- But here fail +-- o => open +-- ); + -- Unsupported generate with boolean? +-- in_by_level: +-- if INBYLEVEL generate +-- int <= 9; +-- end generate in_by_level; +end rtl; diff --git a/vhdl/wbit1.vhd b/vhdl/wbit1.vhd new file mode 100644 index 0000000..12b1e38 --- /dev/null +++ b/vhdl/wbit1.vhd @@ -0,0 +1,21 @@ +-- Nearly useless stub, it's here to support generate.vhd +LIBRARY IEEE; +USE IEEE.std_logic_1164.all; + +entity wbit1 is + port( + clk : in std_logic; + wrb : in std_logic; + reset : in std_logic; + enb : in std_logic; + din : in std_logic; + dout : out std_logic); +end; + +architecture rtl of wbit1 is + signal foo : std_logic; +begin + process(clk) begin + dout <= '1'; + end process; +end rtl; diff --git a/vhdl/whileloop.vhd b/vhdl/whileloop.vhd new file mode 100644 index 0000000..44793e3 --- /dev/null +++ b/vhdl/whileloop.vhd @@ -0,0 +1,27 @@ +library IEEE; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity whileloop is port( + A : in integer; + Z : out std_logic_vector(3 downto 0) +); +end whileloop; + +architecture rtl of whileloop is +begin + +process (A) + variable I : integer range 0 to 4; +begin + Z <= "0000"; + I := 0; + while (I <= 3) loop + if (A = I) then + Z(I) <= '1'; + end if; + I := I + 1; + end loop; +end process; + +end rtl; diff --git a/vhdl/withselect.vhd b/vhdl/withselect.vhd new file mode 100644 index 0000000..48f6f0a --- /dev/null +++ b/vhdl/withselect.vhd @@ -0,0 +1,34 @@ +LIBRARY IEEE; +USE IEEE.std_logic_1164.all, IEEE.numeric_std.all; + +entity withselect is + generic( + dog_width : std_logic_vector(7 downto 0) := "10101100"; + bus_width : integer := 32 + ); + port( reset, sysclk : in std_logic; + a, b, enf, load, qtd, base: in std_logic_vector(bus_width downto 0) + ); +end withselect; + +architecture rtl of withselect is + signal foo : std_logic_vector(1+1 downto 0); + signal code,code1: std_logic_vector(9 downto 0); + signal egg : std_logic_vector(324 to 401); + signal baz : std_logic_vector(bus_width*3-1 to bus_width*4); + signal complex : std_logic_vector(31 downto 0); +begin + -- Example of with statement + with foo(2 downto 0) select + code(9 downto 2) <= "110" & egg(325 to 329) when "000" | "110", + "11100010" when "101", + (others => '1') when "010", + (others => '0') when "011", + std_logic_vector(unsigned(a) + unsigned(b)) when others; + code1(1 downto 0) <= a(6 downto 5) xor (a(4) & b(6)); + + foo <= (others => '0'); + egg <= (others => '0'); + baz <= (others => '1'); + complex <= enf & (std_logic_vector("110" * unsigned(load))) & qtd(3 downto 0) & base & "11001"; +end rtl; diff --git a/vlog/dependence_test/.vscode/property.json b/vlog/dependence_test/.vscode/property.json new file mode 100644 index 0000000..276c76f --- /dev/null +++ b/vlog/dependence_test/.vscode/property.json @@ -0,0 +1,17 @@ +{ + "toolChain": "xilinx", + "prjName": { + "PL": "template" + }, + "soc": { + "core": "none" + }, + "arch": { + "hardware": { + "sim": "./", + "src": "./" + } + }, + "enableShowLog": false, + "device": "none" +} \ No newline at end of file diff --git a/vlog/dependence_test/child_1.v b/vlog/dependence_test/child_1.v new file mode 100644 index 0000000..962b445 --- /dev/null +++ b/vlog/dependence_test/child_1.v @@ -0,0 +1,17 @@ +module dependence_1 ( + // this is a test + input a, b, c, + // a test + output Result // balabalabala for result +); + + // a & b | ((b & c) & (b | c)) + // &=*, |=+ AB + BC(B+C) + // Distribute AB + BBC + BCC + // Simplify AA = A AB + BC + BC + // Simplify A + A = A AB + BC + // Factor B(A+C) + + assign Result = a & (b | c); + +endmodule \ No newline at end of file diff --git a/vlog/dependence_test/child_2.v b/vlog/dependence_test/child_2.v new file mode 100644 index 0000000..72b0112 --- /dev/null +++ b/vlog/dependence_test/child_2.v @@ -0,0 +1,8 @@ +module dependence_2 ( + input a, b, c, + output Q +); + + assign Q = a & b | ((b & c) & (b | c)); + +endmodule \ No newline at end of file diff --git a/vlog/dependence_test/head_1.v b/vlog/dependence_test/head_1.v new file mode 100644 index 0000000..8543ebd --- /dev/null +++ b/vlog/dependence_test/head_1.v @@ -0,0 +1,23 @@ +`define cow 34 + +module dependence_1 ( + input port_a, port_b, port_c, + output out_q +); + // a & b | ((b & c) & (b | c)) + // &=*, |=+ AB + BC(B+C) + // Distribute AB + BBC + BCC + // Simplify AA = A AB + BC + BC + // Simplify A + A = A AB + BC + // Factor B(A+C) + + assign out_q = port_b & (port_a | port_c); +endmodule + + +module test_1 ( + input port_a, port_b, + output Q +); + assign Q = port_b & port_a; +endmodule \ No newline at end of file diff --git a/vlog/dependence_test/hello.v b/vlog/dependence_test/hello.v new file mode 100644 index 0000000..92f23ac --- /dev/null +++ b/vlog/dependence_test/hello.v @@ -0,0 +1,6 @@ +module hello; + initial begin + $display("hello world"); + $finish; + end +endmodule \ No newline at end of file diff --git a/vlog/dependence_test/parent.v b/vlog/dependence_test/parent.v new file mode 100644 index 0000000..7170374 --- /dev/null +++ b/vlog/dependence_test/parent.v @@ -0,0 +1,69 @@ +/* + * EN: A simple demo to test search order of dependence + * current file -> macro include -> whole project + * expect dependence_1 from child_1.v (macro include) + * expect dependence_2 from child_2.v (whole project) + * cannot find dependence_3 `main + */ + +`include "child_1.v" +`include "child_2.v" +`define main out + +module Main ( + // Main input + input a, b, c, + // Main output + output Qus, Qs, `main +); + +dependence_1 u_dependence_1( + .a(a), + .b(b), + .c(c), + .Result(Qus) +); + +dependence_2 u_dependence_2( + .a(a), + .b(b), + .c(c), + .Q(Qs) +); + +dependence_3 u_dependence_3( + .a(a), + .b(b), + .c(c), + .Q(Qs) +); + +endmodule + + +/* @wavedrom this is wavedrom demo1 +{ + signal : [ + { name: "clk", wave: "p......" }, + { name: "bus", wave: "x.34.5x", data: "head body tail" }, + { name: "wire", wave: "0.1..0." } + ] +} +*/ + + +/* @wavedrom this is wavedrom demo2 +{ + signal: [ + { name: "pclk", wave: "p......." }, + { name: "Pclk", wave: "P......." }, + { name: "nclk", wave: "n......." }, + { name: "Nclk", wave: "N......." }, + {}, + { name: "clk0", wave: "phnlPHNL" }, + { name: "clk1", wave: "xhlhLHl." }, + { name: "clk2", wave: "hpHplnLn" }, + { name: "clk3", wave: "nhNhplPl" }, + { name: "clk4", wave: "xlh.L.Hx" }, +]} +*/ \ No newline at end of file diff --git a/vlog/dependence_test/pdf/parent.pdf b/vlog/dependence_test/pdf/parent.pdf new file mode 100644 index 0000000000000000000000000000000000000000..356b431d084d3030bd8d956873172a1cf4e90f5c GIT binary patch literal 95015 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

XN2Iz0s9C+mm1jR?Il>#`lK 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 LOOs}ws_tOl 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"; + "-"; + "e:/Project/Digial-IDE/digital-ide/src/test/vlog/dependence_test/hello.v"; diff --git a/vlog/formatter_test/formatter_test.v b/vlog/formatter_test/formatter_test.v new file mode 100644 index 0000000..8766fd4 --- /dev/null +++ b/vlog/formatter_test/formatter_test.v @@ -0,0 +1,11 @@ +module formatter_vlog #( + parameter INPUT_WIDTH = 12, + parameter OUTPUT_WIDTH = 12 +) ( + input clk_in, + input rst_n, + input [INPUT_WIDTH - 1 : 0]data_in, + output [OUTPUT_WIDTH - 1 : 0]data_out +); + +reg [3:0] cnt; always @(posedge clk_in or posedge rst_n) begin if(rst_n) begin cnt<=4'h0; end else begin cnt<=cnt+4'h1; end end endmodule //module_name \ No newline at end of file diff --git a/vlog/fsm_test/fsm_test.v b/vlog/fsm_test/fsm_test.v new file mode 100644 index 0000000..95b2134 --- /dev/null +++ b/vlog/fsm_test/fsm_test.v @@ -0,0 +1,58 @@ +module fsm_test( + input clock, + input reset, + input [2 : 0] req_0, + input [2 : 0] req_1, + output reg [2 : 0] gnt_0, + output reg [2 : 0] gnt_1 + ); + + reg [2:0] state; + + parameter IDLE = 3'h1; + parameter GNT0 = 3'd2; + parameter GNT1 = 3'b100; + + always @ (posedge clock) begin : FSM + if (reset == 1'b1) begin + state <= #1 IDLE; + gnt_0 <= 0; + gnt_1 <= 0; + end + else + case(state) + IDLE : + if (req_0 == 1'b1) begin + state <= #1 GNT0; + gnt_0 <= 1; + end + else if (req_1 == 1'b1) begin + gnt_1 <= 1; + state <= #1 GNT1; + end + else begin + state <= #1 IDLE; //example comment + end + GNT0 : + if (req_0 == 1'b1) begin + state <= #1 GNT0; + end + else begin + gnt_0 <= 0; + state <= #1 IDLE; + end + GNT1 : + if (req_1 == 1'b1) begin + state <= #1 GNT1; + end + else begin + gnt_1 <= 0; + state <= #1 IDLE; + end + default : + state <= #1 IDLE; + endcase + end + + +endmodule //module_name diff --git a/vlog/netlist_test/netlist_test.v b/vlog/netlist_test/netlist_test.v new file mode 100644 index 0000000..0abc1fd --- /dev/null +++ b/vlog/netlist_test/netlist_test.v @@ -0,0 +1,33 @@ +// borrowed with some modifications from +// http://www.ee.ed.ac.uk/~gerard/Teach/Verilog/manual/Example/lrgeEx2/cooley.html +module up3down5(clock, data_in, up, down, carry_out, borrow_out, count_out, parity_out); + +input [8:0] data_in; +input clock, up, down; + +output reg [8:0] count_out; +output reg carry_out, borrow_out, parity_out; + +reg [9:0] cnt_up, cnt_dn; +reg [8:0] count_nxt; + +always @(posedge clock) +begin + cnt_dn = count_out - 3'b 101; + cnt_up = count_out + 2'b 11; + + case ({up,down}) + 2'b 00 : count_nxt = data_in; + 2'b 01 : count_nxt = cnt_dn; + 2'b 10 : count_nxt = cnt_up; + 2'b 11 : count_nxt = count_out; + default : count_nxt = 9'bX; + endcase + + parity_out <= ^count_nxt; + carry_out <= up & cnt_up[9]; + borrow_out <= down & cnt_dn[9]; + count_out <= count_nxt; +end + +endmodule \ No newline at end of file diff --git a/vlog/parse_test/Cordic.v b/vlog/parse_test/Cordic.v new file mode 100644 index 0000000..d52576a --- /dev/null +++ b/vlog/parse_test/Cordic.v @@ -0,0 +1,257 @@ +`timescale 1ns / 1ps + +module Cordic #( + parameter XY_BITS = 12, + parameter PH_BITS = 32, + parameter ITERATIONS = 32, + parameter CORDIC_STYLE = "ROTATE", + parameter PHASE_ACC = "ON" +)( + input clk, + input RST, + input signed [XY_BITS-1:0] x_i, + input signed [XY_BITS-1:0] y_i, + input signed [PH_BITS-1:0] phase_in, + input valid_in, + + output valid_out, + output signed [XY_BITS-1:0] x_o, + output signed [XY_BITS-1:0] y_o, + output signed [PH_BITS-1:0] phase_out +); + +localparam [XY_BITS-1:0] K_COS = (0.607252935 * 2**(XY_BITS-1))-2; + +/* +//360°--2^16,phase_in = 16bits (input [15:0] phase_in) +//1°--2^16/360 +*/ +function [PH_BITS-1:0] tanangle; +input [4:0] i; +begin + case (i) + 5'b00000: tanangle = (32'h20000000 >> (32 - PH_BITS)); //tan = 1/2^1 = 1/2 + 5'b00001: tanangle = (32'h12e4051e >> (32 - PH_BITS)); //tan = 1/2^2 = 1/4 + 5'b00010: tanangle = (32'h09fb385b >> (32 - PH_BITS)); //tan = 1/2^3 = 1/8 + 5'b00011: tanangle = (32'h051111d4 >> (32 - PH_BITS)); //tan = 1/2^4 = 1/16 + 5'b00100: tanangle = (32'h028b0d43 >> (32 - PH_BITS)); //tan = 1/2^5 = 1/32 + 5'b00101: tanangle = (32'h0145d7e1 >> (32 - PH_BITS)); //tan = 1/2^6 = 1/64 + 5'b00110: tanangle = (32'h00a2f61e >> (32 - PH_BITS)); //tan = 1/2^7 = 1/128 + 5'b00111: tanangle = (32'h00517c55 >> (32 - PH_BITS)); //tan = 1/2^8 = 1/256 + 5'b01000: tanangle = (32'h0028be53 >> (32 - PH_BITS)); //tan = 1/2^9 = 1/512 + 5'b01001: tanangle = (32'h00145f2f >> (32 - PH_BITS)); //tan = 1/2^10 = 1/1024 + 5'b01010: tanangle = (32'h000a2f98 >> (32 - PH_BITS)); //tan = 1/2^11 = 1/2048 + 5'b01011: tanangle = (32'h000517cc >> (32 - PH_BITS)); //tan = 1/2^12 = 1/4096 + 5'b01100: tanangle = (32'h00028be6 >> (32 - PH_BITS)); //tan = 1/2^13 = 1/8192 + 5'b01101: tanangle = (32'h000145f3 >> (32 - PH_BITS)); //tan = 1/2^14 = 1/16384 + 5'b01110: tanangle = (32'h0000a2fa >> (32 - PH_BITS)); //tan = 1/2^15 = 1/32768 + 5'b01111: tanangle = (32'h0000517d >> (32 - PH_BITS)); //tan = 1/2^16 = 1/65536 + 5'b10000: tanangle = (32'h000028be >> (32 - PH_BITS)); //tan = 1/2^17 = 1/131072 + 5'b10001: tanangle = (32'h0000145f >> (32 - PH_BITS)); //tan = 1/2^18 = 1/262144 + 5'b10010: tanangle = (32'h00000a30 >> (32 - PH_BITS)); //tan = 1/2^19 = 1/524288 + 5'b10011: tanangle = (32'h00000518 >> (32 - PH_BITS)); //tan = 1/2^20 = 1/1048576 + 5'b10100: tanangle = (32'h0000028c >> (32 - PH_BITS)); //tan = 1/2^21 = 1/2097152 + 5'b10101: tanangle = (32'h00000146 >> (32 - PH_BITS)); //tan = 1/2^22 = 1/4194304 + 5'b10110: tanangle = (32'h000000a3 >> (32 - PH_BITS)); //tan = 1/2^23 = 1/8388608 + 5'b10111: tanangle = (32'h00000051 >> (32 - PH_BITS)); //tan = 1/2^24 = 1/16777216 + 5'b11000: tanangle = (32'h00000029 >> (32 - PH_BITS)); //tan = 1/2^25 = 1/33554432 + 5'b11001: tanangle = (32'h00000014 >> (32 - PH_BITS)); //tan = 1/2^26 = 1/67108864 + 5'b11010: tanangle = (32'h0000000a >> (32 - PH_BITS)); //tan = 1/2^27 = 1/134217728 + 5'b11011: tanangle = (32'h00000005 >> (32 - PH_BITS)); //tan = 1/2^28 = 1/268435456 + 5'b11100: tanangle = (32'h00000003 >> (32 - PH_BITS)); //tan = 1/2^29 = 1/536870912 + 5'b11101: tanangle = (32'h00000001 >> (32 - PH_BITS)); //tan = 1/2^30 = 1/1073741824 + 5'b11110: tanangle = (32'h00000001 >> (32 - PH_BITS)); //tan = 1/2^31 = 1/2147483648 + 5'b11111: tanangle = (32'h00000000 >> (32 - PH_BITS)); //tan = 1/2^32 = 1/4294967296 + endcase +end +endfunction + +reg [1:0] data_in_buff [ITERATIONS:0]; +reg signed [XY_BITS-1:0] x [ITERATIONS:0]; +reg signed [XY_BITS-1:0] y [ITERATIONS:0]; +reg signed [PH_BITS-1:0] z [ITERATIONS:0]; + +integer m; +initial begin + for (m = 0; m<=ITERATIONS; m=m+1) begin + x[m] = 0; + end +end + +integer n; +initial begin + for (n = 0; n<=ITERATIONS; n=n+1) begin + y[n] = 0; + end +end + +integer s; +initial begin + for (s = 0; s<=ITERATIONS; s=s+1) begin + z[s] = 0; + end +end + +integer k; +initial begin + for (k = 0; k<=ITERATIONS; k=k+1) begin + data_in_buff[k] = 0; + end +end + +genvar i; +generate for(i=0;i>>i); + y[i+1] <= y[i] - (x[i]>>>i); + z[i+1] <= z[i] + tanangle(i); + end + else begin + x[i+1] <= x[i] - (y[i]>>>i); + y[i+1] <= y[i] + (x[i]>>>i); + z[i+1] <= z[i] - tanangle(i); + end + end + else if(CORDIC_STYLE == "VECTOR") begin + if (y[i] > 0) begin + x[i+1] <= x[i] + (y[i]>>>i); + y[i+1] <= y[i] - (x[i]>>>i); + z[i+1] <= z[i] + tanangle(i); + end else begin + x[i+1] <= x[i] - (y[i]>>>i); + y[i+1] <= y[i] + (x[i]>>>i); + z[i+1] <= z[i] - tanangle(i); + end + end + end +end +always @ (posedge clk) begin + data_in_buff[i+1] <= data_in_buff[i]; +end +end +endgenerate + +generate if (CORDIC_STYLE == "ROTATE") begin : IQ_Gen +reg [PH_BITS - 1 : 0] Phase_input = 0; +if (PHASE_ACC == "ON") begin + reg [PH_BITS - 1 : 0] addr_r0 = 0; + always @(posedge clk) begin + addr_r0 <= addr_r0 + phase_in; + end + always @(posedge clk) begin + Phase_input <= addr_r0; + end +end +else if (PHASE_ACC == "OFF") begin + always @(posedge clk) begin + Phase_input <= phase_in; + end +end +always @(posedge clk) begin + if(valid_in & (~RST)) begin + x[0] <= K_COS; + y[0] <= 0; + z[0] <= Phase_input[PH_BITS - 3 : 0]; + data_in_buff[0] <= Phase_input[PH_BITS - 1 : PH_BITS - 2]; + end + else begin + x[0] <= 0; + y[0] <= 0; + z[0] <= 0; + data_in_buff[0] <= 0; + end +end +reg signed [XY_BITS-1:0] cos = 0; +reg signed [XY_BITS-1:0] sin = 0; +always @ (posedge clk) begin + case(data_in_buff[ITERATIONS]) + 2'b00:begin //if the phase is in first quadrant,the sin(X)=sin(A),cos(X)=cos(A) + cos <= x[ITERATIONS]; + sin <= y[ITERATIONS]; + end + 2'b01:begin //if the phase is in second quadrant,the sin(X)=sin(A+90)=cosA,cos(X)=cos(A+90)=-sinA + cos <= ~(y[ITERATIONS]) + 1'b1;//-sin + sin <= x[ITERATIONS];//cos + end + 2'b10:begin //if the phase is in third quadrant,the sin(X)=sin(A+180)=-sinA,cos(X)=cos(A+180)=-cosA + cos <= ~(x[ITERATIONS]) + 1'b1;//-cos + sin <= ~(y[ITERATIONS]) + 1'b1;//-sin + end + 2'b11:begin //if the phase is in forth quadrant,the sin(X)=sin(A+270)=-cosA,cos(X)=cos(A+270)=sinA + cos <= y[ITERATIONS];//sin + sin <= ~(x[ITERATIONS]) + 1'b1;//-cos + end + endcase +end +assign x_o = cos; +assign y_o = sin; +assign phase_out = z[ITERATIONS]; +end +endgenerate + +generate if (CORDIC_STYLE == "VECTOR") begin : Demodule_Gen +localparam signed [PH_BITS-1:0] PHASE_COE = (2**(PH_BITS-2)) - 1; +//localparam MODUIUS_COE = ; +always @(posedge clk) begin + if(valid_in & (~RST)) begin + case ({x_i[XY_BITS-1],y_i[XY_BITS-1]}) + 2'b00 : begin x[0] <= {x_i[XY_BITS-1],x_i[XY_BITS-1:1]}; + y[0] <= {y_i[XY_BITS-1],y_i[XY_BITS-1:1]}; end + 2'b01 : begin x[0] <= {x_i[XY_BITS-1],x_i[XY_BITS-1:1]}; + y[0] <= {y_i[XY_BITS-1],y_i[XY_BITS-1:1]}; end + 2'b10 : begin x[0] <= {y_i[XY_BITS-1],y_i[XY_BITS-1:1]}; + y[0] <= -{x_i[XY_BITS-1],x_i[XY_BITS-1:1]}; end + 2'b11 : begin x[0] <= -{y_i[XY_BITS-1],y_i[XY_BITS-1:1]}; + y[0] <= {x_i[XY_BITS-1],x_i[XY_BITS-1:1]}; end + default : begin x[0] <= {x_i[XY_BITS-1],x_i[XY_BITS-1:1]}; + y[0] <= {y_i[XY_BITS-1],y_i[XY_BITS-1:1]}; end + endcase + z[0] <= phase_in; + data_in_buff[0] <= {x_i[XY_BITS-1],y_i[XY_BITS-1]}; + end + else begin + x[0] <= 0; + y[0] <= 0; + z[0] <= 0; + data_in_buff[0] <= 0; + end +end +reg [XY_BITS*2-1:0] Modulus = 0; +wire [XY_BITS*2-1:0] Modulus_buf; +reg signed [PH_BITS - 1:0] phase_r = 0; +always @ (posedge clk) begin + case(data_in_buff[ITERATIONS]) + 2'b00:begin phase_r <= $signed(z[ITERATIONS]); end + 2'b01:begin phase_r <= $signed(z[ITERATIONS]); end + 2'b10:begin phase_r <= $signed(z[ITERATIONS]) + $signed(PHASE_COE); end + 2'b11:begin phase_r <= $signed(z[ITERATIONS]) - $signed(PHASE_COE); end + endcase + Modulus[XY_BITS:0] <= x[ITERATIONS]; +end +assign Modulus_buf = (Modulus * 32'd39797)>>15; +assign x_o = Modulus_buf[XY_BITS-1:0]; +assign y_o = y[ITERATIONS]; +assign phase_out = phase_r; +end +endgenerate + +reg [ITERATIONS+1:0] v = 0; +always @ (posedge clk) begin + if (RST) + v <= 0; + else begin + v <= v << 1; + v[0] <= valid_in; + end +end +assign valid_out = v[ITERATIONS+1]; + +endmodule diff --git a/vlog/parse_test/instance_test.v b/vlog/parse_test/instance_test.v new file mode 100644 index 0000000..cea48e2 --- /dev/null +++ b/vlog/parse_test/instance_test.v @@ -0,0 +1,11 @@ +`include "./Cordic.v" +module instance_test ( + input input_a, + input input_b, + output output_c +); + + assign output_c = input_a & input_b; + + +endmodule \ No newline at end of file diff --git a/vlog/parse_test/mult_module.v b/vlog/parse_test/mult_module.v new file mode 100644 index 0000000..d202dd5 --- /dev/null +++ b/vlog/parse_test/mult_module.v @@ -0,0 +1,80 @@ +// template +module template #( + parameter INPUT_WIDTH = 12, + parameter OUTPUT_WIDTH = 12 + )( + input [INPUT_WIDTH + - 1 : 0]data_in, + output reg clk_in = (INPUT_WIDTH - + OUTPUT_WIDTH) , + clk=9'hd0, + input rst_n, RST, + output [OUTPUT_WIDTH - 1 : 0] data_out + ); + +endmodule //template + + +module test # ( + parameter INPUT_WIDTH = 12, + parameter OUTPUT_WIDTH = 12 + )( + input clk_in, + input rst_n, + input [INPUT_WIDTH - 1 : 0] data_in , + input [3:2] dasta_ff, + + output reg signed [OUTPUT_WIDTH - 1 : 0] data_out, + output reg signed [OUTPUT_WIDTH - 1 : 0] data_ff + ); + + wire valid_out; + + Cordic #( + .XY_BITS ( 12 ), + .PH_BITS ( 32 ), + .ITERATIONS ( 32 ), + .CORDIC_STYLE ( "ROTATE" ), + .PHASE_ACC ( "ON" )) + u_Cordic( + //input + .clk_in ( clk_in ), + .RST ( RST ), + .x_i ( x_i ), + .y_i ( y_i ), + .phase_in ( phase_in ), + .valid_in ( valid_in ), + + //output + .x_o ( x_o ), + .y_o ( y_o ), + .phase_out ( phase_out ), + .valid_out ( valid_out ) + + //inout + ); + + wire [3 : 0] count_high; + wire [3 : 0] count_low; + wire over; + + template u_template( + //input + .clk ( clk ), + .data ( data ), + .en ( en ), + .load ( load ), + .rst ( rst ), + .switch ( switch ), + + //output + .count_high ( count_high ), + .count_low ( count_low ), + .over ( over ) + + //inout + ); + + + +endmodule //test diff --git a/vlog/wavedrom_test/sample.v b/vlog/wavedrom_test/sample.v new file mode 100644 index 0000000..742e92c --- /dev/null +++ b/vlog/wavedrom_test/sample.v @@ -0,0 +1,35 @@ +module dependence_1 ( + input a, b, c, + output Q +); + + // a & b | ((b & c) & (b | c)) + // &=*, |=+ AB + BC(B+C) + // Distribute AB + BBC + BCC + // Simplify AA = A AB + BC + BC + // Simplify A + A = A AB + BC + // Factor B(A+C) + + assign Q = a & (b | c); + +endmodule + +`include "adwada" + +`define main dwwds +`define ada wss + +/* + +*/ + +`main + +module dependence_2 ( + input a, b, c, + output Q +); + + assign Q = a & b | ((b & c) & (b | c)); + +endmodule \ No newline at end of file